什么是抵消OpenGL深度的最佳方法?我目前每个多边形都有索引顶点属性,我将其传递给OpenGL中的顶点着色器。我的目标是在深度偏移多边形,其中最高指数始终位于较低指数的前方。我目前有这种简单的方法来修改gl_Position.z
。
gl_Position.z += -index * 0.00001;
设置深度自动偏移的常用方法是glPolygonOffsett(GLfloat factor,GLfloat units)
启用
GL_POLYGON_OFFSET_FILL
,GL_POLYGON_OFFSET_LINE
或GL_POLYGON_OFFSET_POINT
时,每个片段的深度值将在从相应顶点的深度值进行插值后进行偏移。偏移的值是factor * DZ + r * units
,其中DZ
是相对于多边形的屏幕区域的深度变化的度量,并且r
是保证为给定实现产生可解析偏移的最小值。在执行深度测试之前和将值写入深度缓冲区之前添加偏移量。
glEnable( GL_POLYGON_OFFSET_FILL );
glPolygonOffset( 1.0, 1.0 );
如果要手动操作深度,则必须在片段着色器中设置gl_FragDepth
。
gl_FragDepth
仅在片段语言中可用,是一个输出变量,用于建立当前片段的深度值。如果启用了深度缓冲且没有着色器写入gl_FragDepth
,则将使用深度的固定函数值(此值包含在gl_FragCoord
的z分量中),否则,将使用写入gl_FragDepth
的值。
一般来说,gl_FragDepth
计算如下(见GLSL gl_FragCoord.z Calculation and Setting gl_FragDepth):
float ndc_depth = clip_space_pos.z / clip_space_pos.w;
gl_FragDepth = (((farZ-nearZ) * ndc_depth) + nearZ + farZ) / 2.0;
您需要添加或减去深度以获得最小差异的最小偏移量取决于深度缓冲区的格式。
深度缓冲区格式qazxsw poi,qazxsw poi和qazxsw poi是归一化整数格式,其中16,24或32位整数范围被加到深度值[0,1]上。
另一方面,格式GL_DEPTH_COMPONENT16
是IEEE 754标准32位浮点格式。