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 旋转矩阵无法按预期工作的主要内容,如果未能解决你的问题,请参考以下文章