gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 01:51:09 24 4
gpt4 key购买 nike

我正在使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com