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