2011-06-23 11 views
4

正しい値になるまで、3Dテクスチャでレイキャスティングを行っています。私はキューブでレイキャスティングを行い、キューブコーナーは既にワールド座標系になっていますので、頂点にmodelviewmatrixを掛けて正しい位置を取得する必要はありません。レイキャスティングを使用するときにデプスバッファに正しい値を書き込む

頂点シェーダ

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_) 
... 
} 

すべてが期待どおりに動作

world_coordinate_ = gl_Vertex; 

フラグメントシェーダは、私が今欲しいものデプスバッファへの正しい値をサンプリングすることです。深度バッファに書き込まれる値は、キューブ座標です。しかし、私はposの価値を3dテクスチャに書いて欲しいです。

したがって、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

ソリューションでした:。

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

一つの解決策は、あなたが光線追跡しようとしているキューブの上に直接あるキューブを描画することです。レイトレーシングアルゴリズムと同じ空間にキューブの位置を送信し、同じ変換を実行して "depth_vec"を計算します。頂点シェーダでのみ行います。

このようにすれば、どこから問題が発生しているのかを確認できます。トランスフォームのこの部分を機能させると、このトランスフォーメーションシーケンスをレイトレース担当者にバックポートすることができます。それがすべてを解決しない場合は、あなたの光線追跡アルゴリズムは、あなたはそれがであると思い空間での位置を出力していないので、それが唯一のでしょう