OpenGL 点滴积累
上学期自学的OpenGL 相当于是废了,看完总是忘,理解太肤浅。看来是缺少练习和思考的原因。
因此,现在把遇到的一些OpenGL相关的知识记录一下,当做一次整理思路的过程。是时候得好好学习了啊!!
1. 视点问题:
默认视点在世界坐标系的原点,故需设置视点或者向-z方法移动物体,否则将看不到。如下:
//设置视点 gluLookAt(0.0,0.0,5.0, 0.0,0.0,-1.0, 0.0f,1.0f,0.0f); //或 移动坐标轴 glTranslatef(0,0,-5);
gluLookAt ()函数:
2. 光照: glEnable(GL_LIGHT)
3. 光栅化:glShadeModel(); 参数:GL_SMOOTH(默认)、GL_FLAT
作用:指定光栅化阶段(Rasterization)顶点之间 像素的颜色是插值(GL_SMOOTH)获得渐变色还是就近(GL_FLAT)获得单一色。
举例:相同的顶点放置及颜色代码:
glBegin(GL_QUAD_STRIP); glColor3f(1.0f,0.0,0.0f);//R glVertex2f(-1.0f,0.0f); glVertex2f(-1.0f,1.0f); glColor3f(0.0f,1.0f,0.0f);//G glVertex2f(0.0f,0.0f); glVertex2f(0.0f,1.0f); glColor3f(0.0f,0.0f,1.0f);//B glVertex2f(1.0f,0.0f); glVertex2f(1.0f,1.0f); glEnd();
a. 若使用glShadeModel(GL_FLAT);则效果:
b. 若使用glShadeModel(GL_SMOOTH);则效果:
4. OpenGL 基本图元 一篇文章:http://blog.csdn.net/feijj2002_/article/details/466987
其中对于GL_QUADS_STRIP ,给的示例图有误,正确的应见:http://hi.baidu.com/%E1%B0%B7%E7%D0%F1/blog/item/5cb71fff3a655ec2f3d385fe.html
5. GL_CULL_FACE 消隐处理
6. 使用OpenGL 的 GL_ELEMENT_ARRAY_BUFFER , 索引数组的类型必须是 unsigned int \ unsigned short \ unsigned byte 三种之一,对应在glDrawElements
,如使用int等,则无法绘制。
void init() { VBOBuffers.resize(2, 0); // 成员变量 vector<unsigned int> VBOBuffers; glGenBuffers(2, VBOBuffers.data()); // 一个顶点对象,一个索引对象 glBindBuffer(GL_ARRAY_BUFFER, VBOBuffers[0]); // 顶点对象 glBufferData(GL_ARRAY_BUFFER, nodes.size() * 3 * sizeof(float), nodes.data(), GL_STATIC_DRAW); glVertexPointer(3, GL_FLOAT, 0, (GLvoid*) NULL); glEnableClientState(GL_VERTEX_ARRAY); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, VBOBuffers[1]); // 索引对象 glBufferData(GL_ELEMENT_ARRAY_BUFFER, faceNumber * sizeof(unsigned int), elementBufferLineIndex.data(), GL_STATIC_DRAW); //注意:顶点索引数组的类型必须是unsinged的,否则无法显示 } void paint() { glEnableClientState(GL_VERTEX_ARRAY); glDrawElements(GL_LINES, faceNumber, GL_UNSIGNED_INT, (GLvoid*)NULL); // GL中对应的unsigned类型宏定义 GL_UNSIGNED_BYTE\GL_UNSIGNED_SHORT }
7. 纹理
使用
GLint size[2]; glGetIntegerv(GL_MAX_TEXTURE_SIZE, size); //查看当前GT9800 显卡支持的纹理图像的最大宽度为 8192, 最大高度为 3367440 。