我的对象的内部似乎被渲染,而不是外部

时间:2019-08-14 17:29:46

标签: opengl lwjgl glfw

我编写了一个程序,该程序读取我现在要显示的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);
}

我没有收到任何错误消息,当我将它们写入控制台时,位置和索引数据看起来还不错。

1 个答案:

答案 0 :(得分:1)

前段时间我遇到了同样的问题,我的错误是我使用错误的顺序进行人脸剔除。当我切换缠绕顺序时,我的模型不再反转。

Face Culling Example/Tutorial