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)。这些函数影响 modelview、projection、texture 或 颜色矩阵。其中哪些是由矩阵模式决定的,矩阵模式是使用glMatrixMode设置的。在绘制一些东西时,这些矩阵的值然后用于固定的转换链(顶点位置首先乘以模型视图矩阵,确定一些照明值然后应用投影矩阵)。
着色器不关心这些固定函数矩阵! 或者更确切地说,在 OpenGL-2.x 和兼容性配置文件 OpenGL-3 中,固定函数矩阵可用于着色器作为一组预定义变量。在新代码中你不应该使用它们。这意味着,不应使用所有旧式 OpenGL 矩阵函数;实际上 必须 如果您希望您的代码面向未来,则不能使用这些功能,因为这些功能在核心配置文件(或向前兼容的)OpenGL 版本中不可用。
相反,您应该使用适当的矩阵数学库构建变换矩阵(旧式 OpenGL 函数一直不能很好地替代此类函数),并将生成的矩阵作为一对自定义函数传递给着色器定义了 uniform 变量。然后在着色器中应用适当的转换操作 yourself.
概括一下:glRotate 仅影响当前选定的旧样式、固定函数矩阵中的值。 glRotate 不影响顶点位置。顶点位置仅在使用变换矩阵集的当前设置值绘制时进行变换。
有了着色器,上面的所有内容都被删除了,作为程序员,您有责任编写所需的转换链和设置它所需的所有步骤(创建转换矩阵,在着色器中应用转换)。
我实际上学习了一些 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)。这些函数影响 modelview、projection、texture 或 颜色矩阵。其中哪些是由矩阵模式决定的,矩阵模式是使用glMatrixMode设置的。在绘制一些东西时,这些矩阵的值然后用于固定的转换链(顶点位置首先乘以模型视图矩阵,确定一些照明值然后应用投影矩阵)。
着色器不关心这些固定函数矩阵! 或者更确切地说,在 OpenGL-2.x 和兼容性配置文件 OpenGL-3 中,固定函数矩阵可用于着色器作为一组预定义变量。在新代码中你不应该使用它们。这意味着,不应使用所有旧式 OpenGL 矩阵函数;实际上 必须 如果您希望您的代码面向未来,则不能使用这些功能,因为这些功能在核心配置文件(或向前兼容的)OpenGL 版本中不可用。
相反,您应该使用适当的矩阵数学库构建变换矩阵(旧式 OpenGL 函数一直不能很好地替代此类函数),并将生成的矩阵作为一对自定义函数传递给着色器定义了 uniform 变量。然后在着色器中应用适当的转换操作 yourself.
概括一下:glRotate 仅影响当前选定的旧样式、固定函数矩阵中的值。 glRotate 不影响顶点位置。顶点位置仅在使用变换矩阵集的当前设置值绘制时进行变换。
有了着色器,上面的所有内容都被删除了,作为程序员,您有责任编写所需的转换链和设置它所需的所有步骤(创建转换矩阵,在着色器中应用转换)。