【问题标题】:Calculate percentage of a fragments depth position relative to a range计算片段深度位置相对于范围的百分比
【发布时间】:2013-06-12 21:06:45
【问题描述】:

在我的片段/像素着色器中,我试图在给定范围内以百分比 [0-1] 计算片段的深度位置。我拥有的是一堆形状(它们没有给出相关数据),但所有形状都有一个共同点,那就是它们的深度总是 1000 像素。

根据我从片段中获得的深度值,我希望能够计算出在这个形状的范围(1000.0 像素)中它在 [0-1] 之间的值的位置。

这意味着我可以有一个当前片段的深度值,比如 2300,但我需要知道它在形状的 1000 像素深度中的位置。

因此,如果形状正好位于相机所在的位置,我可以通过以下方式计算当前片段深度值的位置:

float depth = (gl_FragCoord.z / gl_FragCoord.w);
float perc  = 1.0 - (depth / 1000.0);

这一切都很好,但问题是当形状离相机更远时。我如何从该深度位置计算它在 1000 像素范围内的位置。在某种程度上,必须处理范围,因为它也离相机更远,但问题是我只有一个片段深度值和可用的范围。

图片解释更多!从上方想象它,所以它沿着 Z 轴向下。

那么这甚至可能解决吗?还是我应该尝试其他方法?

【问题讨论】:

  • "它们的深度总是 1000 像素" 如果所有片段的深度都是 1000 像素,那么它们的深度不会改变。您是说 小于 小于 1000 像素吗?
  • 啊不,形状的深度总是 1000 像素。另一个轴是任意的,但它的“宽度”深度始终为 1000 像素,沿相机向下。想象一个盒子,它的 X 和 Y 轴可以改变,但它的深度总是 1000 像素。
  • 如果谈论深度,像素并不是一个真正合适的单位。在物理学中,每当我们谈论某个范围内没有附加特定单位的数值时,我们都会谈论“任意单位”或简称 a.u.。对于深度,一个适当的术语可能是“帧缓冲区深度单元”(FDU)或类似的。但不是像素。
  • 你能添加一个顶点属性设置为顶点所属形状的最小深度吗?
  • 请注意,深度值不是相机空间中的 Z 坐标,而是取决于远近截头体属性的扭曲值。这是因为投影矩阵。 gl_FragCoord 在剪辑空间中,但您希望它们的值在相机空间中。在我当前的项目中,我需要根据深度值计算 Z 值。如果我理解正确,你需要同样的。可以使用公式cameraZ = (near * far) / (far - depthValue * (far - near)) 计算(在着色器中远近是统一的)

标签: math opengl glsl fragment-shader


【解决方案1】:

好吧,我终于解决了,所以我会在这里输入我的答案。

按照原始问题中 cmets 的建议,我找到了我绘制的每个形状的最小/最大 z 位置,并将这两个值作为统一发送到我的片段着色器。

在顶点着色器中,我将当前 Z 位置作为可变变量:

[顶点着色器]

uniform mat4 mvp;
varying float zPos;

void main()
{
    gl_TexCoord[0] = gl_MultiTexCoord0;
    gl_TexCoord[1] = gl_MultiTexCoord1;
    gl_FrontColor  = gl_Color;
    //gl_Position  = ftransform();
    gl_Position    = mvp * gl_Vertex;
    zPos           = gl_Vertex.z;
}

在我的片段着色器中:

[片段着色器]

uniform float minZ;
uniform float maxZ;
varying float zPos;

void main(void)
{
    float mul = (abs(zPos)-minZ) / (maxZ - minZ);
    float col = 1.0 * mul;

    gl_FragColor = vec4(col, 0.0, 0.0, 1.0);
}

这会产生一个介于 [0-1] 之间的 mul 值,无论它们相对于相机的位置如何,我都可以将其用于我的形状上的 alpha 渐变.完全不需要深度值。

在我发送的 CPU 上的主程序中计算的 maxZ/minZ 值作为正值(我发现这样处理它们更容易),但它们在源中是负值。这就是我在 zPos 变量上使用 abs(...) 的原因。

需要一些调整和调整,但我正在寻找的已经实现。非常感谢大家的意见。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 2021-03-22
    • 2021-06-01
    • 1970-01-01
    相关资源
    最近更新 更多