2014-09-23 90 views
1

我在使用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坐标?)。

回答

2

首先你必须制定你的采样体素坐标。 (我假设音量是你的3D纹理)。要找到它,您必须将其从dataPos中去线性化为3D纹理(w x h x d)中的3轴组件。因此,如果MAX_SAMPLES中的样本具有像((z * d)+ y)* h + x那样计算的指数,则坐标可以通过以下公式计算出来:z = floor(sample /(w * h))

Y =地板((样品 - (Z * W * H))/ w)的

X =样品 - (Z * W * H) - (Y * W)

地板操作检索整数索引非常重要。

这是您的示例的坐标。现在你可以将它乘以你用于4个顶点的mvp的倒数,这给你的样本在世界空间中的位置(或中心,也许你必须添加vec3(0.5))。

然而,这引发了一个新问题:看看您是否可以重写您的选择算法,以便您不必跳过所有计算,并在屏幕空间而不是世界空间中进行选择。