在GLSL ES中的片段着色器中旋转纹理

8

我想在片元着色器中旋转纹理,而不是使用顶点着色器和矩阵变换。

旋转的中心点位于中心位置。

当渲染一个宽高比不为1的四边形时,该算法可以正确工作,但渲染结果会出现问题。有人能找出问题吗?

谢谢。

    varying vec2 v_texcoord;
    uniform sampler2D u_texture;
    uniform float u_angle;

    void main()
    {
        vec2 coord = v_texcoord;
        float sin_factor = sin(u_angle);
        float cos_factor = cos(u_angle);
        coord = (coord - 0.5) * mat2(cos_factor, sin_factor, -sin_factor, cos_factor);
        coord += 0.5;

        gl_FragColor = texture2D(u_texture, coord);
    }

我也在寻找!它已经解决了吗? - Samsy
我通过构建一个矩阵来旋转着色器之外的内容实现了这一点,http://stackoverflow.com/questions/31417365/how-to-rotate-a-texture-in-a-shader-android,您也可以在此找到有关矩阵组件的信息,http://www.songho.ca/opengl/gl_projectionmatrix.html。 - HPP
2个回答

5

以下是问题中提供的代码行:

coord = vec2(coord.x - (0.5 * Resolution.x / Resolution.y), coord.y - 0.5) * mat2(cos_factor, sin_factor, -sin_factor, cos_factor);

这不太正确。

存在一些括号错误。

正确的版本应该是:

coord = vec2((coord.x - 0.5) * (Resolution.x / Resolution.y), coord.y - 0.5) * mat2(cos_factor, sin_factor, -sin_factor, cos_factor);

1
这个回答毫无意义 - 它似乎是在提到另一个被投票下降的答案中的代码。我建议编辑原来的答案而不是发表一个新的部分回答。 - Tim MB

-1

我自己还没有尝试过,但我的猜测是,由于您正在使用矩形空间中的纹理坐标,因此在旋转时会导致扭曲,除非有一些因素来进行校正。

您需要传递一个声明纹理宽度和高度的统一变量。通过这个,您可以应用纵横比来纠正扭曲。

coord = (coord - 0.5) * mat2(cos_factor, sin_factor, -sin_factor, cos_factor);

可能会变成这样:

coord = vec2(coord.x - (0.5 * Resolution.x / Resolution.y), coord.y - 0.5) * mat2(cos_factor, sin_factor, -sin_factor, cos_factor);

就像我之前说的那样,我还没有尝试过它,但是我以前为类似的着色器做过这个。可能需要反转Resolution.x / Resolution.y。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接