我需要知道如何讓天空盒出現在無窮遠處? 我知道這是與深度有關的東西,但我不知道確切的事情要禁用或啓用?OpenGL:我如何將天空盒放在無限遠處
7
A
回答
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()
來確保在繪製天空盒之後您的其他狀態也能正確設置(確保在必要時關閉照明或混合等功能)。
您應該在繪製任何東西之前這樣做,以便所有顏色緩衝區寫入發生在天空盒頂部。
1
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緩衝區測試的像素才能執行天空像素着色器。
相關問題
- 1. OpenGL中的天空盒
- 2. 天空盒紋理不顯示在opengl
- 3. 我該如何應用天空盒到世界上,openGL C++
- 4. OpenGL-移動相機內的天空盒
- 5. OpenGL相機的位置和天空盒
- 6. OpenGL - 天空盒和截錐體剪輯
- 7. 爲什麼我用opengl glsl來實現天空盒,出錯了?
- 8. 在openGL中使用三角形的天空盒
- 9. 統一自定義天空盒像Unity天空盒
- 10. VisualTreeHelper.GetDescendantBounds返回「空」(無限遠)
- 11. Android OpenGL天空盒燈不真正工作
- 12. 透明天空盒+透明高度圖的OpenGL混合問題
- 13. LWJGL:渲染天空盒
- 14. Three.js天空盒不加載
- 15. Unity 3D從一個天空盒褪色到另一個天空盒
- 16. 我如何將表格放置在木盒上?響應
- 17. 如何在A幀中加載360度天空盒
- 18. 用OpenGL添加遠處霧?
- 19. 在我的天空盒內獲取相機
- 20. OpenGL旋轉盒
- 21. 如何將一個盒子放入另一個盒子中3d
- 22. Threejs創建天空盒場景
- 23. Unity3d 3d天空盒不太正確
- 24. three.js天空盒分配給相機
- 25. 霧隱藏天空盒(THREE.JS R76)
- 26. 未顯示天空盒紋理
- 27. Three.js天空盒紋理問題。
- 28. 單個圖像天空盒問題
- 29. 紋理天空盒團結的顏色
- 30. 地圖旋轉(天空盒)XNA
天空盒作爲第一件事呈現是浪費一堆帶寬的最佳方式。 – Bahbar 2010-05-19 07:37:53
不過,我認爲OP並不關心性能。最後繪製天空盒比較複雜,因爲你必須確保你已經正確地處理了透明和遠距離的物體,而不是夾在天空盒中。在進行工作實施後,應該對早期Z測試進行優化。 – 2010-05-19 12:55:17