Opengl es 顶点着色器和片段着色器中旋转矩阵的差异结果
我对旋转矩阵有一个问题。它在顶点和片段着色器中给出了不同的结果 有两个对象。 首先是球体。球体需要在片段着色器中旋转其纹理。它运行良好,与GUI算法匹配。使用完全相同的算法 第二个对象是点精灵。它应该围绕球体旋转相同的角度 我在片段和顶点着色器中使用下一个算法:Opengl es 顶点着色器和片段着色器中旋转矩阵的差异结果,opengl-es,glsl,opengl-es-2.0,webgl,Opengl Es,Glsl,Opengl Es 2.0,Webgl,我对旋转矩阵有一个问题。它在顶点和片段着色器中给出了不同的结果 有两个对象。 首先是球体。球体需要在片段着色器中旋转其纹理。它运行良好,与GUI算法匹配。使用完全相同的算法 第二个对象是点精灵。它应该围绕球体旋转相同的角度 我在片段和顶点着色器中使用下一个算法: mat3 rotateX = mat3( 1.0, 0, 0, 0, cos(angles.x), -sin(angles.x), 0, sin(angles.x), cos(angles.x) ); m
mat3 rotateX = mat3(
1.0, 0, 0,
0, cos(angles.x), -sin(angles.x),
0, sin(angles.x), cos(angles.x)
);
mat3 rotateY = mat3(
cos(angles.y), 0, sin(angles.y),
0, 1, 0,
-sin(angles.y), 0, cos(angles.y)
);
mat3 rotateZ = mat3(
cos(angles.z), -sin(angles.z), 0,
sin(angles.z), cos(angles.z), 0,
0, 0, 1
);
float Fi = (-current.x) * M_PI;
float Te = current.y * M_PI;
vec3 coord;
coord.x = sin(Te) * cos(Fi);
coord.y = sin(Te) * sin(Fi);
coord.z = cos(Te);
coord = vec3(coord.x, coord.y, coord.z) * rotateX * rotateY * rotateZ;
我有以下问题。如果从任意一个轴旋转,则一切正常。如果通过两个或三个轴进行旋转,则球体和点以不同的方向旋转
其正常行为起始位置和单轴旋转:
其开始旋转后:
我做错了什么
使用WebGL OpenGL ES2。我解决了这个问题。
只需要按相反的顺序乘以旋转矩阵
片段旋转着色器
mat3 rotateX = mat3(
1.0, 0, 0,
0, cos(angles.x), -sin(angles.x),
0, sin(angles.x), cos(angles.x)
);
mat3 rotateY = mat3(
cos(angles.y), 0, sin(angles.y),
0, 1, 0,
-sin(angles.y), 0, cos(angles.y)
);
mat3 rotateZ = mat3(
cos(angles.z), -sin(angles.z), 0,
sin(angles.z), cos(angles.z), 0,
0, 0, 1
);
float Fi = (-cUv.x + 0.25) * 2.0 * M_PI;
float Te = cUv.y * M_PI;
vec3 coord;
coord.x = sin(Te) * cos(Fi);
coord.y = sin(Te) * sin(Fi);
coord.z = cos(Te);
coord = coord * rotateX * rotateY * rotateZ;
顶点旋转着色器
angles = -angles;
mat3 rotateX = mat3(
1.0, 0, 0,
0, cos(angles.x), -sin(angles.x),
0, sin(angles.x), cos(angles.x)
);
mat3 rotateY = mat3(
cos(angles.y), 0, sin(angles.y),
0, 1, 0,
-sin(angles.y), 0, cos(angles.y)
);
mat3 rotateZ = mat3(
cos(angles.z), -sin(angles.z), 0,
sin(angles.z), cos(angles.z), 0,
0, 0, 1
);
float Fi = (-curPosition.x) * M_PI; //hor
float Te = (curPosition.y) * M_PI; //vert
vec3 coord;
coord.x = sin(Te) * cos(Fi);
coord.y = sin(Te) * sin(Fi);
coord.z = cos(Te);
return coord * rotateZ * rotateY * rotateX;
为什么不在顶点着色器中使用相同的旋转矩阵旋转球体网格和点精灵?在两个着色器中是否以相同的顺序进行乘法?在OpenGL中,更常见的是使用矩阵*向量。Vector*矩阵也可以工作,但就好像矩阵被转置一样。对于表示旋转的3x3矩阵,转置矩阵表示相反方向的相同旋转。