什么可能导致网格生成旋转? LWGL
What could be causing meshes to generate rotated? LWGL
我正在从高度图加载块值以创建无限地形,但我在渲染每个网格块时遇到问题。当我加载单个 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 noise/mesh 代的问题。
我发现了问题!我创建网格的方式存在一个缺陷,导致它渲染翻转的三角形。我通过关闭剔除并从两侧观察它并移动三个顶点坐标来发现这一点。修复顶点面(例如,将其从顺时针方向交换为 counter-clockwise,然后反转 X 和 Z 坐标)修复它。
我正在从高度图加载块值以创建无限地形,但我在渲染每个网格块时遇到问题。当我加载单个 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 noise/mesh 代的问题。
我发现了问题!我创建网格的方式存在一个缺陷,导致它渲染翻转的三角形。我通过关闭剔除并从两侧观察它并移动三个顶点坐标来发现这一点。修复顶点面(例如,将其从顺时针方向交换为 counter-clockwise,然后反转 X 和 Z 坐标)修复它。