DrawGeometry函数绘制了场景中的所有几何图元。在RenderScene中反复调用这个函数,并把结果累积到累积缓冲区中。在最后,拷贝回到颜色缓冲区,然后glutSwapBuffers显示到屏幕上:
其他颜色操作 颜色掩码在计算后的最终颜色将要写入到颜色缓冲区时,OpenGL允许你通过glColorMask函数来屏蔽掉其中的一个或多个通道值。
void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
参数分别代表红、绿、蓝、alpha通道。当传的参数是GL_TRUE时,表示允许往这个通道的写值,如果为GL_FALSE则阻止往该通道写值。
颜色逻辑操作许多2D的图形API允许源颜色和目的颜色进行逻辑操作。OpenGL也支持这种操作:
void glLogicOp(GLenum op);
还需要通过glEnable(GL_COLOR_LOGIC_OP);来开启。OpenGL在默认情况下是关闭的。关闭操作是相应的glDisable
op允许的操作如下表:
参数值 操作GL_CLEAR 0
GL_AND s & d
GL_AND_REVERSE s & ~d
GL_COPY s
GL_AND_INVERTED ~s & d
NOOP d
XOR s xor d
OR s | d
NOR ~(s | d)
GL_EQUIV ~(s xor d)
GL_OR_REVERSE s | ~d
GL_COPY_INVERTED ~s
GL_OR_INVERTED ~s | d
GL_NAND ~(s & d)
SET all 1s
Alpha 测试
Alpha测试允许你告诉OpenGL那些在Alpha测试不通过的输入片段将被废弃。那些被废弃的片段不会写入到颜色缓冲区,深度缓冲区,模板缓冲区和累积缓冲区中。那些alpha值很低的片段可能是不可见的,因此我们可以过滤掉它,不写入到缓冲区中,可以提高性能。
alpha测试值和比较函数可以通过glAlphaFunc指定:
void glAlphaFunc(GLenum func, GLclampf ref);
ref的取值范围为[0.0, 1.0].可以指定的比较方式如下表:
比较方式 描述GL_NEVER 永远不通过
GL_ALWAYS 一直通过
GL_LESS 小于ref
GL_LEQUAL 小于等于ref
GL_EQUAL 等于ref
GL_GEQUAL 大于等于ref
GL_GREATER 大于ref
GL_NOTEQUAL 不等于ref
行为与glDepthFunc函数相似。可以通过glEnable/glDisable来开启和关闭alpha测试,参数值是GL_ALPHA_TEST。
抖动抖动允许只有少量离散颜色的显示系统来模拟更宽范围的颜色。例如,灰色可以通过白点和黑点的混合来模拟。白点多于黑点呈现浅灰色,黑点多于白点呈现深灰色。这种技巧对于只支持8位和16位的显示系统非常有用。抖动的效果可以大幅度地改善低端颜色系统的图像质量。在默认情况下,抖动是打开的。可以通过glEnable(GL_DITHER)/glDisable(GL_DITHER)来打开或关闭它。在高颜色分辨率的显示系统中,OpenGL的实现可能不需要抖动,会禁用抖动来避免性能的开销。
OpenGL超级宝典 第4版 中文版PDF+英文版+源代码 见
Ubuntu 13.04 安装 OpenGL