目录
一、顺序
二、模板测试
1、概念
2、工作原理
3、关键函数
三、深度测试
1、概念
2、工作原理
3、关键函数
三、模板测试和深度测试的先后顺序
一、顺序
在Android OpenGL中,模板测试(Stencil Testing)是在深度测试(Depth Testing)之前执行的。
二、模板测试
1、概念
模板测试是一种用于控制像素绘制的方式。它允许开发者根据模板缓冲区(Stencil Buffer)中的值来决定是否绘制某个像素。模板测试通常用于实现一些高级的图形效果,如阴影、反射、折射、物体轮廓描边等。
2、工作原理
当片段着色器处理完片段之后,模板测试就开始执行。它会将设定的模板参考值与片段对应位置的模板值进行比较,符合条件的片段通过测试,不符合条件的则被丢弃,不进行渲染。
3、关键函数
-
glEnable(GL_STENCIL_TEST)
:启用模板测试。 -
glStencilFunc(GLenum func, GLint ref, GLuint mask)
:设置模板测试函数。该函数决定了模板测试通过的条件。其中,func
是测试函数,ref
是参考值,mask
是掩码,用于在比较前对模板值和参考值进行按位与运算。 -
glStencilOp(GLenum sfail, GLenum dpfail, GLenum dppass)
:设置模板测试通过或失败时的操作。其中,sfail
是模板测试失败时的操作,dpfail
是模板测试通过但深度测试失败时的操作,dppass
是模板测试和深度测试都通过时的操作。
三、深度测试
1、概念
深度测试是指在片段着色器执行之后,利用深度缓冲所保存的深度值决定当前片段是否被丢弃的过程。它用于确定哪个物体在另一个物体的前面,从而正确地渲染场景。
2、工作原理
深度缓冲区通常和颜色缓冲区有着相同的宽度和高度,存储着每个像素的深度值。当深度测试开启时,OpenGL会比较当前片段的深度值与深度缓冲区中的值。如果当前片段的深度值小于深度缓冲区中的值(表示它更接近观察者),则通过测试,并更新深度缓冲区中的值;否则,丢弃该片段。
3、关键函数
-
glEnable(GL_DEPTH_TEST)
:启用深度测试。 -
glDepthFunc(GLenum func)
:设置深度测试函数。该函数决定了深度测试通过的条件。常用的选项有GL_LESS
(小于)、GL_LEQUAL
(小于等于)等。 -
glClear(GL_DEPTH_BUFFER_BIT)
:清除深度缓冲区。在渲染之前,通常需要清除深度缓冲区以避免使用上一次渲染时留下的深度值。
三、模板测试和深度测试的先后顺序
在渲染管线中,模板测试发生在深度测试之前。首先,OpenGL会执行模板测试,根据模板缓冲区和参考值来决定是否丢弃某些片段。然后,对于通过模板测试的片段,OpenGL会执行深度测试,进一步决定哪些片段应该被保留并渲染到屏幕上。
综上所述,Android OpenGL中模板测试和深度测试的先后顺序是先进行模板测试,然后进行深度测试。这种顺序允许开发者利用模板测试来实现复杂的图形效果,如物体轮廓描边等,同时仍然能够利用深度测试来正确地渲染场景中的物体。