2010-05-18 58 views

回答

11

首先關閉深度寫/測試(你不需要與關閉深度測試打擾,如果你先畫天空盒和清除深度緩存):

glDisable(GL_DEPTH_TEST); 
glDepthMask(false); 

然後移動相機原點並旋轉模型視圖矩陣的逆:

// assume we're working with the modelview 
glPushMatrix(); 

// inverseModelView is a 4x4 matrix with no translation and a transposed 
// upper 3x3 portion from the regular modelview 
glLoadMatrix(&inverseModelView); 

現在,請你天空盒,把深度回寫上:

DrawSkybox(); 

glPopMatrix(); 
glDepthMask(true); 
glEnable(GL_DEPTH_TEST); 

您可能想要使用glPush/PopAttrib()來確保在繪製天空盒之後您的其他狀態也能正確設置(確保在必要時關閉照明或混合等功能)。

您應該在繪製任何東西之前這樣做,以便所有顏色緩衝區寫入發生在天空盒頂部。

+7

天空盒作爲第一件事呈現是浪費一堆帶寬的最佳方式。 – Bahbar 2010-05-19 07:37:53

+4

不過,我認爲OP並不關心性能。最後繪製天空盒比較複雜,因爲你必須確保你已經正確地處理了透明和遠距離的物體,而不是夾在天空盒中。在進行工作實施後,應該對早期Z測試進行優化。 – 2010-05-19 12:55:17

1

沒有無限。天空盒只是一個紋理盒子,中間是0,0,0。 這是一個簡短的嘖嘖:link text

+0

天才。你必須在無限遠處(無深度)繪製它,因爲除了天空盒之外沒有任何東西可以遠離它。下次做你的研究。 – Tara 2013-06-27 14:08:30

0

我能想到的最好的方法是在第一遍(或圖層)上繪製它,然後只清除深度緩衝區。之後,在另一個通道中畫出其餘的場景。這樣天空盒將永遠保持在場景後面。只記得兩次使用相同的相機,並以某種方式將天空盒與相機對齊。

3

首先,清除緩衝區。

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

然後,保存您當前的模型視圖矩陣並加載標識。

glPushMatrix(); 
glLoadIdentity(); 

然後渲染你的天空盒。

Skybox.render(); 

然後,清除深度緩存,並呈現

glClear(GL_DEPTH_BUFFER_BIT); 

OtherStuff.render(); 

glutSwapBuffers(); 
2

唯一的問題與繪製天空盒是第一個正常繼續,是你的像素着色器將在天空盒的每個像素執行。稍後將被其他物體覆蓋。你最好的選擇是渲染所有不透明物體,然後渲染你的天空盒。這樣,只有通過z緩衝區測試的像素才能執行天空像素着色器。