【问题标题】:What could be causing meshes to generate rotated? LWGL什么可能导致网格生成旋转? LWGL
【发布时间】:2020-08-06 21:01:21
【问题描述】:

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

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

...但是当我渲染它们时,这就是我所看到的: 500x500 mesh 5x5 100x100 mesh

如您所见,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 噪声/网格生成问题。

【问题讨论】:

  • 很难确定,在生成网格时,您确定每个顶点的采样坐标是正确的吗?我们看到渲染的是对象上的纹理,还是只是将颜色与顶点高度相关联?
  • 网格“纹理”基于世界位置。这只是一个简单的out_Color=vec4(vec3(worldPosition.y/16), 1.0) 来可视化高度图。它除以 16,因为噪声的范围是 0-16。
  • 好的,要创建网格,如何对每个顶点的噪声进行采样?也许这里有一个创建旋转网格的问题?此外,当您加载着色器制服时,只是为了确保您可以将旋转设置为身份?
  • 切换 setIdentity() 似乎没有改变任何东西,但我添加了一个定向纹理,而不是通过高度图创建它。 Alk 方向是相同的。好像不是轮换问题?我对它可能是什么感到非常困惑,因为从块生成中生成的高度图图像仍然是一个非常平滑的过渡。
  • 我缩小了范围。我添加了一个自定义高度图,很明显它可以很好地加载地图并保存它的相同版本。但是,它不会像图像那样渲染它。

标签: java opengl lwjgl chunks procedural-generation


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-08-26
    • 1970-01-01
    • 2012-10-31
    • 2011-01-07
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多