Files
Terrarum/src/shaders/clouds.frag
2023-09-25 19:55:46 +09:00

37 lines
1.2 KiB
GLSL

in vec4 v_color; // lightCol
in vec4 v_generic; // [rgb gamma + a gamma, shadiness, 0, 0]
in vec2 v_texCoords;
uniform sampler2D u_texture;
out vec4 fragColor;
const vec2 boolean = vec2(0.0, 1.0);
uniform vec4 shadeCol;
//uniform float shadiness = 1.0;
vec4 shadeVec = vec4(vec3(1.0 + 3.333 * v_generic.y), 1.0);
void main() {
vec4 cloudCol = v_color;
float rgbGamma = uintBitsToFloat(floatBitsToUint(v_generic.x) & 0xffff0000u);
float aGamma = uintBitsToFloat((floatBitsToUint(v_generic.x) & 0x0000ffffu) << 16);
vec4 gamma = vec4(rgbGamma, rgbGamma, rgbGamma, aGamma);
vec4 range = vec4(vec3(min(rgbGamma, 1.0 / rgbGamma)), 1.0);
vec4 offset = vec4(vec3(max(0.0, 1.0 - rgbGamma)), 0.0);
// cloud colour format:
// r: bw diffuse map, g: normal, b: normal, a: bw diffuse alpha
vec4 inCol = texture(u_texture, v_texCoords);
vec4 rawCol0 = range * pow(inCol, gamma) + offset;
vec4 rawCol = pow(rawCol0, shadeVec);
// do gradient mapping here
vec4 ccol = mix(shadeCol, cloudCol, rawCol.r);
vec4 outCol = fma(ccol, boolean.yyyx, rawCol * boolean.xxxy);
fragColor = outCol * fma(cloudCol, boolean.xxxy, boolean.yyyx);
}