首页 > 解决方案 > 什么可能导致网格生成旋转?LWGL

问题描述

我正在从高度图加载块值以创建无限地形,但我在渲染每个网格块时遇到问题。当我加载单个 500x500 单位网格时,它是一个平滑的网格。当我加载一个 5x5 的 100x100 网格时,它是一团糟。

我让两种不同类型的网格保存了每个网格高度的图像,它们都给出了一个平滑的高度图,数值逐渐变化。

...但是当我渲染它们时,我看到的是: 500x500 网格 5x5 100x100 网格

如您所见,5x5 网格根本没有对齐。前三个块 0:0、0:1 和 1:0 看起来似乎是正确的,但其他块都不同。它们的变换矩阵中的所有旋转都是 vec3(0,0,0),但它们是这样生成的。这是用于呈现它们的代码:

    public void render() {
        shader.start();
        shader.loadViewMatrix(Maths.createViewMatrix(engine.getPlayer()));
        shader.loadLight(engine.getManagers().getLightManager().getLights().get(0));

        for(Chunk chunk : engine.getManagers().getTerrainManager().getLoadedChunks().values()) {
            RawModel model = chunk.getModel();

            bindChunk(chunk);
            loadShaderUniforms(chunk);
            GL11.glDrawElements(GL11.GL_TRIANGLES, model.getVertexCount(), GL11.GL_UNSIGNED_INT, 0);

            unbindChunk();
        }
        shader.stop();
    }

    private void bindChunk(Chunk chunk) {
        RawModel rawModel = chunk.getModel();
        GL30.glBindVertexArray(rawModel.getVaoID());
        GL20.glEnableVertexAttribArray(0); // position
        GL20.glEnableVertexAttribArray(1); // textureCoordinates
        GL20.glEnableVertexAttribArray(2); // normal

        ModelTexture texture = chunk.getTexture();
        GL13.glActiveTexture(GL13.GL_TEXTURE0);
        GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture.getTextureID());
    }

    private void unbindChunk() {
        GL20.glDisableVertexAttribArray(0);
        GL20.glDisableVertexAttribArray(1);
        GL20.glDisableVertexAttribArray(2);
    }

    private void loadShaderUniforms(Chunk chunk) {
        Matrix4f transformation = Maths.createTransformationMatrix(chunk.getLocation().getPosition(),
                chunk.getLocation().getRotation(), 1, true);
        System.out.println(chunk.getLocation().getRotation());
        shader.loadTransformationMatrix(transformation);
        shader.setShowHeightMap(chunk.shouldShowHeightMap());
    }

我不熟悉 LWJGL 如何使用 VAO 的细节,所以这可能是一个我忘记的简单问题。任何帮助将不胜感激,因为我花了几天时间将问题缩小到渲染问题,而不是 perlin 噪声/网格生成问题。

标签: javaopengllwjglchunksprocedural-generation

解决方案


我发现了问题!我创建网格的方式存在缺陷,导致它渲染三角形翻转。我通过关闭剔除并从两侧观察它并移动三个顶点坐标来发现这一点。修复顶点面(例如,将其从顺时针交换到逆时针,然后反转 X 和 Z 坐标)修复它。


推荐阅读