java - 天空盒纹理无法正确显示
问题描述
我对天空盒纹理有疑问。如果你转动相机,它会产生一种纹理覆盖另一个纹理的感觉,如屏幕截图所示:
天空盒显示代码:
private void drawSkybox(int texId){
glColor4f(1,1,1,1);
glDepthMask(false);
glEnable(GL_TEXTURE_CUBE_MAP);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_CUBE_MAP, texId);
glBindVertexArray(vao[0]);
glBindBuffer (GL_ARRAY_BUFFER, vbo[0]);
glDrawArrays(GL_TRIANGLES, 0, 36);
glBindVertexArray(0);
glBindBuffer (GL_ARRAY_BUFFER, 0);
glDepthMask(true);
glDisable(GL_TEXTURE_CUBE_MAP);
}
我的opengl参数:
glEnable(GL_ALPHA_TEST);
glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glEnable(GL_NORMALIZE);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glShadeModel(GL_SMOOTH);
glColorMask (true, true, true, true);
glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE);
我打电话给drawSkybox:
glViewport(0, 0, WIDTH, HEIGHT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-max, max, -1, 1, 10, -10);
glRotated(cameraX, 1f, 0f, 0);
glRotated(cameraY, 0f, 1f, 0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
drawSkybox(texId);
我该如何解决这个问题?
我知道问题是glDepthMask(false);
,但如何更换?
如果我只是删除glDepthMask(false);
它并用一个示例替换它,glDepthFunc(GL_LEQUAL);
然后glDepthFunc(GL_LESS);
天空盒将与所有其他对象重叠,并且只有它是可见的——</p>
解决方案
绘制天空盒时不要更改深度蒙版或深度测试。保留深度测试功能GL_LESS
。
private void drawSkybox(int texId){
glColor4f(1,1,1,1);
// glDepthMask(false); <---- DELETE
// [...]
}
但在绘制天空盒后再次清除深度缓冲区。先绘制天空盒,然后天空盒覆盖整个屏幕。然后清除深度缓冲区,因此之后绘制的所有对象都将覆盖天空盒:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// [...]
drawSkybox(texId);
glClear(GL_DEPTH_BUFFER_BIT);
// render other objects
// [...]
推荐阅读
- vue.js - Vuejs:重构方法
- java - 构建可执行jar
- opennebula - 将 OpenNebula 数据库从 5.10 升级到 5.12 没有任何作用
- c# - 从 FieldInfo 获取 DateTime 值
- network-programming - NS3 可以与真正的分布式算法配对吗?
- c++ - c++程序编译错误,找不到/访问文件
- python - 将 Chromedriver 83 与 Chrome 83 一起使用时出现 SessionNotCreatedException
- javascript - AJAX:发送表单数据失败
- javascript - 是否可以重新初始化默认的 Firebase 应用程序?
- javascript - 将常规菜单转换为引导下拉菜单?