【问题标题】:Rotate texture using vertex shader - OpenGL使用顶点着色器旋转纹理 - OpenGL
【发布时间】:2022-11-18 18:54:32
【问题描述】:

我正在尝试在顶点着色器中旋转纹理。我有一个指向纹理的指针,为了我的目的,它逆时针旋转了 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 * vec4(a_position, 1.0f);您正在将 3 X 3 矩阵与 vec 4 相乘。
  • 您可以创建一个纹理矩阵并将其与顶点着色器中的纹理坐标相乘。

标签: opengl glsl


【解决方案1】:

你得到编译错误。作业不起作用:

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

【讨论】:

  • @Rabbid76 矩阵定义中缺少 mat3 非常愚蠢的错误。另外,我有一个很长的日志,我没有看到编译错误,它就在那里! :D P.S.:gl_Position = vec4(A * a_position, 1.0); 行是正确的,键入 mistamtch。感谢您的快速回复
【解决方案2】:

我不确定这段代码是否在版本 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 );
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多