이미 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에 대해 알고에 포인트 스프라이트를 회전시킬 수 있습니다 - 그것은 좋아요, 학술 목적
m3 r;
rot_m3(r, 90.0f);
...
glUniformMatrix3fv(/*um_tex uniform*/, 1, GL_FALSE, res);
glDrawArrays(GL_POINTS, 0, /*particles count*/);
...
,369) (ParticlesDraw에 자신의 매트릭스)
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];
}
을 처리하는 1,363,210
또한 전 (X POS 번역 POS (-x, -y, -z)
- 알고 , y, z)
결과 행렬 = (행렬 행렬 * 행열 행렬) * Anti-Traslate 행렬.
내가 45 포인트 스프라이트를 회전하려면, 32,64,72 예를 들어, 어느 정도 (지금은 회전하지, 마지막 프레임 45 ° 오른쪽)
그러나이 경우 , 난의 중심에 번역 할 수 있습니다 tex (0.5, 0.5), 그러나 anti-translate는 무엇이 될까요? - (0.0, 0.0)?
나는 이런 식으로 시도해 보았지만, 예를 들어 30 회전, 45 회전, 내 텍스처가 64 * 64 인 경우에도 작동하지 않습니다. 회전을 위해 gl_PointSize를 64.0으로 설정해야합니까?