opengl 使用顶点着色器旋转纹理

9bfwbjaz  于 2022-11-23  发布在  其他
关注(0)|答案(2)|浏览(182)

我试图在顶点着色器中旋转一个纹理。我有一个指向纹理的指针,为了我的目的,它被逆时针旋转了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;
}
ppcbkaq5

ppcbkaq51#

编译错误。赋值不起作用:

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);

不能将vec4mat3相乘。必须将vec3mat3相乘

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;
}
t9aqgxwy

t9aqgxwy2#

我不确定这段代码是否能在120版本中编译,但总体思路是创建一个纹理矩阵。

layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aNormal;
layout (location = 2) in vec2 aTexCoord;


uniform mat4 textureMatrix;

out vec2 TexCoord;

void main()
{
 vec4 mTex; 
 mTex =  textureMatrix * vec4( aTexCoord.x , aTexCoord.y , 0.0 , 1.0 );
TexCoord = vec2(mTex.x , mTex.y );
}

相关问题