从深度重建片段位置

时间:2013-06-25 08:18:44

标签: javascript opengl-es glsl webgl

我想从我的深度重构我的xyz。这样我从实际片段中获得了位置。 我已经拥有的东西:

  • 深度纹理
  • 功能深度到线性深度

这就是我此刻计算价值的方法。 hfar是远平面的高度,是它的宽度。 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,你可以在上面的其他着色器中看到。如果这是正确的,那么我不明白为什么当前的outocome是这样的:http://www.imgbox.de/users/public/images/ahmqLHYbvm.jpg 着色器的小提琴http://jsfiddle.net/Peters_Stuff/8ddkt/

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

然后浏览样本内核并查看样本是否被遮挡。

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

只有在以下情况下才会被遮挡:

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

1 个答案:

答案 0 :(得分:2)

(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。在z0.0之间的FragColor的片段切换k组件中。 K实际上是一个深度组件。使用0.0它是绿色 - 红色,但是k它会更改颜色,因此您发布的图像可能不正确(不是您想要的)。

希望这有帮助。