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

Math 计算碎片深度位置相对于范围的百分比,math,opengl,glsl,fragment-shader,Math,Opengl,Glsl,Fragment Shader,在我的片段/像素着色器中,我试图在给定范围内以百分比[0-1]计算片段的深度位置。我有一堆形状(没有相关数据),但所有形状都有一个共同点,那就是它们的深度总是1000像素 从我从片段中得到的深度值,我希望能够计算出在这个形状的范围内(1000.0像素),它位于[0-1]之间的值 这意味着我可以有一个当前片段的深度值,比如2300,但我需要知道它在1000像素的形状深度中的位置 因此,如果形状正好位于相机所在的位置,我可以通过执行以下操作来计算当前碎片深度值的位置: float depth = (

在我的片段/像素着色器中,我试图在给定范围内以百分比[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轴向下移动


那么,这是否有可能实现呢?或者我应该尝试另一种方法吗?

好吧,我终于解决了这个问题,所以我将在这里键入我的答案

正如原始问题中的注释所建议的,我找到了我绘制的每个形状的最小/最大z位置,并将这两个值作为统一的格式发送给我的片段着色器

在“顶点着色器”(vertex shader)中,我获取当前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(…)


一些调整和调整是必要的,但我所期待的是实现。非常感谢所有的输入。

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