Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不理解OpenGL转换_C++_Opengl_Glm Math - Fatal编程技术网

C++ 不理解OpenGL转换

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,

所以我开始学习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::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一样使用行主矩阵,那么查看转换将需要在堆栈的顶部,这将使转换单个对象成为一个真正的麻烦。