C++ 顶点着色器opengl中MVP矩阵的计算

C++ 顶点着色器opengl中MVP矩阵的计算,c++,opengl,C++,Opengl,我在主代码中计算了MVP矩阵,然后将计算移到顶点着色器中 最后,它不再工作了。为什么?除了我放置它们的位置之外,计算没有什么不同 有人能解释一下吗?我认为在着色器中计算MVP矩阵是openGL版本>3.0中的正确方法,对吗?但我不能让它工作。当我应用新代码时,太阳消失了 旧计算: void renderSun(int i){ glPushMatrix(); glLoadIdentity(); glActiveTexture(GL_TEXTURE0); glBind

我在主代码中计算了MVP矩阵,然后将计算移到顶点着色器中

最后,它不再工作了。为什么?除了我放置它们的位置之外,计算没有什么不同

有人能解释一下吗?我认为在着色器中计算MVP矩阵是openGL版本>3.0中的正确方法,对吗?但我不能让它工作。当我应用新代码时,太阳消失了

旧计算:

void renderSun(int i){
    glPushMatrix();
    glLoadIdentity();
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, sun_TextureID);
    glUniform1i(sun_TextureLocation, 0);
    glm::mat4 Projection = glm::ortho(0.0f, static_cast<float>(width), 0.0f, static_cast<float>(height), 1000.0f, -1000.0f);
    glm::mat4 View = glm::lookAt(
        glm::vec3(0, 120, 1),
        glm::vec3(0, 0, 0),
        glm::vec3(0, 1, 0)
    );
    /* Animations */
    GLfloat angle = (GLfloat) (i);
    glm::mat4 Model = glm::mat4(1.0f);
    Model = glm::translate(Model, glm::vec3(CENTRE_X, 0.0f, CENTRE_Z));
    Model = glm::scale(Model, SUN_SIZE);
    Model = glm::rotate(Model, angle * 0.5f, glm::vec3(0.0f, 0.0f, 1.0f));
    /* ******* */

    glm::mat4 MVP = Projection * View * Model;
    glUniformMatrix4fv(glGetUniformLocation(shaderProgramSun, "mvpMatrix"), 1, GL_FALSE, glm::value_ptr(MVP));
    glDrawElements(GL_TRIANGLES, numsToDraw, GL_UNSIGNED_INT, NULL);
    glPopMatrix();
}
void renderSun(int i){
    glPushMatrix();
    glLoadIdentity();
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, sun_TextureID);
    glUniform1i(sun_TextureLocation, 0);
    glm::mat4 Projection = glm::ortho(0.0f, static_cast<float>(width), 0.0f, static_cast<float>(height), 1000.0f, -1000.0f);
    glm::mat4 View = glm::lookAt(
        glm::vec3(0, 120, 1),
        glm::vec3(0, 0, 0),
        glm::vec3(0, 1, 0)
    );
    /* Animations */
    GLfloat angle = (GLfloat) (i);
    glm::mat4 Model = glm::mat4(1.0f);
    Model = glm::translate(Model, glm::vec3(CENTRE_X, 0.0f, CENTRE_Z));
    Model = glm::scale(Model, SUN_SIZE);
    Model = glm::rotate(Model, angle * 0.5f, glm::vec3(0.0f, 0.0f, 1.0f));

    GLint modelLocation = glGetUniformLocation(shaderProgramSun, "model");
    GLint viewLocation = glGetUniformLocation(shaderProgramSun, "view");
    GLint projLocation = glGetUniformLocation(shaderProgramSun, "projection");

    glUniformMatrix4fv(viewLocation, 1, GL_FALSE, glm::value_ptr(View));
    glUniformMatrix4fv(projLocation, 1, GL_FALSE, glm::value_ptr(Projection));
    glUniformMatrix4fv(modelLocation, 1, GL_FALSE, glm::value_ptr(Model));
    /* ******* */

    glDrawElements(GL_TRIANGLES, numsToDraw, GL_UNSIGNED_INT, NULL);
    glPopMatrix();
}

原则上,这是可行的。错误可能在目前粘贴的函数之外,可能在调用这些函数时未正确设置GL状态。我发现你的“旧”代码有时使用“行星”,而新代码使用“太阳”。还请注意,在VS中进行计算并不是在一般情况下在CPU上预计算的更好方法。渲染纹理对象的步骤包括:设置几何体(顶点)、设置着色器、设置纹理(图像输入)以及最终渲染对象。我上面粘贴的代码处于渲染阶段。此外,旧代码和新代码之间的区别只是我进行MVP计算的地方,步骤保持不变,旧代码正常工作。然后我假设我所有的计算和每一步的顺序都是正确的。您认为错误可能在哪里?另外,我认为,在GPU和CPU之间共享工作负载将提高性能。你认为这是真的吗?VS是按顶点运行的,而CPU上的计算是按对象进行的。现在,它取决于每个对象有多少个顶点,在这些顶点中,盈亏平衡点将是多少。
#version 330 core
precision highp float;
layout (location = 0) in vec3 sun_Position;
varying vec4 Sun_Texture_Coord;

uniform mat4 mvpMatrix;
uniform mat4 projection;
uniform mat4 view;
uniform mat4 model;

void main(void){
    gl_Position = projection * view * model * vec4(sun_Position, 1.0f);
    //gl_Position = mvpMatrix * vec4(sun_Position, 1.0);
    Sun_Texture_Coord = vec4(sun_Position, 1.0);
}