GLSL 2D 旋转矩阵无法按预期工作

Posted

技术标签:

【中文标题】GLSL 2D 旋转矩阵无法按预期工作【英文标题】:GLSL 2D Rotation Matrix does not work as expected 【发布时间】:2016-06-28 20:26:07 【问题描述】:

我目前正在用 C++ 编写用于 2D 应用程序的游戏引擎。但目前我坚持在顶点着色器中旋转精灵。我有点关注this 解释。我不想使用 GLM,所以我必须为自己写一些东西。 目前,这是我的纹理着色器。

顶点着色器

out vec2 fragPos;
out vec2 fragUV;

uniform vec2 pos;
uniform vec2 size;
uniform float rotation;

void main()
//gl_Position is OpenGL defined
gl_Position.z = 0.0;
gl_Position.w = 1.0;
gl_Position.x = vertPos.x + pos.x*2 - 1;
gl_Position.y = vertPos.y + pos.y*2 - 1;

mat4 rotationMat = mat4(cos(rotation), sin(rotation) * -1, 0, 0, 
                        sin(rotation), cos(rotation), 0, 0, 
                        0, 0, 1, 0, 
                        0, 0, 0, 1);


gl_Position *= rotationMat;

//vec2 size
if(size.x != 0 || size.y != 0)
    if(gl_VertexID != 0)
        switch(gl_VertexID)
            case 1: gl_Position.x += size.x; break;
            case 2: gl_Position.y += size.y; break;
            case 3: gl_Position.y += size.y; break;
            case 4: gl_Position.x += size.x; gl_Position.y += size.y; break;
            case 5: gl_Position.x += size.x; break;
        
    



fragPos = vertPos;
fragUV = vec2(vertUV.x, 1.0 - vertUV.y); 

无论我通过哪个值,旋转都不会改变。只有精灵的位置。 Here 就是它的样子。请记住,纹理应该被压扁。我还检查了this 问题,但它根本没有帮助。 我谁知道为什么我的纹理不想自己旋转!

【问题讨论】:

您尚未发布有效的着色器。它使用尚未声明的变量 (rotateZ)。提供minimal reproducible example。 哎呀,真丢人。我尝试了不同的方法,当我从所有未使用的代码中清理代码时,我搞砸了一些东西。我对其进行了编辑以使其正常工作。 【参考方案1】:

无论我通过哪个值,旋转都不会改变。只有精灵的位置。

这正是您的代码所做的。您计算精灵的一个角点(对于图元的所有顶点都相同),对其应用旋转,然后通过添加x/y 偏移来构建一个轴对齐的矩形,具体取决于顶点ID。如果要旋转整个物体,则必须在计算出实际矩形角后应用旋转。

【讨论】:

以上是关于GLSL 2D 旋转矩阵无法按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL/GLSL/GLM - Skybox 像第三人称一样旋转

应用于 3D 点的 2D 旋转矩阵

第八章:矩阵和线性变换

GLM 旋转矩阵与预期结果不同

矩阵非均匀比例旋转问题

在变换中缩放和旋转矩阵?