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 座標だと思いますか?) を省略または含めることができれば十分です。