【问题标题】:Reconstruct fragment position from depth从深度重建片段位置
【发布时间】:2013-06-21 23:00:33
【问题描述】:

我想从我的深度重建我的 xyz。这样我就可以从实际片段中获得位置。 我已经拥有的:

  • 深度纹理
  • 函数深度到线性深度

这就是我目前计算我的价值观的方式。 hfar 是远平面的高度, wfar 是它的宽度。 vec2 tc 是一个 ndc 向量

float LinearizeDepth (vec2 coord)
{
        float z = texture2D(depthTexture, coord*ssaoScale).x;
        float d = (2.0 * near) / (far + near - z * (far - near));
        return d;
}

        float z = gl_FragCoord.z;

        vec3 ray = vec3(x, y, z);

        return ray;                      
}   

    vec2 screenPos = vec2(gl_FragCoord.x / 1024.0, gl_FragCoord.y / 512.0);
    vec3 origin = getViewRay(screenPos) * lineardepth; 

但起源似乎不正确。 这是一个 js.fiddle

http://jsfiddle.net/Peters_Stuff/s24TT/

我试图通读http://mynameismjp.wordpress.com/2009/03/10/reconstructing-position-from-depth/,但这让我更加困惑。我不想要一个解决方案或什么,只是推动正确的方式:)

有什么建议吗?


编辑:

我实施了这个建议:

vec3 origin = vec3(vec4(screenPos, texture2D(depthTexture, screenPos).x, 1.0) * invPerspectiveMatrix).xyz;

所以原点应该是我的片段视图空间位置。这看起来对吗?我不知道输出应该是什么样子


编辑 2:

这是一个小提琴: http://jsfiddle.net/Peters_Stuff/8ddkt/

我正在渲染一个全屏四边形并在顶点着色器中生成纹理坐标和顶点并将它们传递给片段着色器。我在那里计算我的起源

vec3 origin = vec3(vViewRay.xy * 0.5 + 0.5 , linearDepth);

vViewray 必须标准化为 [0..1] 目前的结果


编辑 3:

我目前正在实现 ssao,您可以在上面的着色器的其余部分中看到。如果这是正确的,那么我不明白为什么当前的结果是这样的:http://www.imgbox.de/users/public/images/ahmqLHYbvm.jpg 着色器的小提琴http://jsfiddle.net/Peters_Stuff/8ddkt/

我从噪声纹理中创建一个随机向量,使用 gramm schmidt 过程计算切线,生成双切线,生成变换矩阵。

然后遍历samplekernel,看看sample是否被遮挡。

    float range_check = abs(origin.z - sampleDepth);
    if (range_check < radius && sampleDepth <= sample.z) {
        occlusion +=  1.0 ;
    }  

只有在以下情况下才应遮挡该点:

  • 从 origin.z 的距离减去到采样点表面的距离在半径范围内
  • 采样点的深度小于sample.z

【问题讨论】:

  • 图像看起来像蓝色分量始终为 0。您是否提供了一些深度图?如果您想要 viewSpace 坐标,则不必乘以 inverseProjMat。
  • 是的,我有一张深度图(非线性)。如果需要,我还具有使值线性化的功能。上图:texture2D(depthTexture, screenPos);这将是非线性值
  • 已编辑答案。如果您仍有不清楚的地方,请尽可能发布 jsfiddle。

标签: javascript opengl-es glsl webgl


【解决方案1】:
(x,y,z) -> clip volume

projMat * xyz = clip_coord;

// - - - - - -

clip_coord.x = gl_FragCoord / screenWidth;
clip_coord.y = gl_FragCoord / screenHeight;
clip_coord.z = texture2D(depthMap, clip_coord.xy);

xyz = inverseProjMat * clip_coord;

编辑:

http://goo.gl/AG7UO

这是一次通过,但与两次通过的事情完全相同,但因为它是一次通过,所以没有重建,只是varying。在 0.0k 之间的 FragColor 的片段切换 z 组件。 K 实际上是一个深度组件。 0.0 是绿红,但 k 会改变颜色,所以你发布的图片可能不正确(不是你想要的)。

希望这会有所帮助。

【讨论】:

  • 如果我不将 inversProjMat 与 clip_coord xyz 相乘最终成为片段的视图空间位置,我是否正确?这就是我真正想要的:)
  • 如果你从左边乘projMat,你不应该从右边乘inverseProjMat。
  • 嗯 ssao 完全是另一个问题,不是吗?您发布的“半色调”效果确实让我想起了可以在以下位置看到的类似效果:codeflow.org/entries/2011/oct/25/…您可以阅读那篇文章,它应该会有所帮助。
  • SSAO 是其他东西,你是对的,但 vec3 起源是我的基础。我之前已经读过那篇文章;)也许我应该提出另一个问题。
猜你喜欢
  • 1970-01-01
  • 2015-03-19
  • 2014-04-12
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 1970-01-01
  • 2021-04-18
  • 1970-01-01
相关资源
最近更新 更多