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

时间:2016-06-28 20:26:07

标签: c++ opengl matrix rotation glsl

我目前正在用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个问题,但它根本没用。 我知道为什么我的纹理不想自己旋转!

1 个答案:

答案 0 :(得分:2)

  

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

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