OctaCore/config/glsl/material.cfg

491 lines
16 KiB
INI

///////////////////////////////////////////////////
//
// material shaders
//
///////////////////////////////////////////////////
shader 0 "refractmask" [
in vec4 vvertex;
uniform mat4 camprojmatrix;
void main(void)
{
gl_Position = camprojmatrix * vvertex;
}
] [
@(gfetchdefs tex0)
uniform vec3 gdepthpackparams;
layout(location = 0) out vec4 fragcolor;
void main(void)
{
@(if (= $gdepthformat 1) [result [
vec3 packdepth = gfetch(tex0, gl_FragCoord.xy).rgb;
]] [result [
@(gdepthunpack depth [gfetch(tex0, gl_FragCoord.xy)])
@(gpackdepth packdepth depth)
]])
fragcolor = vec4(packdepth, 0.0);
}
]
lazyshader 0 "waterminimap" [
in vec4 vvertex;
uniform mat4 camprojmatrix;
@(ginterpvert)
void main(void)
{
gl_Position = camprojmatrix * vvertex;
@(gdepthpackvert)
}
] [
uniform vec3 watercolor;
@(ginterpfrag)
void main(void)
{
gcolor = vec4(watercolor, 0.0);
@(gnormpack [vec3(0.5, 0.5, 1.0)])
@(gdepthpackfrag)
}
]
watershader = [
lazyshader 0 $arg1 [
in vec4 vvertex;
in vec2 vtexcoord0;
uniform mat4 camprojmatrix;
uniform vec3 camera;
out vec2 texcoord0, texcoord1;
out vec3 surface;
@(? (>= (strstr $arg1 "reflect") 0) [
uniform mat4 raymatrix;
out vec3 esurface;
])
@(ginterpvert 1)
void main(void)
{
gl_Position = camprojmatrix * vvertex;
surface = vvertex.xyz;
@(? (>= (strstr $arg1 "reflect") 0) [
esurface = (raymatrix * vvertex).xyz;
])
texcoord0 = vtexcoord0 * 0.18;
texcoord1 = vtexcoord0 * 0.08;
@(gdepthpackvert 1)
}
] [
@(gfetchdefs [tex7 tex8 tex9])
uniform float millis;
uniform vec3 camera;
uniform mat4 linearworldmatrix;
in vec2 texcoord0, texcoord1;
in vec3 surface;
uniform sampler2D tex0, tex1;
uniform vec4 viewsize;
uniform vec3 watercolor, waterdeepcolor, waterdeepfade;
uniform float waterfog, waterspec;
uniform vec4 waterreflect, waterrefract;
uniform float refractdepth;
@(? (>= (strstr $arg1 "caustics") 0) [
uniform vec3 causticsS, causticsT;
uniform vec3 causticsblend;
uniform sampler2D tex2, tex3;
])
@(? (>= (strstr $arg1 "env") 0) [
uniform samplerCube tex4;
])
@(? (>= (strstr $arg1 "reflect") 0) [
uniform mat4 raymatrix;
in vec3 esurface;
])
@(ginterpfrag 1)
void main(void)
{
vec3 camdir = camera - surface, camvec = normalize(camdir);
vec3 bump = texture(tex1, texcoord0 + millis*vec2( 0.25, 0.75)*0.1250).rgb;
vec3 bump2 = texture(tex1, texcoord0 + millis*vec2(-0.75, -0.25)*0.1450).rgb;
vec3 bump3 = texture(tex1, texcoord1 + millis*vec2(-0.50, 0.50)*0.0805).rgb;
vec3 bump4 = texture(tex1, texcoord1 + millis*vec2( 0.25, -0.75)*0.0825).rgb;
bump = normalize(bump + bump2 + bump3 + bump4 - 2.0);
vec2 rtc = bump.xy * waterrefract.w;
float rmask = clamp(refractdepth*(lineardepth - dot(gfetch(tex7, gl_FragCoord.xy + rtc).rgb, gdepthunpackparams)), 0.0, 1.0);
rtc = gl_FragCoord.xy + rtc*rmask;
vec3 rcolor = gfetch(tex8, rtc).rgb * waterrefract.xyz;
float rdepth = dot(gfetch(tex7, rtc).rgb, gdepthunpackparams);
vec3 rpos = (linearworldmatrix * vec4(rdepth*rtc, rdepth, 1.0)).xyz;
@(if (>= (strstr $arg1 "under") 0) [result [
float above = rpos.z - surface.z;
float alpha = clamp(above, 0.0, 1.0);
]] [result [
vec3 rdir = rpos.xyz - camera;
float raydepth = length(rdir)*(1.0 + camdir.z/rdir.z);
float deep = surface.z - rpos.z;
float alpha = clamp(deep*0.5, 0.0, 1.0);
@(? (>= (strstr $arg1 "caustics") 0) [
vec2 ctc = vec2(dot(causticsS, rpos.xyz), dot(causticsT, rpos.xyz));
float caustics = causticsblend.x*texture(tex2, ctc).r + causticsblend.y*texture(tex3, ctc).r + causticsblend.z;
rcolor *= caustics;
])
rcolor = mix(watercolor, rcolor, clamp(exp2(waterfog * raydepth), 0.0, 1.0));
rcolor = mix(waterdeepcolor, rcolor, clamp(exp2(deep * waterdeepfade), 0.0, 1.0));
]])
vec3 reflectdir = -reflect(camvec, bump);
reflectdir.z = abs(reflectdir.z);
@(if (>= (strstr $arg1 "reflect") 0) [result [
reflectdir.z += 0.125;
vec3 edir = (raymatrix * vec4(waterreflect.w*reflectdir, 0.0)).xyz;
vec3 epos = esurface + edir;
@(loopconcat i 4 [result [
@(gdepthunpack [edepth@[i]] [gfetchproj(tex9, epos)] [
if(edepth@[i] < epos.z || edepth@[i] > esurface.z) epos += edir;
] [
edepth@[i] = edepth@[i]*gdepthscale.y + gdepthscale.z;
if(gdepthscale.x < epos.z*edepth@[i] || gdepthscale.x > esurface.z*edepth@[i]) epos += edir;
])
]])
vec2 etc = epos.xy/epos.z;
@(? $msaalight [
etc = clamp(etc, vec2(0.0), viewsize.xy);
])
vec3 reflect = gfetch(tex8, etc).rgb * waterreflect.xyz;
float edgefade = clamp(4.0*(0.5 - max(abs(etc.x*viewsize.z - 0.5)*0.75 + 0.25/4.0, abs(etc.y*viewsize.w - 0.5))), 0.0, 1.0);
float fresnel = 0.25 + 0.75*pow(clamp(1.0 - dot(camvec, bump), 0.0, 1.0), 4.0);
rcolor = mix(rcolor, reflect, fresnel*edgefade);
]] [if (>= (strstr $arg1 "env") 0) [result [
vec3 reflect = texture(tex4, reflectdir).rgb*0.5;
float fresnel = 0.5*pow(clamp(1.0 - dot(camvec, bump), 0.0, 1.0), 4.0);
rcolor = mix(rcolor, reflect, fresnel);
]]])
gcolor.rgb = vec3(0.0);
@(gspecpack 2.0 [waterspec*alpha])
@(gnormpack bump alpha)
gglow.rgb = rcolor*alpha;
@(gdepthpackfrag)
}
]
]
watershader "water"
watershader "watercaustics"
watershader "waterenv"
watershader "waterenvcaustics"
watershader "waterreflect"
watershader "waterreflectcaustics"
watershader "underwater"
causticshader = [
lazyshader 0 $arg1 [
in vec4 vvertex;
void main(void)
{
gl_Position = vvertex;
}
] [
@(gfetchdefs tex9)
uniform mat4 causticsmatrix;
uniform vec3 causticsblend;
uniform sampler2D tex0, tex1;
uniform vec4 waterdeepfade;
layout(location = 0) out vec4 fragcolor;
void main(void)
{
@(gdepthunpack depth [gfetch(tex9, gl_FragCoord.xy)] [
vec3 ctc = (causticsmatrix * vec4(depth*gl_FragCoord.xy, depth, 1.0)).xyz;
] [
vec4 ctc = causticsmatrix * vec4(gl_FragCoord.xy, depth, 1.0);
ctc.xyz /= ctc.w;
])
float caustics = causticsblend.x*texture(tex0, ctc.xy).r + causticsblend.y*texture(tex1, ctc.xy).r + causticsblend.z;
caustics *= clamp(ctc.z, 0.0, 1.0) * clamp(exp2(ctc.z*waterdeepfade.w), 0.0, 1.0);
fragcolor.rgb = vec3(0.5 + caustics);
}
]
]
causticshader caustics
waterfogshader = [
lazyshader 0 $arg1 [
in vec4 vvertex;
void main(void)
{
gl_Position = vvertex;
}
] [
@(gfetchdefs tex9)
uniform vec3 camera;
uniform mat4 worldmatrix;
uniform vec3 fogcolor;
uniform vec2 fogdensity;
uniform vec3 waterdeepcolor, waterdeepfade;
uniform float waterheight;
layout(location = 0) out vec4 fragcolor;
void main(void)
{
@(gdepthunpack depth [gfetch(tex9, gl_FragCoord.xy)] [
vec3 pos = (worldmatrix * vec4(depth*gl_FragCoord.xy, depth, 1.0)).xyz;
] [
vec4 pos = worldmatrix * vec4(gl_FragCoord.xy, depth, 1.0);
pos.xyz /= pos.w;
])
float fogbelow = waterheight - pos.z;
float fogcoord = distance(camera, pos.xyz);
float foglerp = clamp(1.0 - exp2(fogcoord*fogdensity.x)*fogdensity.y, 0.0, 1.0);
foglerp *= clamp(2.0*fogbelow + 0.5, 0.0, 1.0);
vec3 color = mix(waterdeepcolor, fogcolor, clamp(exp2(fogbelow*waterdeepfade), 0.0, 1.0));
fragcolor.rgb = color;
fragcolor.a = foglerp;
}
]
]
waterfogshader waterfog
lazyshader 0 "lava" [
in vec4 vvertex;
in vec3 vnormal;
in vec2 vtexcoord0;
uniform mat4 camprojmatrix;
out mat3 world;
out vec2 texcoord0;
@(ginterpvert)
void main(void)
{
gl_Position = camprojmatrix * vvertex;
texcoord0 = vtexcoord0;
vec3 tangent = mix(vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0), abs(vnormal.x));
vec3 bitangent = mix(vec3(0.0, 0.0, -1.0), vec3(0.0, 1.0, 0.0), abs(vnormal.z));
world = mat3(tangent, bitangent, vnormal);
@(gdepthpackvert)
}
] [
uniform sampler2D tex0, tex1;
uniform float lavaglow, lavaspec;
in mat3 world;
in vec2 texcoord0;
@(ginterpfrag)
void main(void)
{
vec3 diffuse = texture(tex0, texcoord0).rgb;
vec3 bump = texture(tex1, texcoord0).rgb*2.0-1.0;
vec3 bumpw = normalize(world * bump);
gcolor.rgb = diffuse;
@(gspecpack 0.0 lavaspec)
@(gnormpack bumpw)
gglow.rgb = diffuse*lavaglow;
@(gdepthpackfrag)
}
]
lazyshader 0 "waterfallenv" [
in vec4 vvertex;
in vec3 vnormal;
in vec2 vtexcoord0;
uniform mat4 camprojmatrix;
uniform vec4 camera;
out vec3 camdir;
out mat3 world;
out vec2 texcoord0;
@(ginterpvert 1)
void main(void)
{
gl_Position = camprojmatrix * vvertex;
texcoord0 = vtexcoord0;
camdir = camera.xyz - vvertex.xyz;
vec3 tangent = mix(vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0), abs(vnormal.x));
vec3 bitangent = mix(vec3(0.0, 0.0, -1.0), vec3(0.0, 1.0, 0.0), abs(vnormal.z));
world = mat3(tangent, bitangent, vnormal);
@(gdepthpackvert 1)
}
] [
@(gfetchdefs [tex7 tex8])
uniform samplerCube tex3;
uniform sampler2D tex0, tex1;
uniform vec3 waterfallcolor;
uniform float waterfallspec;
uniform vec4 waterfallrefract;
uniform float refractdepth;
in vec3 camdir;
in mat3 world;
in vec2 texcoord0;
@(ginterpfrag 1)
void main(void)
{
vec3 camvec = normalize(camdir);
vec3 diffuse = texture(tex0, texcoord0).rgb;
vec3 bump = texture(tex1, texcoord0).rgb*2.0 - 1.0;
vec3 bumpw = normalize(world * bump);
vec2 rtc = bump.xy * waterfallrefract.w;
float rmask = clamp(refractdepth*(lineardepth - dot(gfetch(tex7, gl_FragCoord.xy + rtc).rgb, gdepthunpackparams)), 0.0, 1.0);
rtc = gl_FragCoord.xy + rtc*rmask;
vec3 rcolor = gfetch(tex8, rtc).rgb * waterfallrefract.xyz;
float invfresnel = dot(camvec, bumpw);
vec3 env = texture(tex3, 2.0*bumpw*invfresnel - camvec).rgb;
env *= 0.1 + 0.4*pow(clamp(1.0 - invfresnel, 0.0, 1.0), 2.0);
gcolor.rgb = vec3(0.0);
@(gspecpack 2.0 [waterfallspec*(1.0 - dot(diffuse, vec3(0.33)))]);
@(gnormpack bumpw)
gglow.rgb = mix(rcolor, waterfallcolor, diffuse) + env;
@(gdepthpackfrag)
}
]
lazyshader 0 "waterfall" [
in vec4 vvertex;
in vec3 vnormal;
in vec2 vtexcoord0;
uniform mat4 camprojmatrix;
out mat3 world;
out vec2 texcoord0;
@(ginterpvert 1)
void main(void)
{
gl_Position = camprojmatrix * vvertex;
texcoord0 = vtexcoord0;
vec3 tangent = mix(vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0), abs(vnormal.x));
vec3 bitangent = mix(vec3(0.0, 0.0, -1.0), vec3(0.0, 1.0, 0.0), abs(vnormal.z));
world = mat3(tangent, bitangent, vnormal);
@(gdepthpackvert 1)
}
] [
@(gfetchdefs [tex7 tex8])
uniform sampler2D tex0, tex1;
uniform vec3 waterfallcolor;
uniform float waterfallspec;
uniform vec4 waterfallrefract;
uniform float refractdepth;
in mat3 world;
in vec2 texcoord0;
@(ginterpfrag 1)
void main(void)
{
vec3 diffuse = texture(tex0, texcoord0).rgb;
vec3 bump = texture(tex1, texcoord0).rgb*2.0 - 1.0;
vec3 bumpw = normalize(world * bump);
vec2 rtc = bump.xy * waterfallrefract.w;
float rmask = clamp(refractdepth*(lineardepth - dot(gfetch(tex7, gl_FragCoord.xy + rtc).rgb, gdepthunpackparams)), 0.0, 1.0);
rtc = gl_FragCoord.xy + rtc*rmask;
vec3 rcolor = gfetch(tex8, rtc).rgb * waterfallrefract.xyz;
gcolor.rgb = vec3(0.0);
@(gspecpack 2.0 [waterfallspec*(1.0 - dot(diffuse, vec3(0.33)))])
@(gnormpack bumpw)
gglow.rgb = mix(rcolor, waterfallcolor, diffuse);
@(gdepthpackfrag)
}
]
lazyshader 0 "glassenv" [
in vec4 vvertex;
in vec3 vnormal;
in vec2 vtexcoord0;
uniform mat4 camprojmatrix;
uniform vec4 camera;
out vec3 camdir;
out mat3 world;
out vec2 texcoord0;
@(ginterpvert 1)
void main(void)
{
gl_Position = camprojmatrix * vvertex;
texcoord0 = vtexcoord0;
camdir = camera.xyz - vvertex.xyz;
vec3 tangent = mix(vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0), abs(vnormal.x));
vec3 bitangent = mix(vec3(0.0, 0.0, -1.0), vec3(0.0, 1.0, 0.0), abs(vnormal.z));
world = mat3(tangent, bitangent, vnormal);
@(gdepthpackvert 1)
}
] [
@(gfetchdefs [tex7 tex8])
uniform samplerCube tex0;
uniform sampler2D tex1;
uniform float glassspec;
uniform vec4 glassrefract;
uniform float refractdepth;
in vec3 camdir;
in mat3 world;
in vec2 texcoord0;
@(ginterpfrag 1)
void main(void)
{
vec3 camvec = normalize(camdir);
vec3 bump = texture(tex1, texcoord0).rgb*2.0 - 1.0;
vec3 bumpw = normalize(world * bump);
vec2 rtc = bump.xy * glassrefract.w;
float rmask = clamp(refractdepth*(lineardepth - dot(gfetch(tex7, gl_FragCoord.xy + rtc).rgb, gdepthunpackparams)), 0.0, 1.0);
rtc = gl_FragCoord.xy + rtc*rmask;
vec3 rcolor = gfetch(tex8, rtc).rgb;
rcolor *= glassrefract.xyz;
float invfresnel = dot(camvec, bumpw);
vec3 env = texture(tex0, 2.0*bumpw*invfresnel - camvec).rgb;
env *= 0.1 + 0.4*pow(clamp(1.0 - invfresnel, 0.0, 1.0), 2.0);
gcolor.rgb = vec3(0.0);
@(gspecpack 2.0 glassspec)
@(gnormpack bumpw)
gglow.rgb = rcolor + env;
@(gdepthpackfrag)
}
]
lazyshader 0 "glass" [
in vec4 vvertex;
in vec3 vnormal;
in vec2 vtexcoord0;
uniform mat4 camprojmatrix;
out mat3 world;
out vec2 texcoord0;
@(ginterpvert 1)
void main(void)
{
gl_Position = camprojmatrix * vvertex;
texcoord0 = vtexcoord0;
vec3 tangent = mix(vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0), abs(vnormal.x));
vec3 bitangent = mix(vec3(0.0, 0.0, -1.0), vec3(0.0, 1.0, 0.0), abs(vnormal.z));
world = mat3(tangent, bitangent, vnormal);
@(gdepthpackvert 1)
}
] [
@(gfetchdefs [tex7 tex8])
uniform sampler2D tex1;
uniform float glassspec;
uniform vec4 glassrefract;
uniform float refractdepth;
in mat3 world;
in vec2 texcoord0;
@(ginterpfrag 1)
void main(void)
{
vec3 bump = texture(tex1, texcoord0).rgb*2.0 - 1.0;
vec3 bumpw = normalize(world * bump);
vec2 rtc = bump.xy * glassrefract.w;
float rmask = clamp(refractdepth*(lineardepth - dot(gfetch(tex7, gl_FragCoord.xy + rtc).rgb, gdepthunpackparams)), 0.0, 1.0);
rtc = gl_FragCoord.xy + rtc*rmask;
vec3 rcolor = gfetch(tex8, rtc).rgb;
rcolor *= glassrefract.xyz;
gcolor.rgb = vec3(0.0);
@(gspecpack 2.0 glassspec)
@(gnormpack bumpw)
gglow.rgb = rcolor;
@(gdepthpackfrag)
}
]