diff options
Diffstat (limited to 'intermediate')
| -rw-r--r-- | intermediate/surface.glsl | 51 | 
1 files changed, 43 insertions, 8 deletions
| diff --git a/intermediate/surface.glsl b/intermediate/surface.glsl index ce80259..cc287e4 100644 --- a/intermediate/surface.glsl +++ b/intermediate/surface.glsl @@ -9,6 +9,22 @@ fragment: main  #ifdef DESC +[option] +name: albedomap +stage: fragment +[option] +name: aomap +stage: fragment +[option] +name: metalmap +stage: fragment +[option] +name: roughmap +stage: fragment +[option] +name: normalmap +stage: fragment +  [binding]  name: mesh  rate: vertex @@ -142,8 +158,8 @@ void main() {  #define pi 3.14159265358979323846 -vec3 diffuse_brdf(vec2 uv) { -	vec3 a = material.albedo * texture(albedo, uv).rgb; +vec3 diffuse_brdf(vec2 uv, vec3 base) { +	vec3 a = base;  	return a / pi;  } @@ -157,7 +173,11 @@ float specular_G1(float a, vec3 v, vec3 n) {  float specular_brdf(vec2 uv, vec3 ref, vec3 l, vec3 v, vec3 n) {  	float ndl = max(dot(n, l), 0.0);  	float ndv = max(dot(n, v), 0.0); +#if OPT_roughmap  	float a = texture(rough, uv).r * material.roughness; +#else +	float a = material.roughness; +#endif  	float a2 = a * a;  	float ndr = max(dot(n, ref), 0.0);  	float b = ((ndr * ndr) * (a2 - 1) + 1); @@ -244,26 +264,41 @@ void main() {  	vec2 uv = interpolator.uv;  	vec3 p = interpolator.position.xyz; +#if OPT_normalmap  	vec3 nrmsample = texture(normal, uv).rgb;  	vec2 nrmxy = nrmsample.xy * 2.0 - 1.0;  	vec3 nrm = normalize(vec3(nrmxy, 1.0)); -	if (nrmsample.b == 1.0) /* default texture */ -		nrm = normalize(interpolator.tbn[2]); -	else -		nrm = normalize(interpolator.tbn * nrm); +	nrm = normalize(interpolator.tbn * nrm); +#else +	vec3 nrm = normalize(interpolator.tbn[2]); +#endif +#if OPT_albedomap  	vec3 col = texture(albedo, uv).rgb * material.albedo; -	vec3 view_dir = normalize(globals.camera_pos - p); +#else +	vec3 col = material.albedo; +#endif + +#if OPT_metalmap  	float met = texture(metal, uv).r * material.metalness; +#else +	float met = material.metalness; +#endif + +	vec3 view_dir = normalize(globals.camera_pos - p);  	vec3 ref = reflect(-view_dir, nrm);  	vec3 ref_col = texture(env_cube, ref, material.roughness * 8.0).rgb;  	vec3 spec_col = mix(ref_col, ref_col * col, met);  	vec3 amb_col = min(textureLod(env_cube, nrm, 8.0).rgb, 0.05); +#if OPT_aomap  	vec3 ambient =  		amb_col *  		texture(ao, uv).r * material.ao; +#else +	vec3 ambient = amb_col * material.ao; +#endif -	vec3 base_diffuse = diffuse_brdf(uv) * (1.0 - met); +	vec3 base_diffuse = diffuse_brdf(uv, col) * (1.0 - met);  	vec3 light = 0.0.xxx;  	e = globals.sun_irange.y; |