导航:首页 > 源码编译 > opengl红宝书源码

opengl红宝书源码

发布时间:2022-02-13 04:47:45

⑴ openGL如何给一个球体纹理贴图,并且当求转动的时候,纹理要随着球一起转动,要c++的详细代码,重谢!

/*
*Copyright(c)1993-1997,SiliconGraphics,Inc.
*ALLRIGHTSRESERVED
*Permissiontouse,,modify,anddistributethissoftwarefor
*,providedthattheabove
*
*,andthat
*thenameofSiliconGraphics,Inc.notbeusedinadvertising
*,
*writtenpriorpermission.
*
*"AS-IS"
*ANDWITHOUTWARRANTYOFANYKIND,EXPRESS,IMPLIEDOROTHERWISE,
*INCLUDINGWITHOUTLIMITATION,
*FITNESSFORAPARTICULARPURPOSE.INNOEVENTSHALLSILICON
*GRAPHICS,INC.,
*SPECIAL,INCIDENTAL,
*KIND,ORANYDAMAGESWHATSOEVER,INCLUDINGWITHOUTLIMITATION,
*LOSSOFPROFIT,LOSSOFUSE,SAVINGSORREVENUE,ORTHECLAIMSOF
*THIRDPARTIES,WHETHERORNOTSILICONGRAPHICS,INC.HASBEEN
*,HOWEVERCAUSEDANDON
*ANYTHEORYOFLIABILITY,
*POSSESSION,.
*
*
*Use,plication,
*restrictionssetforthinFAR52.227.19(c)(2)orsubparagraph
*(c)(1)(ii)
*clauseatDFARS252.227-7013and/orinsimilarorsuccessor
*.
*Unpublished--
*UnitedStates.Contractor/manufacturerisSiliconGraphics,
*Inc.,2011N.ShorelineBlvd.,MountainView,CA94039-7311.
*
*OpenGL(R),Inc.
*/

#include<GL/glut.h>
#include<stdlib.h>
#include<stdio.h>

#definestripeImageWidth32
GLubytestripeImage[4*stripeImageWidth];

#ifdefGL_VERSION_1_1
staticGLuinttexName;
#endif

voidmakeStripeImage(void)
{
intj;

for(j=0;j<stripeImageWidth;j++){
stripeImage[4*j]=(GLubyte)((j<=4)?255:0);
stripeImage[4*j+1]=(GLubyte)((j>4)?255:0);
stripeImage[4*j+2]=(GLubyte)0;
stripeImage[4*j+3]=(GLubyte)255;
}
}

/**/
staticGLfloatxequalzero[]={1.0,0.0,0.0,0.0};
staticGLfloatslanted[]={1.0,1.0,1.0,0.0};
staticGLfloat*currentCoeff;
staticGLenumcurrentPlane;
staticGLintcurrentGenMode;
staticfloatroangles;

voidinit(void)
{
glClearColor(0.0,0.0,0.0,0.0);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);

makeStripeImage();
glPixelStorei(GL_UNPACK_ALIGNMENT,1);

#ifdefGL_VERSION_1_1
glGenTextures(1,&texName);
glBindTexture(GL_TEXTURE_1D,texName);
#endif
glTexParameteri(GL_TEXTURE_1D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameteri(GL_TEXTURE_1D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_1D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
#ifdefGL_VERSION_1_1
glTexImage1D(GL_TEXTURE_1D,0,GL_RGBA,stripeImageWidth,0,
GL_RGBA,GL_UNSIGNED_BYTE,stripeImage);
#else
glTexImage1D(GL_TEXTURE_1D,0,4,stripeImageWidth,0,
GL_RGBA,GL_UNSIGNED_BYTE,stripeImage);
#endif

glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
currentCoeff=xequalzero;
currentGenMode=GL_OBJECT_LINEAR;
currentPlane=GL_OBJECT_PLANE;
glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,currentGenMode);
glTexGenfv(GL_S,currentPlane,currentCoeff);

glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_1D);
//glEnable(GL_CULL_FACE);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_AUTO_NORMAL);
glEnable(GL_NORMALIZE);
glFrontFace(GL_CW);
//glCullFace(GL_BACK);
glMaterialf(GL_FRONT,GL_SHININESS,64.0);
roangles=45.0f;
}

voiddisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

glPushMatrix();
glRotatef(roangles,0.0,0.0,1.0);
#ifdefGL_VERSION_1_1
glBindTexture(GL_TEXTURE_1D,texName);
#endif
//glutSolidTeapot(2.0);
glutSolidSphere(2.0,32,32);
glPopMatrix();
glFlush();
}

voidreshape(intw,inth)
{
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w<=h)
glOrtho(-3.5,3.5,-3.5*(GLfloat)h/(GLfloat)w,
3.5*(GLfloat)h/(GLfloat)w,-3.5,3.5);
else
glOrtho(-3.5*(GLfloat)w/(GLfloat)h,
3.5*(GLfloat)w/(GLfloat)h,-3.5,3.5,-3.5,3.5);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

voididle()
{
roangles+=0.1f;
glutPostRedisplay();
}
intmain(intargc,char**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);
glutInitWindowSize(256,256);
glutInitWindowPosition(100,100);
glutCreateWindow(argv[0]);
glutIdleFunc(idle);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);

glutMainLoop();
return0;
}

这是OpenGL红宝书的例子,稍作改动,以显示球体转动时纹理是跟着动地。还有原来例子画的是Teapot.。。。

⑵ 用OpenGL和C/C++制作的3D图形用户界面

OpenGL有红宝书和蓝宝书,网上能搜索到。网站就是NEHE的教程了。你搜索OPENGL NeHe就能找到。
OpenGL是C/C++的图形库,也是C/C++语言了。Oracle与OCI技术是与C/C++的数据库编程的接口。

实战OpenGL三维可视化系统开发与源码精解:包括第1章三维图形世界、第2章OpenGL概述和第3章Oracle与OCI技术及编程基础。

⑶ openGL 程序运行后窗口里面没东西,已经不止一次了。下面是代码,求解答。

先来回答你的问题。

无法显示的原因,投影设置的视见体没有将你定义的矩形模型包括在内。

直观来讲,你可以将gluOrtho2D试着调整为:

gluOrtho2D(-100,300.0,-100,300.0);同时设置背景为黑色,则得到效果:



进步一解释:


OpenGL中图形成像依赖于你定义的模型,比如你设置的4个position1
量以及投影时设置的投影参数,比如你用的gluOrtho2D。

你的代码中模型和投影参数设置都不是很理想,使用gluOrtho2D设置的正交投影裁剪平面的范围

(0,40.0,30.0,150.0);没有将你要显示的矩形模型包括在显示区域内,因此无法渲染。

注意设置适当的参数,这是初学者需要耐心学习的。你的代码看起来很混乱,最好采用一本适当教材(红宝书),或者跟着一个教程(搜索 OpenGL tutorial)实际动手学习。

对于这个例子,同时思考:为什么是三角形而不是矩形?

为什么我之前的图形没有显示出来?

⑷ 初学者学习opengl是用红宝书好还是蓝宝书好

听同学推荐考研英语可以用红宝书和蓝宝书,比较靠谱,确实很好用,性价比超好。

⑸ OpenGL编程指南第八版VS2015怎么配置

一、环境搭建指南

书中的地址

http://www.opengl-redbook.com/

去这里打包下载OpenGL红宝书的示例代码,解压后是这样

虽然没有第一章的代码但第一章的内容好歹算一个完整的例子,网上各种环境搭建教程也都以第一章的代码为例,我们就拿过来直接用一下。

1、打开VS2015创建一个空的控制台项目,然后新建一个cpp文件,粘贴红宝书第一章的示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80

///////////////////////////////////////////////////////////////////////
//
// triangles.cpp
//
///////////////////////////////////////////////////////////////////////
#include <iostream>
using namespace std;
#include "vgl.h"
#include "LoadShaders.h"
enum VAO_IDs { Triangles, NumVAOs };
enum Buffer_IDs { ArrayBuffer, NumBuffers };
enum Attrib_IDs { vPosition = 0 };
GLuint VAOs[NumVAOs];
GLuint Buffers[NumBuffers];
const GLuint NumVertices = 6;
//---------------------------------------------------------------------
//
// init
//
void init(void)
{
glGenVertexArrays(NumVAOs, VAOs);
glBindVertexArray(VAOs[Triangles]);
GLfloat vertices[NumVertices][2] = {
{ -0.90, -0.90 }, // Triangle 1
{ 0.85, -0.90 },
{ -0.90, 0.85 },
{ 0.90, -0.85 }, // Triangle 2
{ 0.90, 0.90 },
{ -0.85, 0.90 }
};
glGenBuffers(NumBuffers, Buffers);
glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices),
vertices, GL_STATIC_DRAW);
ShaderInfo shaders[] = {
{ GL_VERTEX_SHADER, "triangles.vert" },
{ GL_FRAGMENT_SHADER, "triangles.frag" },
{ GL_NONE, NULL }
};
GLuint program = LoadShaders(shaders);
glUseProgram(program);
glVertexAttribPointer(vPosition, 2, GL_FLOAT,
GL_FALSE, 0, BUFFER_OFFSET(0));
glEnableVertexAttribArray(vPosition);
}
//---------------------------------------------------------------------
//
// display
//
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glBindVertexArray(VAOs[Triangles]);
glDrawArrays(GL_TRIANGLES, 0, NumVertices);
glFlush();
}

//---------------------------------------------------------------------
//
// main
//
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA);
glutInitWindowSize(512, 512);
glutInitContextVersion(4, 3);
glutInitContextProfile(GLUT_CORE_PROFILE);
glutCreateWindow(argv[0]);

glewExperimental = GL_TRUE;
if (glewInit()) {
cerr << "Unable to initialize GLEW ... exiting" << endl;
exit(EXIT_FAILURE);
}
init();
glutDisplayFunc(display);
glutMainLoop();
}

2、打开项目属性,在“VC++ Directories”选项卡中,将前面下载回来的红宝书示例代码中的include目录加入“Include Directories”,将lib目录加入“Library Directories”

3、打开项目属性,在“General”选项卡中,将“Platform Toolset”设置为VS2013

4、在项目管理器中右击Source Files的Filter,添加现有项,然后找到红宝书源码目录中的lib目录,添加LoadShaders.cpp文件

5、打开项目属性,在“Linker/Input”选项卡中,在“Ignore Specific Default Libraries”中添加libcmtd.lib

6、在项目目录中新建两个文本分别命名为triangles.vert和triangles.frag,也就是我们的顶点着色器和片段着色器啦

triangles.vert

1
2
3
4
5
6
7

#version 430 core
layout(location = 0) in vec4 vPosition;
void
main()
{
gl_Position = vPosition;
}

triangles.frag

1
2
3
4
5
6
7

#version 430 core
out vec4 fColor;
void
main()
{
fColor = vec4(0.0, 0.0, 1.0, 1.0);
}

7、编译,运行,搞定

二、所以然

1、关于第一步

这里的示例代码其实比书中的多了一句

glewExperimental = GL_TRUE;

书里的代码用到了GLEW库,GLEW可以跨平台支持OpenGL高级扩展特性,没有GLEW的话在Win平台是无法使用4.3的那些功能的。这句
代码是GLEW所有扩展的一个开关,需要在glewInit()之前执行。如果没有这一句,编译是可以通过的,但在运行时会崩溃。

2、关于第二步

主要目的是将示例代码中用到的GLUT和GLEW库的头文件和库文件引入项目目录。这一步没设置好的话编译无法通过,现象一般是无法打开freeglut相关库文件或者某些函数没有声明。

网上有些教程让你自己去下载并编译freeglut和glew,然后拷贝到各种系统目录和VS的目录,其实没用。所有用到的头文件和库文件在第八版示例代码include和lib目录中都有了,你只要正确引入项目中就不会有问题。

3、关于第三步

只有VS2015需要这一步

VS2015更改了很多标准库的链接方式和宏定义,而红宝书第八版中用到的freeglut库中用到了这些标准库和宏。所以如果报_sscanf或者__iob_func是无法解析的外部符号之类的错误,只需要把平台工具集改成旧的就行了。

4、关于第四步

没有这一项,LoadShaders中定义的函数会报无法解析的外部符号错误。

5、关于第五步

如果不忽略这个默认库,会报库冲突或者无法打开库文件的错误。

6、关于第六步

没着色器画个卵,运行漆黑一片。

7、双显卡电脑又躺枪了

我折腾了半天运行CMD显示Unable to create OpenGL 4.3 context,尼玛双显卡电脑默认用核心显卡启动应用。打开NVidia控制面板-管理3D设置-全局设置-首选图形处理器,把独显设为默认就OK了。
http://www.cnblogs.com/gagugagu/p/5211452.html

⑹ 如何运行opengl红宝书中的源码,傻瓜版

如何运行opengl红宝书中的源码
一、安装GLUT工具包
1下载OpenGL需要的库文件 ,一般可以选择下载glut库(内含所有必须文件)

2解压后将得到的glut.lib和glut32.lib这两个静态函数库复制到文件目录的lib文件夹
X:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib

3将glut.dll,glut32.dll这两个动态库文件放到操作系统目录下面的C:\Windows\system32文件夹内(32位系统)或‪C:\Windows\SysWOW64(64位系统)。
为了兼容性考虑,最好在这两个目录下都复制相应的文件。

4将解压得到的头文件glut.h复制到目录如下目录下:
X:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\GL
提示:如果在incluce目录下没有GL文件夹,则需要手动创建

二、VS2013中的配置
创建一个空白的Win32控制台应用程序
在代码最前面添加包含目录
#include <GL/glut.h>
然后就可以编辑自己的OpenGL程序了
例如:复制如下代码到刚配置好的VS中
#include <GL/glut.h>
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
static int year = 0,spin=0, day = 0;
static GLint fogMode;
const int n = 100;
const GLfloat R = 1.0f;
const GLfloat Pi = 3.1415926536f;
void DrawCircle()
{
int i;
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_LINE_LOOP);
for (i = 0; i < n; ++i)
{
glColor3f(1.0, 0.0, 0.0);
glVertex2f(R*cos(2 * Pi / n*i), R*sin(2 * Pi / n*i));
}
glEnd();
glFlush();
}
void init(void)
{
GLfloat position[] = { 0.5, 0.5, 3.0, 0.0 };
glEnable(GL_DEPTH_TEST); //防止遮挡
glLightfv(GL_LIGHT0, GL_POSITION, position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
{
GLfloat mat[3] = { 0.1745, 0.01175, 0.01175 };
glMaterialfv(GL_FRONT, GL_AMBIENT, mat);
mat[0] = 0.61424; mat[1] = 0.04136; mat[2] = 0.04136;
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat);
mat[0] = 0.727811; mat[1] = 0.626959; mat[2] = 0.626959;
glMaterialfv(GL_FRONT, GL_SPECULAR, mat);
glMaterialf(GL_FRONT, GL_SHININESS, 0.6*128.0);
}
glEnable(GL_FOG);
{
GLfloat fogColor[4] = { 0.5, 0.5, 0.5, 1.0 };
fogMode = GL_EXP;
glFogi(GL_FOG_MODE, fogMode);
glFogfv(GL_FOG_COLOR, fogColor);
glFogf(GL_FOG_DENSITY, 0.35);
glHint(GL_FOG_HINT, GL_DONT_CARE);
glFogf(GL_FOG_START, 1.0);
glFogf(GL_FOG_END, 5.0);
}
glClearColor(0.5, 0.9, 0.9, 1.0); /* fog color */
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(0.0, 1.0, 1.0);
glPushMatrix(); //记住自己的位置
glutSolidSphere(1.0, 20, 16); /* 画太阳半径、 20经度、16纬度*/
glRotatef(spin, 0.0, 1.0, 0.0); //自转,绕着一个向量以给定角度旋转(正的为逆时针)
glTranslatef(2.0, 1.0, 0.0);
glRotatef(spin, 1.0, 0.0, 0.0); //公转
glRectf(0.1,0.1,0.5,0.5);
glColor3f(0.0, 0.0, 1.0);
glutWireSphere(0.2, 8, 8); /* 画第一颗小行星 */
glColor3f(1.0, 0.0, 0.0);
glTranslatef(2.0, 1.0, 0.0);
glRotatef(2 * spin, 0.0, 1.0, 0.0);
glutSolidSphere(0.5, 16, 8);
glPopMatrix();//回到原来的位置
glutSwapBuffers();
}
void spinDisplay(void)
{
spin = spin + 2;
if (spin > 360)
spin = spin - 360;
glutPostRedisplay();
}
void mouse(int button,int state,int x,int y )
{
switch (button)
{
case GLUT_LEFT_BUTTON:
if (state == GLUT_DOWN)
glutIdleFunc(spinDisplay);
break;
case GLUT_MIDDLE_BUTTON:
if (state == GLUT_DOWN)
glutIdleFunc(NULL);
break;
default:
break;
}
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 0.5, 20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0, 10.0, 10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}
void keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 'd':
day = (day + 10) % 360;
glutPostRedisplay();
break;
case 'D':
day = (day - 10) % 360;
glutPostRedisplay();
break;
case 'y':
year = (year + 5) % 360;
glutPostRedisplay();
break;
case 'Y':
year = (year - 5) % 360;
glutPostRedisplay();
break;
case 27:
exit(0);
break;
default:
break;
}
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(400, 400);
glutInitWindowPosition(100, 100);
glutCreateWindow("OpengGL 程序设计--杨超");
init();
//glutDisplayFunc(DrawCircle);
glutDisplayFunc(display);
glutReshapeFunc(reshape);
//glutKeyboardFunc(keyboard);
glutMouseFunc(mouse);
glutMainLoop();
return 0;
}

5编译后能正确运行说明配置成功!

⑺ OpenGL编程大概要学多久谁有好的书推荐

看你心情咯,主要都是一些函数的学习,如果有计算机图形学基础,应该不是很难。推荐的话,当然是OpenGL红宝书,《OpenGL编程指南》咯,网上有很多电子书下,包括书上源码。

⑻ OPENGL红宝书英文第八版第一个小程序我敲出来了出错,谁看看#include "stdafx.h" #include <iostream>

你把库文件和编译环境都设置到32位下试一试,不要用64位编译

⑼ 用c openGL绘制贝塞尔曲面的源代码

这个问题我以前回答过。。。

红宝书的例子,稍作改动。。。

UTAH 茶壶的数据。。。好像控制点有点问题,你自己检查一下吧


⑽ 初学者学习opengl是用红宝书好还是蓝宝书好

蓝宝书,蓝宝书比较适合初学者,最好是看英文原版的,毕竟翻译过来的不太好。红宝书的话,等你有了一定的经验再来看。

阅读全文

与opengl红宝书源码相关的资料

热点内容
全新云服务器价格对比 浏览:383
python为什么去除了switch语句 浏览:54
二进制7到8的算法 浏览:807
服务器机柜叫什么名字 浏览:345
vue3源码作者 浏览:828
app右下角标怎么关 浏览:831
怎么对一个盘加密码 浏览:670
练习sql用什么样的服务器 浏览:978
asp与php对比 浏览:643
php模除 浏览:254
android上传图片方式 浏览:885
华为视频会议服务器如何连接 浏览:224
phpfpm并发数 浏览:925
云服务器哪里看 浏览:244
戴尔emc服务器led怎么拔出 浏览:794
程序员霸王 浏览:371
文件夹重合如何分开 浏览:163
mdk3命令 浏览:502
我的世界服务器云地址是什么 浏览:755
往复压缩机气缸 浏览:248