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

-1 c++ opengl sdl vbo

我实际上学习了一些OpenGL,我设法加载网格并在窗口中显示它.然后我用SDL做了一个函数,让我用箭头键旋转网格.但是当我潜入Shaders时我做了一些改变,但我不能为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
Run Code Online (Sandbox Code Playgroud)

Theese是我的着色器:

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

#version 130

out vec3 color;

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

}
Run Code Online (Sandbox Code Playgroud)

顶点着色器(用它来乱搞并尝试):

    #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;
}
Run Code Online (Sandbox Code Playgroud)

消息:我实际上用它来获取引用,但没有做到这一点:OpenGL - 对象转换和VBO

编辑:问题是绘图功能中的"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);
    }
}
Run Code Online (Sandbox Code Playgroud)

dat*_*olf 5

你的问题是,你实际上是在混合两种样式的OpenGL,它们并非不兼容,但有一种确实取代了另一种.

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

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

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


概括:glRotate仅影响当前所选旧样式,固定函数矩阵中的值.glRotate不会影响顶点位置.仅在使用变换矩阵集的当前设置值绘制时变换顶点位置.

使用着色器删除了上述所有内容,并且您有责任成为编程所需转换链的程序员以及设置它所需的所有步骤(创建转换矩阵,在着色器中应用转换).