ポイント スプライトを 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 マトリックス * Translate マトリックス) * Anti-Translate マトリックス。
ポイント スプライトを 45、32、64、72 などの任意の角度に回転させたい (現在は正しく回転せず、最後のフレームは 45 度)
しかし、この場合、tex (0.5, 0.5) の中心に変換できますが、アンチ変換 - (0.0, 0.0) とは何でしょう?
このようなことを試してみましたが、たとえば 30、45 回転では機能しません。また、テクスチャが 64*64 の場合、回転のために gl_PointSize を 64.0 に設定する必要がありますか?