Rotation
// Example Pixel Shader
uniform float u_time;
// rotation matrix from the book of shaders
// https://thebookofshaders.com/08/
mat2 rotate2d(float _angle){
return mat2(cos(_angle),-sin(_angle),
sin(_angle),cos(_angle));
}
// many thanks to Mike Walczyk for letting me pick his brain
out vec4 fragColor;
void main()
{
// derive aspect from inputs
vec2 aspect = uTD2DInfos[0].res.zw / uTD2DInfos[0].res.w ;
// remap -1 to 1
vec2 newUV = vUV.st * 2.0 - 1.0;
// correct for aspect
newUV = newUV * aspect;
// perform rotation
newUV = rotate2d(u_time) * newUV;
// undo aspect correction
newUV = newUV * 1 / aspect;
// change remapping back to 0-1
newUV = newUV * 0.5 + 0.5;
// sample texture
vec4 color = texture(sTD2DInputs[0], newUV);
// output color
fragColor = TDOutputSwizzle(color);
}
Rotation Matrix
// rotation matrix from the book of shaders
// https://thebookofshaders.com/08/
mat2 rotate2d(float _angle){
return mat2(cos(_angle),-sin(_angle),
sin(_angle),cos(_angle));
}
Remap 0-1 to -1-1
// remap -1 to 1
vec2 newUV = vUV.st * 2.0 - 1.0;
Vertex Stage Normal Recalculation
// - - - - - added functions - - - - -
// tangent basis
mat3 getTangentBasis( in vec3 tangentY ){
vec3 upVector = vec3( 0.0, 1.0, 0.0 );
vec3 tangentX = normalize( cross( upVector, tangentY ) );
vec3 tangentZ = cross( tangentY, tangentX );
return mat3( tangentX, tangentY, tangentZ );
}
// mesh deformation
vec3 applyDeformation( in vec3 pos, in vec3 norm ){
float disp = 0.0;
if( noiseType ){
disp = TDSimplexNoise( vec4( pos * noiseScale + translate , time ) ) * dispScale;
}
else{
disp = TDPerlinNoise( vec4( pos * noiseScale + translate , time ) ) * dispScale;
}
vec3 deformP = norm * disp + pos;
return deformP;
}
// compute vertext normal
vec3 computeVertNorm( in vec3 pos, in vec3 norm ){
float offset = 0.1;
mat3 basis = getTangentBasis( norm );
vec3 xv = offset * basis[ 0 ];
vec3 zv = offset * basis[ 2 ];
vec3 x0 = applyDeformation( pos + xv , norm );
vec3 x1 = applyDeformation( pos - xv , norm );
vec3 z0 = applyDeformation( pos + zv , norm );
vec3 z1 = applyDeformation( pos - zv , norm );
return cross( x1 - x0, z1 - z0 );
}