OpenGL几何图元与缓冲区

来源:互联网 发布:mysql 当前时间减30秒 编辑:程序博客网 时间:2024/04/28 05:58

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

0 0
原创粉丝点击