92 lines
2.9 KiB
Scala
92 lines
2.9 KiB
Scala
$input v_color0
|
|
$input v_normal
|
|
$input v_uv0
|
|
$input v_wpos
|
|
|
|
#include "common.sh"
|
|
|
|
SAMPLER2D(s_texColor, 0);
|
|
uniform vec4 u_time;
|
|
uniform vec4 u_testColor;
|
|
|
|
float circle(vec2 uv, float radius)
|
|
{
|
|
float distSq = uv.x * uv.x + uv.y * uv.y;
|
|
float result = sqrt(distSq) / radius;
|
|
// return result < 0.5;
|
|
return clamp(1.0 - result, 0.0, 1.0);
|
|
}
|
|
|
|
float calcBrightness(vec3 lightPos, vec3 vertPos, vec3 normal)
|
|
{
|
|
vec3 lightDir = normalize(lightPos - vertPos);
|
|
float diffuse = max(0.0, dot(lightDir, normal));
|
|
return diffuse * clamp(1.0 - distance(lightPos, vertPos) * 0.01, 0.0, 1.0);
|
|
}
|
|
|
|
float circles(vec2 uv, float level, float subLevel, float brightness)
|
|
{
|
|
vec2 offsetUv = uv + 0.5;
|
|
vec2 baseUv = (offsetUv % 1.0) - 0.5;
|
|
vec2 step1Uv = ((offsetUv + vec2(0.5, 0.5)) % 1.0) - 0.5;
|
|
vec2 step2Uv = ((offsetUv + vec2(0.5, 0.0)) % 1.0) - 0.5;
|
|
vec2 step3Uv = ((offsetUv + vec2(0.0, 0.5)) % 1.0) - 0.5;
|
|
|
|
float step = subLevel * 3.0;
|
|
float step1 = clamp(step, 0.0, 1.0);
|
|
float step2 = clamp(step - 1, 0.0, 1.0);
|
|
float step3 = clamp(step - 2, 0.0, 1.0);
|
|
|
|
float sum = 0.0;
|
|
sum = circle(baseUv, lerp(0.5, 0.25, subLevel) * brightness);
|
|
sum = max(sum, circle(step1Uv, 0.25 * step1 * brightness));
|
|
sum = max(sum, circle(step2Uv, 0.25 * step2 * brightness));
|
|
sum = max(sum, circle(step3Uv, 0.25 * step3 * brightness));
|
|
|
|
return min(sum, 1.0);
|
|
}
|
|
|
|
vec3 desaturate(vec3 color)
|
|
{
|
|
return vec3_splat(dot(color, vec3(0.33, 0.34, 0.33)));
|
|
}
|
|
|
|
void main()
|
|
{
|
|
float testRadius = 30.0;
|
|
float testSpeed = 1.0;
|
|
vec3 testOffset = vec3(0.0, 0.0, 50.0);
|
|
float3 lightPos = vec3(sin(u_time.x * testSpeed) * testRadius, 5.0, cos(u_time.x * testSpeed) * testRadius);
|
|
float brightness = calcBrightness(lightPos, v_wpos, v_normal);
|
|
// brightness = 0.1 + brightness * 0.9;
|
|
|
|
float baseScale = 2.0;
|
|
float2 dx = ddx(v_uv0 * baseScale);
|
|
float2 dy = ddy(v_uv0 * baseScale);
|
|
float2x2 mat = float2x2(dx, dy);
|
|
float4 vectorized = float4(dx, dy);
|
|
float qq = dot(vectorized, vectorized);
|
|
float rr = determinant(mat);
|
|
float discriminantSqr = max(0.0, qq*qq - 4.0*rr*rr);
|
|
float discriminant = sqrt(discriminantSqr);
|
|
float2 freq = sqrt(float2(qq + discriminant, qq - discriminant) / 2.0);
|
|
|
|
float spacing = freq.y * exp2(2.0);
|
|
spacing = 1.0 / spacing;
|
|
spacing *= brightness; // TODO: check reference to see how to calculate this!
|
|
float spacingLog = max(log2(spacing), 0.0);
|
|
int patternScaleLevel = floor(spacingLog);
|
|
float patternFractional = spacingLog - patternScaleLevel;
|
|
|
|
vec2 uv = v_uv0 * exp2(patternScaleLevel);
|
|
float dither = circles(uv, patternScaleLevel, patternFractional, brightness);
|
|
vec3 color = desaturate(u_testColor.xyz) * 0.01 + dither * u_testColor.xyz * 0.95;
|
|
vec3 smoothColor = brightness * u_testColor.xyz;
|
|
vec3 mixedColor = 0.1 * smoothColor + 0.9 * color;
|
|
gl_FragColor = vec4(mixedColor, 1.0);
|
|
// gl_FragColor = brightness;
|
|
// gl_FragColor = dither;
|
|
// gl_FragColor = u_testColor;
|
|
gl_FragColor = texture2D(s_texColor, v_uv0);
|
|
}
|