如何在OpenGL

时间:2016-11-28 16:13:52

标签: c++ opengl

我正在尝试使用OpenGL进行一些简单的图形处理,但我遇到了两个对象的问题,其中一个是静态的,另一个是移动的。对象是一个简单的立方体和一个代表地板的正方形。我希望立方体向下移动直到它接触到地板(好像它正在移动)。我可以自己渲染掉落的立方体,我可以自己找到地板。但是当我想让它们都在同一场景中时,我遇到了问题,因为它们要么都掉下来(立方体行为),要么两者都停留在同一个地方(地板行为)。这两个选项中的哪一个出现是由于我是否推动和弹出我的模型矩阵 - 当我弹出和推动时,它们保持静止,当我不这样做时,它们会掉下来(我猜这是有意义的,因为我绘制地板然后是立方体。

这是我在程序绘制阶段的代码:

//Clear the screen to the colour specified earlier, as well as the depth
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glUseProgram(programID); // Use our shader
glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]);

//RENDER THE FLOOR
pushMat(Model); //PUSH - WHEN ACTIVE, CUBE AND FLOOR FALL. WHEN COMMENTED OUT, BOTH FLOOR AND CUBE ARE STATIC
    MVP = Projection * View * Model; //These are all matrices
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, floorVertexBuffer);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);

    //FLOOR COLOURS
    glEnableVertexAttribArray(1);
    glBindBuffer(GL_ARRAY_BUFFER, colorbuffer2);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
    glDrawArrays(GL_TRIANGLES, 0, 2*3); //2 triangles, of 3 vertices each

Model = popMat(); //POP - WHEN ACTIVE, CUBE AND FLOOR FALL. WHEN COMMENTED OUT, BOTH FLOOR AND CUBE ARE STATIC

glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);


//RENDER THE CUBE
pushMat(Model); //PUSH - WHEN ACTIVE, CUBE AND FLOOR FALL. WHEN COMMENTED OUT, BOTH FLOOR AND CUBE ARE STATIC
    Model = translate(Model, vec3(0.0f, deltaY, 0.0f)); //deltaY is the change in the y position of the cube, it is calculated earlier in this draw loop
    MVP = Projection * View * Model;

    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, cubeVertexBuffer);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);

    //CUBE COLOURS
    glEnableVertexAttribArray(1);
    glBindBuffer(GL_ARRAY_BUFFER, colorbuffer);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);

    //DRAW CUBE
    glDrawArrays(GL_TRIANGLES, 0, 12 * 3); //12 triangle, of 3 vertices each
Model = popMat(); //FINAL POP - WHEN ACTIVE, CUBE AND FLOOR FALL. WHEN COMMENTED OUT, BOTH FLOOR AND CUBE ARE STATIC

glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);

我的推送和弹出功能的代码:

stack<mat4> modelViewStack; //This is initialised with the identity matrix in the main function

void pushMat(mat4 m)
{
    modelViewStack.push(m);
}

mat4 popMat()
{
    mat4 temp = modelViewStack.top();
    modelViewStack.pop();
    return temp;
}

关于我是如何得到它的任何线索所以地板停留在一个地方并且立方体向下移动?我很乐意帮助解释任何代码,提供更多代码或回答任何问题。谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]);

此调用需要在每次调用glDrawArrays之前显示。现在,在渲染所有内容之前,它只被调用一次,这意味着两个对象都接收到相同的MVP矩阵。

另外,我会重新考虑使用矩阵堆栈实现此逻辑的逻辑。这就是它在Legacy OpenGL中的工作方式(因为所有东西都依赖于Global State,以及其他一些原因)但是当今我们可以简单地将Matrices与单个对象关联起来并根据需要简单地绑定它时,这并不是显而易见的。 / p>