OpenGL之模板缓冲区、片元操作之裁剪测试与alpha测试

1.1 模板缓冲
OpenGL之模板缓冲区、片元操作之裁剪测试与alpha测试_第1张图片

1.1.1 模板缓冲取到一个过滤的作用,而且绘制效率较高。

glEnable(GL_STENCIL_TEST);
  • 进行模板检测;
  • 更新模板缓冲;
void glStencilFunc(GLenum func ,GLint ref,GLUint mask);
  • ref值和当前屏幕上的像素所对应的模板缓冲中的值进行比较;
  • 模板缓冲中的值是在第一遍绘制时画入模板缓冲的;
  • mask值:在比较前,ref和模板值都会与mask进行and操作;通过mask就可以指定好几个模板缓冲;mask值可以控制ref和模板的哪一位进行比较操作。
void glStencilOp(GLenum fail,GLenum zfail,GLenum zpass);
  • 设定如何更新模板缓冲;
  • fail:片元没有通过模板检测时所执行的操作;
  • zfail:片元通过了模板测试,但没有通过深度检测时所执行的操作;
  • zpass:模板检测和深度检测都通过,或没有执行深度测试时所执行的操作。
  • 更新方式:GL_KEEP、GL_ZERO、GL_REPLACE、GL_INCR、GL_DECR、GL_INVERT;
    • GL_REPLACE:用glStenciFunc()函数中所指定的参考值ref替换模板参数值;

1.1.2 小结

  • 使用glEnable(GL_STENCIL_TEST)启用模板测试之后,模板函数用于确定一个颜色片段是应该丢弃还是保留(被绘制);
  • 模板缓存区中的值与参考值ref进行比较,比较标准是func所指定的比较函数;
  • 参考值和模板缓冲区的值都可以与掩码(mask)进行逐位AND操作;
  • 模板测试的结果还将导致模板缓冲区根据glStencilOp()函数所指定的行为进行修改。

1.1.3 绘制一个菱形模板缓冲
绘制的结果是0x1,而非菱形区域保持原样不动;

glClearStencil(0x0);
glClear(GL_STENCIL_BUFFER_BIT);
glStencilFunc(GL_ALWAYS,0x1,0x1);
glStencilOp(GL_REPLACE,GL_REPLACE,REPLACE);
glBegin(GL_QUADS);
	glVertex2f(-1.0,0.0);
	glVertex2f(0.0,1.0);
	glVertex2f(1.0,0.0);
	glVertex2f(0.0,-1.0);
glEnd();

如下为通过模板缓冲实现的效果。
OpenGL之模板缓冲区、片元操作之裁剪测试与alpha测试_第2张图片

  • 一般需要首先绘制得到模板缓冲,然后再正式开始绘制场景,即多遍绘制的思想;
  • 画场景时,其实是同时画了color buffer,depth buffer和stencil buffer;

2.1 片元操作

2.1.1 片元与像素的关系
在绘制成像素之前的为片元,一个像素的颜色可能由多个片元决定。
OpenGL之模板缓冲区、片元操作之裁剪测试与alpha测试_第3张图片
2.1.2 片元的写入帧缓冲之前要按照顺序经历一系列的测试,写入帧缓冲时也会经历一些运算。经历的操作顺序如下,如果片元在某个测试中被排除,后面的测试或操作都将不会进行。

写入帧缓冲前的操作,需要跟当前帧缓冲的值进行比较:

  • 裁剪测试;
  • alpha测试;
  • 模板测试;
  • 深度测试;

写入帧缓冲时的操作:

  • 混合
  • 抖动;
  • 逻辑操作;

2.1.3 裁剪测试

//定义了一个矩形区域,只在这个矩形区域内的才会被绘制,比模板缓冲效率高;
void glScissor(GLint x,GLint y,GLsizei width,GLsizei height);
glEnable(GL_SCISSOR_TEST);

2.1.4 Alpha测试

片元的alpha值在颜色缓冲区中,可以使用glcolor函数指定,也可以通过一幅纹理来指定。

glEnable(GL_ALPHA_TEST);
void glAlphaFunc(GLenum func,GLclampf ref);

//func的值为:GL_NEVER,GL_LESS,GL_LEQUAL,GL_EQUAL,GL_GREATER,GL_NOTEQUAL,GL_GEQUAL,GL_AWAYS;

如下,Alpha测试可以对树周围进行镂空,但是,alpha测试在OpenGL3.1中被废弃掉了,可以在shader中通过discard简单的来实现,OpenGL是向下兼容的,因此在固定流水线中,alpha仍然能使用。
OpenGL之模板缓冲区、片元操作之裁剪测试与alpha测试_第4张图片

你可能感兴趣的:(OpenGL,图形渲染,OpenGL)