OpenGL/C++ - 转换和 VBO/Shader 不让我转换?

OpenGL/C++ - Transformation and VBOs / Shader dont let me transform?

我实际上学习了一些 OpenGL,我设法加载了一个网格并将其显示在 window 中。然后我用 SDL 做了一个函数,让我用箭头键旋转网格。 但是当我深入研究着色器时,我做了一些更改,但我无法获得 3d 模型的简单旋转。

这是我的绘图函数:

        glMatrixMode(GL_MODELVIEW); //set the matrix to model view mode

        glPushMatrix(); // push the matrix

        glRotatef(1.0,0.0,0.0,1.0); //apply transformation

        //Primer buffer, modelo
        glBindBuffer(GL_ARRAY_BUFFER, _vboID);

        glEnableVertexAttribArray(0);

        glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 0, 0);

        glDrawArrays(GL_TRIANGLES, 0,vertices.size());

        glDisableVertexAttribArray(0);

        glBindBuffer(GL_ARRAY_BUFFER, 0);

        glPopMatrix();//pop the matrix

        glMatrixMode(GL_PROJECTION); // Apply projection matrix again

这些是我的着色器:

片段着色器(仅用于给定颜色)

#version 130

out vec3 color;

void main()
{
    color = vec3(0.0,0.5,1.0);

}

Vertex Shader(用它来捣乱试试):

    #version 130

in vec3 vertexPosition;

void main()
{
    gl_Position.x = vertexPosition.x;
    gl_Position.y = vertexPosition.y-1.0;
    gl_Position.z = vertexPosition.z;
    gl_Position.w = 1.0;
}

来源:我实际上用它来获得参考,但没有成功:OpenGL - Object Transformations and VBOs

编辑:问题是绘图函数中的 "glRotatef" 命令不旋转网格...

EDIT2:查看评论

void GLSLProgram::use()
{
    glUseProgram(_shaderEnteroID);
    for(int i = 0; i< _numeroAtributos; i++)
    {
        glEnableVertexAttribArray(i);
    }
}
void GLSLProgram::unuse()
{
    glUseProgram(0);
    for(int i = 0; i< _numeroAtributos; i++)
    {
        glDisableVertexAttribArray(i);
    }
}

你的问题是,你实际上混合了两种风格的 OpenGL,这两种风格并不不兼容,但一种确实取代了另一种。

所以有老式的、固定功能的管道 OpenGL(没有着色器)。在这里,您将使用 glRotate 是其中之一的矩阵操作函数设置转换矩阵(其他函数是 glLoadIdentity、glLoadMatrix、glMultMatrix、glTranslate、glScale 和 glOrtho)。这些函数影响 modelviewprojectiontexture颜色矩阵。其中哪些是由矩阵模式决定的,矩阵模式是使用glMatrixMode设置的。在绘制一些东西时,这些矩阵的值然后用于固定的转换链(顶点位置首先乘以模型视图矩阵,确定一些照明值然后应用投影矩阵)。

着色器不关心这些固定函数矩阵! 或者更确切地说,在 OpenGL-2.x 和兼容性配置文件 OpenGL-3 中,固定函数矩阵可用于着色器作为一组预定义变量。在新代码中你不应该使用它们。这意味着,不应使用所有旧式 OpenGL 矩阵函数;实际上 必须 如果您希望您的代码面向未来,则不能使用这些功能,因为这些功能在核心配置文件(或向前兼容的)OpenGL 版本中不可用。

相反,您应该使用适当的矩阵数学库构建变换矩阵(旧式 OpenGL 函数一直不能很好地替代此类函数),并将生成的矩阵作为一对自定义函数传递给着色器定义了 uniform 变量。然后在着色器中应用适当的转换操作 yourself.


概括一下:glRotate 仅影响当前选定的旧样式、固定函数矩阵中的值。 glRotate 不影响顶点位置。顶点位置仅在使用变换矩阵集的当前设置值绘制时进行变换。

有了着色器,上面的所有内容都被删除了,作为程序员,您有责任编写所需的转换链和设置它所需的所有步骤(创建转换矩阵,在着色器中应用转换)。