如何将shadershop公式转换为glsl

时间:2018-06-12 16:29:13

标签: glsl shader

我最近一直在学习一些基本的着色器,我想出了一个很棒的可视化工具:shadershop

但我无法将我在本网站创建的公式转换为glsl。

一个简单的例子,我在这个网站上创建了一个公式:

enter image description here

我可以用glsl转换它:

enter image description here

然后我继续前进,我在shadershop上创建了一个二维公式:

enter image description here

但是我不知道如何将此公式转换为glsl,就像我之前一样。

任何建议都将不胜感激,谢谢:)

更新

我再次尝试根据@ Rabbid76的建议转换公式:

enter image description here

但我仍然难以理解:

  1. 如何将公式拆分为U和V
  2. 如何处理公式中的矩阵

1 个答案:

答案 0 :(得分:1)

shadershop的公式可表示如下:

vec2  x1x2 = inverse(m) * vec2(x1, x2);
float x    = -sin(x1x2.x - x1x2.y);

其中m是2x2矩阵。

e.g。

mat2 m = mat2(
    0.1, 0.0,
    0.5, 1.0
);

对于逆矩阵的公式,请参见www.mathwords.com(在GLSL ES 1.00中,逆矩阵没有函数):

float det_m = m[0][0]*m[1][1] - m[0][1]*m[1][0];
mat2  inv_m = mat2(m[1][1], -m[0][1], -m[1][0], m[0][0]) / det_m;

完整片段着色器代码可能如下所示:

void main()
{
    vec2 st = 2.0 * gl_FragCoord.xy / resolution.xy - 1.0;

    vec2 scale = vec2(1.5, 1.5);
    st *= scale;

    mat2 m = mat2(
        0.1, 0.0,
        0.5, 1.0
    );

    vec2 x1x2 = vec2(st.x, 0.0);
    float det_m = m[0][0]*m[1][1] - m[0][1]*m[1][0];
    if ( det_m != 0.0 )
    { 
      mat2 inv_m = mat2(m[1][1], -m[0][1], -m[1][0], m[0][0]) / det_m;
      x1x2 = inv_m * st.xy;
    }
    float x = -sin(x1x2.x - x1x2.y);

    vec3 color = vec3( x, x, abs(x) );
    gl_FragColor = vec4(color, 1.0);
}

查看预览:

preview