C++ 不理解OpenGL转换
所以我开始学习OpenGL,并开始尝试在2D中做一些事情。不幸的是,我似乎无法使转换正常工作 下面是一些代码:C++ 不理解OpenGL转换,c++,opengl,glm-math,C++,Opengl,Glm Math,所以我开始学习OpenGL,并开始尝试在2D中做一些事情。不幸的是,我似乎无法使转换正常工作 下面是一些代码: glm::mat4 Transform; Transform = glm::scale(Transform, glm::vec3(2*(image.Size.x/renderTarget.Size.x),2 * (image.Size.y/renderTarget.Size.y), 1)); Transform = glm::translate( Transform,
glm::mat4 Transform;
Transform = glm::scale(Transform, glm::vec3(2*(image.Size.x/renderTarget.Size.x),2 * (image.Size.y/renderTarget.Size.y), 1));
Transform = glm::translate(
Transform,
glm::vec3(2 * (Position.x / renderTarget.Size.x) - 1.0f,2 * (-Position.y / renderTarget.Size.y) + 1.0f,1)
);
glUniformMatrix4fv(uniTrans, 1, GL_FALSE, glm::value_ptr(Transform));
我想画的形状是:
float verts[] = {
0.0f,0.0f,
1.0f,0.0f,,
1.0f,-1.0f,
0.0f,-1.0f
};
这一点是,我正在将常规OpenGL坐标(中间有(0,0))转换为原点位于左上角。不幸的是,缩放确实会弄乱位置,如果我将其关闭,移动它,则位置工作正常,但我不知道为什么。如果您以相反的顺序执行这两个操作,则会有所帮助。GLM和OpenGL都使用列主矩阵和后乘法。因此,变换的正确顺序是平移、旋转、缩放。好吧,切换顺序是可行的,但我不明白为什么。在线上的所有内容都是scale-rotate-translate。这是因为您可以有效地反向读取OpenGL代码,因此代码中最底层的OpenGL指令实际上就是您希望首先执行的指令(这主要是经过压缩和总结的)我会尽快找出一些参考资料来说明工作原理和理由:)类似的解释在:)@user1152717:这是正确的数学顺序,但OpenGL使用列主矩阵和后乘法,正如我首先提到的。这意味着第一个矩阵运算实际上发生在最后。这是一个非常方便的属性,使得OpenGL的遗留矩阵堆栈非常有用;频繁更改的对象变换位于堆栈顶部,查看变换位于底部。如果GL像D3D一样使用行主矩阵,那么查看转换将需要在堆栈的顶部,这将使转换单个对象成为一个真正的麻烦。