深度不被渲染而是显示覆盖
Depth not being render but instead is displaying overlay
我在我的项目中遇到一个问题,我试图在屏幕上绘制金字塔,但没有显示深度。
public void create(float[] vertices, int[] indices, int numberOfVertices, int numberOfIndices) {
indexCount = numberOfIndices;
vao = gl.genVertexArrays();
gl.bindVertexArray(vao);
IntBuffer indicesBuffer = factory.create(indices);
ibo = gl.genBuffers();
gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
gl.bufferData(GL_ELEMENT_ARRAY_BUFFER, indicesBuffer, GL_STATIC_DRAW);
FloatBuffer verticesBuffer = factory.create(vertices);
vbo = gl.genBuffers();
gl.bindBuffer(GL_ARRAY_BUFFER, vbo);
gl.bufferData(GL_ARRAY_BUFFER, verticesBuffer, GL_STATIC_DRAW);
gl.vertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
gl.enableVertexAttribArray(0);
gl.bindBuffer(GL_ARRAY_BUFFER, 0);
gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
gl.bindVertexArray(0);
}
我使用以下代码创建我的网格对象,其中顶点和索引定义为:
private void createTriangles() {
float[] vertices = new float[] {
//x y z
-1.0f, -1.0f, 0.0f, //0
0.0f, 0.0f, 1.0f, //1
1.0f, -1.0f, 0.0f, //2
0.0f, 1.0f, 0.0f //3
};
int[] indices = new int[] {
0, 3, 1,
1, 3, 2,
2, 3, 0,
0, 1, 2
};
mesh.create(vertices, indices, 12, 12);
}
为了将它们显示在屏幕上,我从定义为的游戏循环中调用渲染函数。
public void render() {
gl.bindVertexArray(vao);
gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
gl.drawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, 0);
gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
gl.bindVertexArray(0);
}
为了创建我的 FloatBuffer 和 IntBuffer,我有一个工厂 class 定义为。
public class BufferFactory {
public IntBuffer create(int[] indices) {
IntBuffer buffer = BufferUtils.createIntBuffer(indices.length);
buffer.put(indices);
buffer.flip();
return buffer;
}
public FloatBuffer create(float[] vertices) {
FloatBuffer buffer = BufferUtils.createFloatBuffer(vertices.length);
buffer.put(vertices);
buffer.flip();
return buffer;
}
}
所以我遇到的问题是它应该在屏幕上绘制四个三角形以形成金字塔,但是我的输出看起来像这样。
我旋转了图像以尝试查看深度,但它是一个平面物体。
我试图通过将我的渲染方法更改为 gl.drawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);
来尝试单独绘制每个三角形,以便它只绘制一个三角形,从而确定问题可能来自何处。我试图单独绘制所有四个面孔,并且都被绘制到屏幕上。
我发现了问题。我最初缩放三角形使得
model.scale(new Vector3f(0.2f, 0.2f, 0.0f));
结果 z 轴乘以 0。愚蠢的错误,希望这对以后的人有所帮助。
我在我的项目中遇到一个问题,我试图在屏幕上绘制金字塔,但没有显示深度。
public void create(float[] vertices, int[] indices, int numberOfVertices, int numberOfIndices) {
indexCount = numberOfIndices;
vao = gl.genVertexArrays();
gl.bindVertexArray(vao);
IntBuffer indicesBuffer = factory.create(indices);
ibo = gl.genBuffers();
gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
gl.bufferData(GL_ELEMENT_ARRAY_BUFFER, indicesBuffer, GL_STATIC_DRAW);
FloatBuffer verticesBuffer = factory.create(vertices);
vbo = gl.genBuffers();
gl.bindBuffer(GL_ARRAY_BUFFER, vbo);
gl.bufferData(GL_ARRAY_BUFFER, verticesBuffer, GL_STATIC_DRAW);
gl.vertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
gl.enableVertexAttribArray(0);
gl.bindBuffer(GL_ARRAY_BUFFER, 0);
gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
gl.bindVertexArray(0);
}
我使用以下代码创建我的网格对象,其中顶点和索引定义为:
private void createTriangles() {
float[] vertices = new float[] {
//x y z
-1.0f, -1.0f, 0.0f, //0
0.0f, 0.0f, 1.0f, //1
1.0f, -1.0f, 0.0f, //2
0.0f, 1.0f, 0.0f //3
};
int[] indices = new int[] {
0, 3, 1,
1, 3, 2,
2, 3, 0,
0, 1, 2
};
mesh.create(vertices, indices, 12, 12);
}
为了将它们显示在屏幕上,我从定义为的游戏循环中调用渲染函数。
public void render() {
gl.bindVertexArray(vao);
gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
gl.drawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, 0);
gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
gl.bindVertexArray(0);
}
为了创建我的 FloatBuffer 和 IntBuffer,我有一个工厂 class 定义为。
public class BufferFactory {
public IntBuffer create(int[] indices) {
IntBuffer buffer = BufferUtils.createIntBuffer(indices.length);
buffer.put(indices);
buffer.flip();
return buffer;
}
public FloatBuffer create(float[] vertices) {
FloatBuffer buffer = BufferUtils.createFloatBuffer(vertices.length);
buffer.put(vertices);
buffer.flip();
return buffer;
}
}
所以我遇到的问题是它应该在屏幕上绘制四个三角形以形成金字塔,但是我的输出看起来像这样。
我旋转了图像以尝试查看深度,但它是一个平面物体。
我试图通过将我的渲染方法更改为 gl.drawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);
来尝试单独绘制每个三角形,以便它只绘制一个三角形,从而确定问题可能来自何处。我试图单独绘制所有四个面孔,并且都被绘制到屏幕上。
我发现了问题。我最初缩放三角形使得
model.scale(new Vector3f(0.2f, 0.2f, 0.0f));
结果 z 轴乘以 0。愚蠢的错误,希望这对以后的人有所帮助。