Как преобразовать формулу Shadershop в GLSL - PullRequest
0 голосов
/ 12 июня 2018

Недавно я изучил некоторые базовые шейдеры, и я разработал замечательные визуальные инструменты: shadershop

Но у меня возникли проблемы с преобразованием формулы, созданной на этом сайте, вglsl.

Простой пример, я создал формулу на этом сайте:

enter image description here

И я могу преобразовать это в glsl:

enter image description here

И затем я пошел дальше, я создал двухмерную формулу для шейдера:

enter image description here

Но я просто понятия не имею, как преобразовать эту формулу в glsl, как я это делал раньше.

Любой совет будет оценен, спасибо:)

ОБНОВЛЕНИЕ

Я снова попытался преобразовать формулу в соответствии с рекомендациями @ Rabbid76:

enter image description here

Но все же у меня возникают проблемы с пониманием:

  1. как разделить формулу на U и V
  2. как работать с матрицей в формуле

1 Ответ

0 голосов
/ 13 июня 2018

Формула shadershop может быть выражена следующим образом:

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

, где m - матрица 2x2.

например,

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

...