计算碎片深度位置相对于范围的百分比

时间:2013-05-23 14:13:21

标签: math opengl glsl fragment-shader

在我的片段/像素着色器中,我试图在给定范围内以百分比[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 px范围内的位置。在某种程度上,范围必须被处理,因为它也远离相机,但问题是我只有片段深度值和可用于此处的范围。

图片说明更多!想象一下它在上面,所以它沿着Z轴向下移动。

details

这样就算可以解决这个问题了吗?或者我应该尝试另一种方法吗?

1 个答案:

答案 0 :(得分:1)

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

正如原始问题的评论所示,我找到了每个形状的最小/最大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);
}

这会产生 mul 的值,介于[0-1]之间,无论它们相对于相机在哪里,我都可以使用它来对我的形状进行alpha淡化。根本不需要深度值。

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

需要进行一些调整和调整,但我正在寻找的是什么。非常感谢所有的投入。