【发布时间】: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。 -
哎呀,真丢人。我尝试了不同的方法,当我从所有未使用的代码中清理代码时,我搞砸了一些东西。我对其进行了编辑以使其正常工作。
标签: c++ opengl matrix rotation glsl