我想从我的深度重建我的 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/ 8天/
我从噪声纹理中创建了一个随机向量,使用 gramm schmidt 过程计算切线,生成双切线,生成变换矩阵。
然后通过samplekernel查看样本是否被遮挡。
float range_check = abs(origin.z - sampleDepth);
if (range_check < radius && sampleDepth <= sample.z) {
occlusion += 1.0 ;
}
只有在以下情况下才应遮挡该点:
- 从 origin.z 的距离减去到采样点表面的距离在半径内
- 采样点的深度小于 sample.z