96 lines
2.4 KiB
GLSL
96 lines
2.4 KiB
GLSL
//------------------------------------------------------------------------------
|
|
// Shader code for texcube-sapp sample.
|
|
//
|
|
// NOTE: This source file also uses the '#pragma sokol' form of the
|
|
// custom tags.
|
|
//------------------------------------------------------------------------------
|
|
//#pragma sokol @ctype mat4 my_mat4
|
|
|
|
#pragma sokol @vs vs
|
|
uniform vs_params {
|
|
mat4 mvp;
|
|
};
|
|
|
|
in vec4 pos;
|
|
in vec4 color0;
|
|
in vec2 texcoord0;
|
|
|
|
out vec4 color;
|
|
out vec2 uv;
|
|
|
|
void main() {
|
|
gl_Position = mvp * pos;
|
|
color = color0;
|
|
uv = texcoord0;
|
|
}
|
|
#pragma sokol @end
|
|
|
|
#pragma sokol @fs fs
|
|
uniform sampler2D tex;
|
|
uniform fs_params {
|
|
vec2 text_res;
|
|
float iTime;
|
|
};
|
|
|
|
in vec4 color;
|
|
in vec2 uv;
|
|
out vec4 frag_color;
|
|
|
|
//*********************************************************
|
|
// RAY TRACE
|
|
// original code from: https://www.shadertoy.com/view/ldS3DW
|
|
//*********************************************************
|
|
float sphere(vec3 ray, vec3 dir, vec3 center, float radius)
|
|
{
|
|
vec3 rc = ray-center;
|
|
float c = dot(rc, rc) - (radius*radius);
|
|
float b = dot(dir, rc);
|
|
float d = b*b - c;
|
|
float t = -b - sqrt(abs(d));
|
|
float st = step(0.0, min(t,d));
|
|
return mix(-1.0, t, st);
|
|
}
|
|
|
|
vec3 background(float t, vec3 rd)
|
|
{
|
|
vec3 light = normalize(vec3(sin(t), 0.6, cos(t)));
|
|
float sun = max(0.0, dot(rd, light));
|
|
float sky = max(0.0, dot(rd, vec3(0.0, 1.0, 0.0)));
|
|
float ground = max(0.0, -dot(rd, vec3(0.0, 1.0, 0.0)));
|
|
return (pow(sun, 256.0)+0.2*pow(sun, 2.0))*vec3(2.0, 1.6, 1.0) +
|
|
pow(ground, 0.5)*vec3(0.4, 0.3, 0.2) +
|
|
pow(sky, 1.0)*vec3(0.5, 0.6, 0.7);
|
|
}
|
|
|
|
vec4 mainImage(vec2 fragCoord)
|
|
{
|
|
vec2 uv = (fragCoord-vec2(0.4,0.4))*2.0;
|
|
|
|
//vec2 uv = (-1.0 + 2.0*fc.xy / text_res.xy) * vec2(text_res.x/text_res.y, 1.0);
|
|
vec3 ro = vec3(0.0, 0.0, -3.0);
|
|
vec3 rd = normalize(vec3(uv, 1.0));
|
|
vec3 p = vec3(0.0, 0.0, 0.0);
|
|
float t = sphere(ro, rd, p, 1.0);
|
|
vec3 nml = normalize(p - (ro+rd*t));
|
|
vec3 bgCol = background(iTime, rd);
|
|
rd = reflect(rd, nml);
|
|
vec3 col = background(iTime, rd) * vec3(0.9, 0.8, 1.0);
|
|
vec4 fragColor = vec4( mix(bgCol, col, step(0.0, t)), 1.0 );
|
|
return fragColor;
|
|
}
|
|
//*********************************************************
|
|
//*********************************************************
|
|
|
|
void main() {
|
|
vec4 c = color;
|
|
vec4 txt = texture(tex, uv/4.0);
|
|
c = txt * c;
|
|
vec4 col_ray = mainImage(uv);
|
|
float txt_mix = mod(iTime,5);
|
|
frag_color = c*txt_mix*0.1 + col_ray ;
|
|
}
|
|
|
|
#pragma sokol @end
|
|
|
|
#pragma sokol @program cube vs fs
|