使用 GLM 在 OpenGL 中绘制 2 个立方体

Posted

技术标签:

【中文标题】使用 GLM 在 OpenGL 中绘制 2 个立方体【英文标题】:Draw 2 cubes in OpenGL using GLM 【发布时间】:2013-10-15 12:14:36 【问题描述】:

所以我可以使用 OpenGL3.2+ 绘制一个旋转立方体并将其从 0,0,0 向左平移,但是当我尝试绘制第二个(向右)时,它不会渲染...

这是我的显示功能:

    void display()                                  
    
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glUseProgram(myShader.handle());

    GLuint matLocation = glGetUniformLocation(myShader.handle(), "ProjectionMatrix");
    glUniformMatrix4fv(matLocation, 1, GL_FALSE, &ProjectionMatrix[0][0]);

    spinY+=0.03;
    if(spinY>360) spinY = 0;

    glm::mat4 viewMatrix;
    viewMatrix = glm::translate(glm::mat4(1.0),glm::vec3(0,0,-100));        //viewing matrix
    ModelViewMatrix = glm::translate(viewMatrix,glm::vec3(-30,0,0));        //translate object from the origin
    ModelViewMatrix = glm::rotate(ModelViewMatrix,spinY, glm::vec3(0,1,0));                 //rotate object about y axis

    glUniformMatrix4fv(glGetUniformLocation(myShader.handle(), "ModelViewMatrix"), 1, GL_FALSE, &ModelViewMatrix[0][0]); //pass matrix to shader

    //Add the following line just before the line to draw the cube to 
    //check that the origin of the cube in eye space is (-30, 0, -100);
    result = glm::vec3(ModelViewMatrix * glm::vec4(0,0,0,1));
    std::cout<<glm::to_string(result)<<std::endl; //print matrix to get coordinates.

    myCube.render();
    glUseProgram(0);
    

我希望能够使用相同的 Cube 类/大小等,但只需再次渲染它(我认为这是最有效/最好的方法)。

我试过了

    void display()                                  
    
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glUseProgram(myShader.handle());

    GLuint matLocation = glGetUniformLocation(myShader.handle(), "ProjectionMatrix");
    glUniformMatrix4fv(matLocation, 1, GL_FALSE, &ProjectionMatrix[0][0]);

    spinY+=0.03;
    if(spinY>360) spinY = 0;

    glm::mat4 viewMatrix;
    viewMatrix = glm::translate(glm::mat4(1.0),glm::vec3(0,0,-100));        //viewing matrix
    ModelViewMatrix = glm::translate(viewMatrix,glm::vec3(-30,0,0));        //translate object from the origin
    ModelViewMatrix = glm::rotate(ModelViewMatrix,spinY, glm::vec3(0,1,0));                 //rotate object about y axis

    glUniformMatrix4fv(glGetUniformLocation(myShader.handle(), "ModelViewMatrix"), 1, GL_FALSE, &ModelViewMatrix[0][0]); //pass matrix to shader

    //Add the following line just before the line to draw the cube to 
    //check that the origin of the cube in eye space is (-30, 0, -100);
    result = glm::vec3(ModelViewMatrix * glm::vec4(0,0,0,1));
    std::cout<<glm::to_string(result)<<std::endl; //print matrix to get coordinates.

    myCube.render();

    glm::mat4 viewMatrix_TWO;
    viewMatrix_TWO = glm::translate(glm::mat4(1.0),glm::vec3(0,0,-100));        //viewing matrix
    ModelViewMatrix_TWO = glm::translate(viewMatrix_TWO,glm::vec3(30,0,0));     //translate object from the origin
    ModelViewMatrix_TWO = glm::rotate(ModelViewMatrix_TWO,spinY, glm::vec3(0,1,0));                 //rotate object about y axis

    glUniformMatrix4fv(glGetUniformLocation(myShader.handle(), "ModelViewMatrix_TWO"), 1, GL_FALSE, &ModelViewMatrix[0][0]); //pass matrix to shader

    myCube.render();

    glUseProgram(0);
    

很明显,我实现错了...如何在屏幕的任一侧获得一个立方体?谢谢。

更新

我意识到,我没有创建第二个立方体对象,但是现在实现了它,它仍然无法工作......我是否混淆了视图/模型矩阵的交互方式?我为每个对象创建了一个新对象....

新代码:

myCube.render();

spinX+=0.03;
if(spinX>360) spinX = 0;

glm::mat4 viewMatrix_Two,ModelViewMatrix_Two;
viewMatrix_Two = glm::translate(glm::mat4(1.0),glm::vec3(0,0,-100));        //viewing matrix
ModelViewMatrix_Two = glm::translate(viewMatrix_Two,glm::vec3(30,0,0));     //translate object from the origin
ModelViewMatrix_Two = glm::rotate(ModelViewMatrix_Two,spinX, glm::vec3(0,1,0));                 //rotate object about y axis

glUniformMatrix4fv(glGetUniformLocation(myShader.handle(), "ModelViewMatrix_Two"), 1, GL_FALSE, &ModelViewMatrix_Two[0][0]); //pass matrix to shader

myCube_Two.render();

更新

着色器:

    uniform mat4 ModelViewMatrix;
    //uniform mat4 ModelViewMatrix_Two; //NOT NEEDED - USED SAME SHADER OBJECT
    uniform mat4 ProjectionMatrix;

    in  vec3 in_Position;  // Position coming in
    in  vec3 in_Color;     // colour coming in
    out vec3 ex_Color;     // colour leaving the vertex, this will be sent to the fragment shader

    void main(void)
    
    gl_Position = ProjectionMatrix * ModelViewMatrix * vec4(in_Position, 1.0);
    //gl_Position = ProjectionMatrix * ModelViewMatrix_Two * vec4(in_Position, 1.0);
    ex_Color = in_Color;
    

【问题讨论】:

【参考方案1】:

最后,我创建了第二个 Cube 对象,第二个查看矩阵并将它们与我的着色器中已经建立的模型矩阵一起使用,似乎两个立方体都是单独调用/渲染的。

正确的代码是:

    glm::mat4 viewMatrix_Two, ModelViewMatrix_Two;
    viewMatrix_Two = glm::translate(glm::mat4(1.0),glm::vec3(0,0,-200));
    ModelViewMatrix = glm::translate(viewMatrix_Two,glm::vec3(30,0,0));
    ModelViewMatrix = glm::rotate(ModelViewMatrix,spinX, glm::vec3(1,0,0));

    glUniformMatrix4fv(glGetUniformLocation(myShader.handle(), "ModelViewMatrix"), 1, GL_FALSE, &ModelViewMatrix[0][0]); //pass matrix to shader

    myCube_Two.render();

【讨论】:

【参考方案2】:

除非您的着色器有一个名为 ModelViewMatrix_Two 的制服,否则这是行不通的。我看不出为什么你的着色器需要另一个统一的模型视图,因为你没有在同一个调用中绘制两个立方体。如果这不是问题,您可以发布您的着色器代码吗?

【讨论】:

哎呀,我想念你了...你是对的,我没有在我的着色器中提供 ModelViewMatrix_Two...我会试试的。 更正了 Uniform,它现在只渲染首先传递给着色器的 ModelViewMatrix... 解决了。感谢您的帮助...我只需要第二个矩阵作为视图并将其与我的着色器中的现有模型矩阵一起使用...现在可以正常工作了。我将在下面发布正确的代码。谢谢。

以上是关于使用 GLM 在 OpenGL 中绘制 2 个立方体的主要内容,如果未能解决你的问题,请参考以下文章

在OpenGL中使用统一参数(使用glm)

为 3D Cup 创建圆柱体基础(现代 OpenGL、GLM)

无法在opengl中绘制多个对象

OpenGL ES绘制魔方

使用 GLM 库在 OpenGL 中绘制顶点时如何使用常规坐标系

使用 OpenGL 绘制椭球的问题