【问题标题】:Depth offset in OpenGLOpenGL中的深度偏移
【发布时间】:2018-01-01 00:41:27
【问题描述】:

在 OpenGL 中偏移深度的最佳方法是什么?我目前有每个多边形的索引顶点属性,我将其传递给 OpenGL 中的顶点着色器。我的目标是在深度上偏移多边形,其中最高索引总是在较低索引的前面。我目前有这种简单的方法来修改gl_Position.z

gl_Position.z += -index * 0.00001;

【问题讨论】:

  • 当您的目标是为每个多边形设置不同的深度值时,您的方法应该没问题。

标签: opengl glsl shader depth-buffer


【解决方案1】:

设置深度自动偏移的常用方法是glPolygonOffset(GLfloat factor,GLfloat units)

启用GL_POLYGON_OFFSET_FILLGL_POLYGON_OFFSET_LINEGL_POLYGON_OFFSET_POINT 时, 每个片段的深度值将在从适当顶点的深度值插值后偏移。 偏移量的值为factor * DZ + r * units, 其中DZ 是对多边形相对于屏幕区域的深度变化的度量, r保证为给定实现产生可解析偏移量的最小值。 偏移量是在深度测试执行之前和将值写入深度缓冲区之前添加的。

glEnable( GL_POLYGON_OFFSET_FILL );
glPolygonOffset( 1.0, 1.0 );

如果要手动操作深度,则必须在片段着色器中设置gl_FragDepth

gl_FragDepthFragment Shader

仅在片段语言中可用,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;

您需要添加或减去深度以获得最小差异的最小偏移量取决于深度缓冲区的格式。

深度缓冲区格式GL_DEPTH_COMPONENT16GL_DEPTH_COMPONENT24GL_DEPTH_COMPONENT32是标准化整数格式, 其中 16、24 或 32 位整数范围映射到深度值 [0, 1]。

另一方面,GL_DEPTH_COMPONENT32F 格式是 IEEE 754 标准 32 位浮点格式。

【讨论】:

  • 这在不同批次之间有效吗?有没有可行的着色器方法?
  • 不同批次之间不起作用。你能提供着色器的替代解决方案吗?
  • 深度缓冲区不关心写入它的内容。我会尝试将其渲染为叠加层(或使用 GPU 调试器),以确保在您的第一次通过后值正常。
  • 这个想法是使用索引uniform在不同批次的重叠多边形之间抵消OIT的深度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
  • 2011-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多