我需要知道如何让天空盒出现在无穷远处? 我知道这是与深度有关的东西,但我不知道确切的事情要禁用或启用?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