公式为着色器商店 http://www.cdglabs.org/Shadershop/可以表示为:
vec2 x1x2 = inverse(m) * vec2(x1, x2);
float x = -sin(x1x2.x - x1x2.y);
where m
是一个 2x2 矩阵。
e.g.
mat2 m = mat2(
0.1, 0.0,
0.5, 1.0
);
逆矩阵的公式参见www.mathwords.com http://www.mathwords.com/i/inverse_of_a_matrix.htm(在 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);
}
看预览: