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

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

本文关键字:转换 Shader c++ OpenGL VBOs      更新时间:2023-10-16

我实际上学习了一些OpenGL,我设法加载一个网格并在窗口中显示它。然后我用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

这些是我的着色器:

Fragment Shader(only for give color)

#version 130
out vec3 color;
void main()
{
    color = vec3(0.0,0.5,1.0);
}

顶点着色器(使用它来混乱和尝试):

    #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 -对象转换和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是其中之一(其他是glloadiidentity, glLoadMatrix, glMultMatrix, glTranslate, glScale和glOrtho)。这些函数对模型视图投影纹理颜色矩阵的值产生影响。其中哪一个是由矩阵模式决定的,它是使用glMatrixMode设置的。在绘制一些东西时,这些矩阵的值然后在固定的转换链中使用(顶点位置首先乘以模型视图矩阵,然后确定一些照明值,然后应用投影矩阵)。

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

相反,你应该用一个适当的矩阵数学库(旧风格的OpenGL函数总是一个可怜的替代品)来构建变换矩阵,并将结果矩阵作为一对自定义的统一变量传递给着色器。然后在着色器中你自己应用适当的变换操作


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

有了着色器,上面的一切都被删除了,你的责任是作为程序员编程所需的转换链和所有必要的步骤来设置它(创建转换矩阵,在着色器中应用转换)。