OpenGL几何图元与缓冲区
OpenGL几何图元与缓冲区
顶点:glVertex,有三种形式(x, y, 1),(x, y, z),(x, y, z, w)。设置点的大小glPointsize,获得受支持的点的大小范围与增量大小。
GLfloat sizes[2];
GLfloat step;
glGetFloatv(GL_POINT_SIZE_RANGE, size);
glGetFloatv(GL_POINT_SIZE_GRANULARITY, &step);
直线
glBegin(GL_LINES);
glVertex3f(x0, y0, z0);
glVertex3f(x1, y1, z1);
glEnd();
glBegin(GL_LINE_STRIP);
glVertex3f(x0, y0, z0);
...
glEnd();
glBegin(GL_LINR_LOOP);
...
glEnd();
//设置直线宽度
void glLineWidth(GLfloat width);
//获得所支持的直线的宽度范围与增量
GLfloat widthRange[2];
GLfloat step;
glGetFloatv(GL_LINE_WIDTH_RANGE, widthRange);
glGetFloatv(GL_LINE_WIDTH_GRANULARITY, &step);
//点画直线
glEnable(GL_LINE_STIPPLE);
void glLineStipple(GLint factor, GLushort pattern);
三角形
glBegin(GL_TRIANGLES);
...
glEnd();
glBegin(GL_TRIANGLE_STRIP);
...
glEnd();
glBegin(GL_TRIANGLE_FAN);
...
glEnd();
//单调着色,用当前颜色(多边形最后一个顶点的颜色)填充这个多边形
glShadeModel(GL_FLAT);
//渐变着色,根据每个顶点对三角形进行渐变着色,对相邻顶点的颜色进行均和
glShadeModel(GL_SMOOTH);
//启动深度测试
glEnable(GL_DEPTH_TEST);
//禁用深度测试
glDisable(GL_DEPTH_TEST);
//清除颜色缓冲与深度缓冲区
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
顶点的指定次序以及方向的组合称为环绕,可以通过环绕方向确定多边形所显示的是正面还是反面。在默认情况下,OpenGL认为逆时针方向环绕的一面是多边形的正面。可以使用函数glFrontFace(GL_CW)设置顺时针环绕方向的多边形表示的是正面,glFrontFace(GL_CCW)可以恢复到默认状态。
glPolygonMode设置多边形作为实心图形、外框、或者点进行渲染。
四边形
glBegin(GL_QUADS);
......
glEnd();
glBegin(GL_QUDA_STRIP);
.....
glEnd();
多边形
glBegin(GL_POLYGON);
....
glEnd();
使用多边形创建一个复杂的表面时,需要记住两个重要的规则。第一个规则是所有的多边形都必须是平面的(每个多边形的所有顶点都必须位于同一个平面中);第二个规则是多边形的边必须不相交,并且多边形必须是凸的。
OpenGL并不是直接在屏幕上渲染图元的,而是在一个缓冲区中完成渲染,然后在把渲染结果交换到屏幕上,这两个缓冲区称为前颜色缓冲区(屏幕)和后颜色缓冲区。在默认情况下,OpenGL命令是在后缓冲区进行渲染的,并且调用glutSwapBuffers(或者操作系统特定的缓冲区交换函数)函数时,前后缓冲区就会进行交换,从而看到渲染效果。指定缓冲区进行渲染,如:glDrawBuffer(GL_FRONT)、glDrawBuffer(GL_BACK)。深度缓冲区请求GLUT_DEPTH,glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH)。
glEnable(GL_SCISSOR_TEST),glScissor指定裁剪框进行渲染,让渲染只在这个区域进行。
请求模板缓冲区glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_STENCIL),打开模板操作glEnable(GL_STENCIL_TEST),打开了模板测试后,绘图只能在那些通过了模板测试的位置进行,模板测试函数void glStencilTest(GLenum func, GLint ref, GLuint mask);
参考资料
1. OpenGL SuperBible