java - 在 OpenGL 中,如何使我的天空盒不覆盖我的任何实体?

标签 java opengl lwjgl skybox

我正在使用 LWJGL(ThinMatrix 目前的教程)在 Java 中开发一个 OpenGL 游戏,我刚刚添加了我的天空盒。然而,正如您从图片中看到的那样,它正在穿过树木并覆盖某个点后面的所有东西。

这是我的天空盒渲染代码:

public void render(Camera camera, float r, float g, float b) {
    shader.start();
    shader.loadViewMatrix(camera);
    shader.loadFogColor(r, g, b);
    GL30.glBindVertexArray(cube.getVaoID());
    GL20.glEnableVertexAttribArray(0);
    bindTextures();
    GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, cube.getVertexCount());
    GL30.glBindVertexArray(0);
    shader.stop();
}

private void bindTextures() {
    GL13.glActiveTexture(GL13.GL_TEXTURE0);
    GL11.glBindTexture(GL13.GL_TEXTURE_CUBE_MAP, texture);
    GL13.glActiveTexture(GL13.GL_TEXTURE1);
    GL11.glBindTexture(GL13.GL_TEXTURE_CUBE_MAP, nightTexture);
    shader.loadBlendFactor(getBlendFactor());
}

如果需要的话,这里是我的主渲染器代码:

public void render(List<Light> lights, Camera camera){
    prepare();
    shader.start();
    shader.loadSkyColor(RED, GREEN, BLUE);
    shader.loadLights(lights);
    shader.loadViewMatrix(camera);
    renderer.render(entities);
    shader.stop();
    terrainShader.start();
    terrainShader.loadSkyColor(RED, GREEN, BLUE);
    terrainShader.loadLight(lights);
    terrainShader.loadViewMatrix(camera);
    terrainRenderer.render(terrains);
    terrainShader.stop();
    skyboxRenderer.render(camera, RED, GREEN, BLUE);
    terrains.clear();
    entities.clear();
}

Image

最佳答案

你可以做两件事

如果您先绘制天空盒,则可以禁用深度测试 glDisable(GL_DEPTH_TEST) 或深度写入 glDepthMask(false)。这将防止您的天空盒绘制深度值,并且天空盒永远不会位于稍后绘制的任何内容之前。

如果你最后绘制你的天空盒,你可以通过使用顶点坐标和 w-coordinate 为 0 来使它无限大。一个顶点 (x y z 0) 意味着它是 vector (x y z) 方向上无限远的顶点。为了防止剪裁,你必须启用深度夹紧 glEnable(GL_DEPTH_CLAMP) 这将防止 OpenGl 剪掉你的天空盒面,并且你确定天空盒始终处于最大距离并且永远不会隐藏任何东西你之前画过。

第二种方法的优点是在深度测试范围内。因为您已经为场景编写了深度值,所以 OpenGL 管道可以跳过场景中已经覆盖的天空盒像素的计算。但是天空盒的片段着色器通常非常微不足道,所以应该不会有太大的不同。

关于java - 在 OpenGL 中,如何使我的天空盒不覆盖我的任何实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31152252/

相关文章:

Opengl 片段的相对 Z 缓冲区

java - 为什么我的角色无法移动?

java - 是否可以在非主线程中创建 openGL VBO/显示列表

java - 如何在应用程序或 Activity 加载之前显示进度对话框?

java - 使用 Jedis 的 Redis Key 过期通知

java - 不同机器上solr-8.9.0加载一个csv文件的对比

c++ - 面向对象编程和 OpenGL

java - LWJGL 纹理加载/映射问题

java - 玩家似乎正在与空气碰撞?

java - Infinispan 因 java.lang.NoSuchMethodError : org. jboss.marshalling.MarshallingConfiguration.setExternalizerCreator 崩溃