我已经可以在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)周围旋转普通精灵
结果矩阵=(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进行旋转?
答案 0 :(得分:2)
此:
与此不一样:
Result Matrix = (Rot Matrix * Translate Matrix) * Anti-Traslate Matrix.
如果你想围绕点(x,y,z)旋转,那么你需要这样做:
与以下内容相同:
Result Matrix = T1 * R1 * T2