我目前正在用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个问题,但它根本没用。 我知道为什么我的纹理不想自己旋转!
答案 0 :(得分:2)
无论我传递哪个值,旋转都不会改变。只有精灵的位置。
这正是您的代码所做的。您计算精灵的一个角点(对于图元的所有顶点都是相同的),对其应用旋转,然后通过添加x
/ y
偏移来构建轴对齐的矩形取决于顶点ID。如果要旋转整个事物,则必须在计算实际矩形角后应用旋转。