使用光线投射时在深度缓冲区中写入正确的值

时间:2011-06-23 09:08:59

标签: opengl glsl shader depth-buffer

我在3D纹理中进行光线投射,直到我达到正确的值。我在立方体中进行光线投射,并且立方角已经在世界坐标中,所以我不必将顶点与模型视图矩阵相乘以获得正确的位置。

顶点着色器

world_coordinate_ = gl_Vertex;

片段着色器

vec3 direction = (world_coordinate_.xyz - cameraPosition_);
direction = normalize(direction);

for (float k = 0.0; k < steps; k += 1.0) {
....
pos += direction*delta_step;
float thisLum = texture3D(texture3_, pos).r;
if(thisLum > surface_)
...
}

一切都按预期工作,我现在想要的是将正确的值采样到深度缓冲区。现在写入深度缓冲区的值是立方体坐标。但是我想要在3d纹理中写入pos的值。

因此,我们假设多维数据集与10中的原点相距-z,且大小为10*10*10。我的解决方案无法正常运行:

pos *= 10;
pos.z += 10;
pos.z *= -1;

vec4 depth_vec = gl_ProjectionMatrix * vec4(pos.xyz, 1.0);
float depth = ((depth_vec.z / depth_vec.w) + 1.0) * 0.5; 
gl_FragDepth = depth;

2 个答案:

答案 0 :(得分:2)

解决方案是:

vec4 depth_vec = ViewMatrix * gl_ProjectionMatrix * vec4(pos.xyz, 1.0);
float depth = ((depth_vec.z / depth_vec.w) + 1.0) * 0.5; 
gl_FragDepth = depth;

答案 1 :(得分:1)

您可能尝试的一种解决方案是绘制一个直接位于您尝试光线追踪的立方体顶部的立方体。将光栅立方体的位置发送到与光线跟踪算法相同的空间,并执行相同的变换来计算“depth_vec”,只在顶点着色器中进行。

通过这种方式,您可以看到问题的来源。一旦使这部分转换工作,您就可以将此转换序列反向移植到光线跟踪器中。如果这不能解决所有问题,那么只会因为你的光线跟踪算法没有在你认为它所在的空间中输出位置。