我在使用gpu 光线投射技术的着色器中实现了体积渲染。基本上我的场景中心有一个单位立方体。我在顶点着色器中渲染单位立方体的顶点,并将纹理坐标传递给片段着色器,如下所示:
in vec3 aPosition;
uniform mat4 uMVPMatrix;
smooth out vec3 vUV;
void main() {
gl_Position = uMVPMatrix * vec4(aPosition.xyz,1);
vUV = aPosition + vec3(0.5);
}
由于单位立方体坐标从 -0.5 变为 0.5,我通过向它们添加 0.5 将纹理坐标从 0.0 固定到 1.0..
在片段着色器中,我得到了由光栅器插值的纹理坐标:
...
smooth in vec3 vUV; // Position of the data interpolated by the rasterizer
...
void main() {
...
vec3 dataPos = vUV;
...
for (int i = 0; i < MAX_SAMPLES; i++) {
dataPos = dataPos + dirStep;
...
float sample = texture(volume, dataPos).r;
...//Some more operations on the sampled color
float prev_alpha = transferedColor.a * (1.0 - fragColor.a);
fragColor.rgb += prev_alpha * transferedColor.rgb;
fragColor.a += prev_alpha; //final color
if(fragColor.a>0.99)
break;
}
}
我的渲染效果很好。
现在我已经实现了一个选择算法,它可以很好地处理粒子(世界坐标中的真实顶点)。
我的问题是如何使它与体积数据集一起使用?因为我只有顶点是单位立方体的顶点。由于数据点是由光栅化器插值的,所以我不知道体素的真实(世界)坐标。
对我来说,获取体素的中心坐标并将它们视为粒子是很公平的,这样我就可以在片段着色器中省略或包含必要的体素(我猜是 vUV 坐标?)。