我在使用gpu raycasting技术的着色器中有一个体绘制实现。基本上我有一个单位立方体在我的场景的中心。 我渲染单元立方体的顶点在我的顶点着色器和传递纹理坐标片段着色器是这样的:放弃射线铸造中的一些体素
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.0至1.0加0.5到他们..
在片段着色器,我得到了纹理坐标这是由光栅插值:
...
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坐标?)。