我正在尝试旋转顶点着色器内的纹理。我有一个指向纹理的指针,出于我的目的,该指针逆时针旋转 90 度。我不想在调用glTexImage2D()
之前手动旋转纹理。
我只能使用#version 120
。
这是我原来的顶点着色器:
#version 120
attribute vec4 a_position;
attribute vec2 a_texCoord;
varying vec2 v_texCoord;
void main()
{
gl_Position = a_position;
v_texCoord = a_texCoord;
}
仅出于测试目的,我以这种方式修改了顶点着色器,但出现黑屏:
#version 120
const float w = 0.76;
float mat3 A = ( 1, 0, 0,
0, 1, 0,
0, 0, 1 );
attribute vec3 a_position;
attribute vec2 a_texCoord;
varying vec2 v_texCoord;
void main()
{
A = ( cos(w), -sin(w), 0,
sin(w), cos(w), 0,
0, 0, 1 );
gl_Position = A * vec4(a_position, 1.0f);
v_texCoord = a_texCoord;
}
最佳答案
您遇到编译错误。作业不起作用:
A = (cos(w), -sin(w), 0, sin(w), cos(w), 0, 0, 0, 1 );
您必须构造一个mat3
。然后您可以分配该矩阵(另请参阅 GLSL Programming/Vector and Matrix Operations ):
A = mat3(cos(w), -sin(w), 0.0,
sin(w), cos(w), 0.0,
0.0, 0.0, 1.0);
您不能将 vec4
与 mat3
相乘。您必须将 vec3
与 mat3
gl_Position = vec4(A * a_position, 1.0f);
我什至无法想象你对这句话的期望:
float mat3 A = ( 1, 0, 0, 0, 1, 0, 0, 0, 1 );
正确的是:
mat3 A = mat3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0);
这与:
相同mat3 A = mat3(1.0);
正确的顶点着色器:
#version 120
attribute vec3 a_position;
attribute vec2 a_texCoord;
varying vec2 v_texCoord;
void main()
{
const float w = 0.76;
mat3 A = mat3(cos(w), -sin(w), 0.0,
sin(w), cos(w), 0.0,
0.0, 0.0, 1.0);
gl_Position = vec4(A * a_position, 1.0);
v_texCoord = a_texCoord;
}
关于opengl - 使用顶点着色器旋转纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74487493/