我正在为游戏引擎创建一个广告牌着色器,我想在此着色器中重置四边形的旋转。我正在编写GLSL中的着色器,这是顶点着色器:
#version 400 core
layout (location = 0) in vec3 in_position;
layout (location = 1) in vec2 in_texcoords;
out data
{
vec2 tex_coords;
} vs_out;
uniform mat4 pr_matrix;
uniform mat4 ml_matrix = mat4(1.0);
uniform mat4 vw_matrix = mat4(1.0);
void main()
{
gl_Position = pr_matrix * vw_matrix * ml_matrix * vec4(in_position, 1.0);
vs_out.tex_coords = in_texcoords;
}
我知道我可以通过将左上角设置为
来重置模型矩阵的旋转1 0 0
0 1 0
0 0 1
,但现在我希望四边形能够绕x和z轴旋转,但不能围绕y轴旋转。有人知道如何仅在一个轴上重置矩阵的旋转吗?
答案 0 :(得分:0)
这可能会有所帮助。解决方案使用解决的旋转矩阵,除了移植到GLSL。根据您是否要回收trig函数(cos / sin),有许多版本的旋转矩阵。由于GFX在SIMD上更好,因此该功能就此编码。
mat4 rotationMatrix(vec3 axis, float angle)
{
axis = normalize(axis);
float s = sin(angle);
float c = cos(angle);
float oc = 1.0 - c;
return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0.0,
oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0.0,
oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0.0,
0.0, 0.0, 0.0, 1.0);
}
来源:http://www.neilmendoza.com/glsl-rotation-about-an-arbitrary-axis/