【发布时间】: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