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

标签 opengl glsl

我正在尝试旋转顶点着色器内的纹理。我有一个指向纹理的指针,出于我的目的,该指针逆时针旋转 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);

您不能将 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;
}

关于opengl - 使用顶点着色器旋转纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74487493/

相关文章:

opengl - 无法使用多重采样渲染到纹理

c++ - 在 OpenGL 中添加阴影

c++ - 使用着色器绘制 3D 对象的正确方法是什么?

optimization - 一个简单的着色器优化案例,如果我做对了?

opengl - 使用 glsl 'attribute' 和 'in' 有什么区别?

opengl - 如何在 GLSL 中渲染无限的 2D 网格?

c - 手动控制 GTK 小部件重绘滴答率

c++ - Shader编译失败后能否调用glShaderSource更新Shader源码?

linux - 为什么有些部分没有在更大的窗口上呈现?

javascript - 为什么 webgl 程序的着色器必须位于 html 文件中?