2. 进行纹理映射时发现纹理和颜色混合了,解决之道:
要屏蔽glcolor3f的影响,只需添加:
glColor3f(1.0, 1.0, 1.0 ); //使得下面正方体的纹理映射不受最下面的正方体和四面体中的glColor3f的影响3. opengl中进行纹理贴图时不显示贴图图片,调试时发现:
glGenTextures(6, &texture[i]);
glBindTexture(GL_TEXTURE_2D, texture[i]);
//绑定纹理图片后,发现texture数组始终为0,原因是加载纹理,调用glGenTextures之前应该完成opengl窗口
的初始化,即完成下面调用:
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(0, 0);
glutInitWindowSize(800, 600);
glutCreateWindow("Wander");
wander.load_GL_textures1(); //此时才能调用加载纹理函数,调用纹理载入子例程
1.
glFrontFace(GL_CCW); //指定逆时针为正面
glCullFace(GL_BACK); // 使得背面不可见
glEnable(GL_CULL_FACE);
2.
// 金字塔物体没进行纹理映射,所以此时不应该启用纹理映射,否则会看不到该物体
//glEnable(GL_TEXTURE_2D);
// 启用纹理映射,在要进行纹理映射的物体前启用纹理映射,绘制完物体后关闭纹理映射,若在所有绘制物体前启用,若某个物体未使用glTexCoord2f,则该物体将会看不见
3.
glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
glMatrixMode(GL_MODELVIEW); //设置模型观察矩阵,作用是用于在三维空间中确定物体的位置
glLoadIdentity(); //M=I,I为单位矩阵
glColor3f( 1.0f, 0.0f, 0.0f );
glBegin(GL_TRIANGLES);
glVertex3f( 0.0f, 2.0f, 0.0f);
glVertex3f( -1.0f, -1.0f, 0.0f);
glVertex3f( 1.0f, -1.0f, 0.0f);
glEnd();
glTranslatef( 1.0f, 3.0f, 0.0f);//x平移1个单位,y平移3个单位,z保证不变,对应的矩阵:
// 平移后,M=M*K=I*K,K为x平移1个单位,y平移3个单位,z保证不变的平移矩阵
//glRotatef(90.0f, 0.0f, 0.0f, 1.0f ); //逆时针旋转90度
glRotatef( -90.0f, 0.0f, 0.0f,1.0f ); //顺时针旋转90度
//旋转后,M=M*R=K*R,R为上面对应的选择矩阵
/*
K=
1 0 0 1
0 1 0 3
0 0 1 0
0 0 0 1
绕z轴旋转@度的旋转矩阵,R=
cos@ -sin@ 0 0
sin@ cos@ 0 0
0 0 1 0
0 0 0 1
@=-90代入之得:
0 1 0 0
-1 0 0 0
0 0 1 0
0 0 0 1
得M=
0 1 0 1
-1 0 0 3
0 0 1 0
0 0 0 1
然后把下面三个坐标的齐次坐标右乘M,即得最终的坐标位置,
P'= MP,P为原始坐标对应的齐次坐标,如第一个点(0.0,2.0,0.0)的齐次坐标为(0.0,2.0,0.0,1.0)
得到最终的三个坐标位置为:
A1 =
3
3
0
1
A2 =
0
4
0
1
A3 =
0
2
0
1
最终画出该三个点对应的三角形
*/
glColor3f(1.0f, 0.0f, 0.0f );
glBegin(GL_TRIANGLES);
glVertex3f(0.0f, 2.0f, 0.0f );
glVertex3f(-1.0f, -1.0f, 0.0f );
glVertex3f(1.0f, -1.0f, 0.0f );
glEnd();
结果如下:
注:OpenGL使用的是右乘
4. 纹理映射的图片尺寸最大不能超过256*256,最好用bmp图片
此图像的宽和高必须是2的n次方;宽度和高度最小必须是64象素;并且出于兼容性的原因,图像的宽度和高度不应超过256象素。如果您的原始素材的宽度和高度不是64,128,256象素的话,使用图像处理软件重新改变图像的大小。
我曾经说过有办法可以绕过OpenGL对纹理宽度和高度所加的限制——64、128、256,等等。办法就是 gluBuild2DMipmaps。据我的发现,您可以使用任意的位图来创建纹理。OpenGL将自动将它缩放到正常的大小。
gluBuild2DMipmaps(GL_TEXTURE_2D,3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB,GL_UNSIGNED_BYTE, TextureImage[0]->data);
注:好像只能加载bmp图片,不能是其他类型的图片
5.
/*
目的是为了重置模型观察矩阵。如果我们没有重置,直接调用glTranslate的话,会出现意料之外的结果。
因为坐标轴已经旋转了,很可能没有朝着您所希望的方向。所以我们本来想要左右移动对象的,
就可能变成上下移动了,取决于您将坐标轴旋转了多少角度。
*/
6. 默认视点位置:
视点默认的位置在(0,0,0)点,朝向是垂直屏幕向里(即Z轴负方向)。
你在绘制物体的时候注意把物体的Z坐标向后移几个单位就看见了。
视点默认不用改,要想改,可以通过设置glLookAt函数设置
7.
glGenTextures(3, &texture[0]); // 创建纹理 glGenTextures函数根据纹理参数返回n个纹理索引,&texture[0]存储纹理索引
// 创建 Nearest滤波贴图
/*
glBindTexture实际上是改变了OpenGL的这个状态,它告诉OpenGL下面对纹理的任何操作都是对它所绑定的纹理对象的,
比如glBindTexture(GL_TEXTURE_2D,1)告诉OpenGL下面代码中对2D纹理的任何设置都是针对索引为1的纹理的
*/
8. OpenGL不设置颜色,直接绘制四个顶点,得到的正方形,默认会为白色;
9.