2011-06-23 60 views
4

我正在3D紋理中進行光線投射,直到達到正確的值。我在立方體中進行光線投射,並且立方體角已經在世界座標中,所以我不必將頂點與模型視圖矩陣相乘以獲得正確的位置。使用光線投射時在深度緩衝區中寫入正確的值

頂點着色器

world_coordinate_ = gl_Vertex; 

片段着色器

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

一切正常,我現在想的是採樣正確的值到深度緩衝。現在寫入深度緩衝區的值是立方體座標。但是我想要在3d紋理中寫入pos的值。

所以我們可以說立方體放置在遠離原點的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」,只能在頂點着色器中進行。

這樣,你可以看到你的問題來自哪裏。一旦你獲得了這部分轉換的工作,那麼你可以將這個轉換序列移植到你的raytracer中。如果不解決所有問題的話,那就只能是因爲你的光線追蹤算法不輸出位置的空間,而你認爲​​這是在