OpenGL/ c++ -转换和VBOs / Shader不让我转换
OpenGL/C++ - Transformation and VBOs / Shader dont let me transform?
我实际上学习了一些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不影响顶点位置。顶点位置仅在使用转换矩阵集合的当前设置值绘制时进行转换。
有了着色器,上面的一切都被删除了,你的责任是作为程序员编程所需的转换链和所有必要的步骤来设置它(创建转换矩阵,在着色器中应用转换)。
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 是否可以从int转换为enum类类型
- 将 DirectX11 ID3D11Texture2D 从 Shader 转换为 OpenCV IplImage
- OpenGL/ c++ -转换和VBOs / Shader不让我转换