我编写了一个程序,该程序读取我现在要显示的obj文件。所有数据看起来都很好,但是当我尝试渲染它时,我首先想到了,它没有用,但是当我将相机移动到对象(一个简单的立方体)中时,我的整个屏幕变成红色,这意味着它被渲染了。
我的第一个想法是,我可能弄乱了索引的顺序,所以我尝试切换索引,因此三角形希望指向外部,但它没有任何改变。 然后我开始更改视图和投影矩阵(例如,转置),但是它给了我非常奇怪的结果,因此我相信这些也是正确的。尤其如此,因为该特定代码是从大学的一堂课中学到的。
现在我真的不知道是什么原因造成的。
initBuffers();
initShaders();
GL11.glClearColor(0.2f, 0.2f, 0.2f, 1f);
while (!GLFW.glfwWindowShouldClose(window)) {
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
setUniforms();
GL11.glDrawElements(GL11.GL_TRIANGLES, trianglesToRender, GL11.GL_UNSIGNED_INT, 0);
GLFW.glfwSwapBuffers(window);
GLFW.glfwPollEvents();
}
该缓冲区仅设置一次,当前未更改。
public void initBuffers() {
float[] positions = controller.createPositionsFloatBuffer();
FloatBuffer positionsData = BufferUtils.createFloatBuffer(positions.length);
positionsData.put(positions);
positionsData.flip();
int[] indices = controller.createIndexIntBuffer();
trianglesToRender = indices.length;
IntBuffer indicesData = BufferUtils.createIntBuffer(indices.length);
indicesData.put(indices);
indicesData.flip();
int vao = GL30.glGenVertexArrays();
GL30.glBindVertexArray(vao);
int vboPosition = GL15.glGenBuffers();
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboPosition);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, positionsData, GL15.GL_STATIC_DRAW);
GL20.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 0, 0);
GL20.glEnableVertexAttribArray(0);
int vboIndices = GL15.glGenBuffers();
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, vboIndices);
GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesData, GL15.GL_STATIC_DRAW);
}
即使setUniforms()当前是渲染循环的一部分,但这些值目前在执行过程中均未更改。 LWJGLHelper是我上大学的那门课,所以我希望它能正常工作。
private void setUniforms() {
float[] modelMat = { 1f, 0f, 0f, 0f,
0f, 1f, 0f, 0f,
0f, 0f, 1f, 0f,
0f, 0f, 0f, 1f };
FloatBuffer model = LWJGLHelper.Convert(modelMat);
float[] camera = { 0f, 0f, 2f };
//if I change this value to something <= 1f,
//the entire screen goes red (the cube's color).
float[] up = { 0f, 1f, 0f };
float[] lookAtPoint = { 0f, 0f, 0f };
float[] viewMat = LWJGLHelper.LookAtMat(camera, up, lookAtPoint);
FloatBuffer view = LWJGLHelper.Convert(viewMat);
float[] projMat = LWJGLHelper.Perspective(500, 500, 0.001f, 10000f, 90f);
FloatBuffer projection = LWJGLHelper.Convert(projMat);
GL20.glUniformMatrix4fv(modelLocation, false, model);
GL20.glUniformMatrix4fv(viewLocation, false, view);
GL20.glUniformMatrix4fv(projectionLocation, false, projection);
}
我没有收到任何错误消息,当我将它们写入控制台时,位置和索引数据看起来还不错。
答案 0 :(得分:1)
前段时间我遇到了同样的问题,我的错误是我使用错误的顺序进行人脸剔除。当我切换缠绕顺序时,我的模型不再反转。