我已经可以将点精灵旋转 0、90、180、270 度
片段着色器
precision lowp float;
uniform sampler2D us_tex;
uniform mat3 um_tex;
void main ()
{
vec2 tex_coords = (um_tex * vec3(gl_PointCoord, 1.0)).xy;
gl_FragColor = texture2D(us_tex, tex_coords);
}
2*2 矩阵运算(我知道 GLM - 自己处理矩阵的学术目的很棒)
typedef GLfloat m3[9]//3*3 matrix
#define DEG_TO_RAD(x) (x * M_PI/180.0f)
void ident_m3(m3 res)
{
memset(res, 0, sizeof(m3));
res[0] = res[4] = res[8] = 1.0f;
}
void trans_m3(m3 res, const p2* pos)
{
ident_m3(res);
res[7] = pos->x;
res[8] = pos->y;
}
void mult_m3(m3 res, const m3 m1, const m3 m2)
{
res[0] = m1[0] * m2[0] + m1[3] * m2[1] + m1[6] * m2[2];
res[1] = m1[1] * m2[0] + m1[4] * m2[1] + m1[7] * m2[2];
res[2] = m1[2] * m2[0] + m1[5] * m2[1] + m1[8] * m2[2];
res[3] = m1[0] * m2[3] + m1[3] * m2[4] + m1[6] * m2[5];
res[4] = m1[1] * m2[3] + m1[4] * m2[4] + m1[7] * m2[5];
res[5] = m1[2] * m2[3] + m1[5] * m2[4] + m1[8] * m2[5];
res[6] = m1[0] * m2[6] + m1[3] * m2[7] + m1[6] * m2[8];
res[7] = m1[1] * m2[6] + m1[4] * m2[7] + m1[7] * m2[8];
res[8] = m1[2] * m2[6] + m1[5] * m2[7] + m1[8] * m2[8];
}
在 ParticlesDraw()
m3 r;
rot_m3(r, 90.0f);
...
glUniformMatrix3fv(/*um_tex uniform*/, 1, GL_FALSE, res);
glDrawArrays(GL_POINTS, 0, /*particles count*/);
...
我也知道如何围绕 pos(x,y,z) 旋转普通精灵
- 转换为 pos(-x,-y,-z)
- 旋转
- 转换为 pos(x,y,z)
结果矩阵 = (Rot Matrix * Translate Matrix) * Anti-Traslate Matrix。
我想将点精灵旋转到 45、32、64、72 例如任何度数(现在它旋转不正确,最后一帧 45 度)
但在这种情况下,我可以翻译到 tex 的中心 (0.5, 0.5),但是反翻译会是什么 - (0.0, 0.0)?
我尝试了类似的方法,但它不适用于例如 30、45 旋转,如果我的纹理是 64*64,我是否需要将 gl_PointSize 设置为 64.0 进行旋转?