+ | Better material pathtraced system

This commit is contained in:
TheRedShip
2025-01-04 19:34:05 +01:00
parent 8f256e5c35
commit d02b9ffb5d
4 changed files with 49 additions and 66 deletions

View File

@ -73,22 +73,18 @@ hitInfo traceRay(Ray ray)
return (hit);
}
Ray newRay(hitInfo hit, Ray ray, inout uint rng_state)
Ray newRay(hitInfo hit, Ray ray, bool is_specular, inout uint rng_state)
{
GPUObject obj;
Ray new_ray;
// vec3 in_unit_sphere;
obj = objects[hit.obj_index];
// in_unit_sphere = normalize(randomVec3(uv, u_time));
// in_unit_sphere *= sign(dot(in_unit_sphere, hit.normal));
vec3 diffuse_dir = normalize(randomHemisphereDirection(hit.normal, rng_state));
vec3 diffuse_dir = normalize(hit.normal + randomDirection(rng_state));
vec3 specular_dir = reflect(ray.direction, hit.normal);
new_ray.origin = hit.position + hit.normal * 0.001;
new_ray.direction = mix(diffuse_dir, specular_dir, obj.roughness);
new_ray.direction = mix(diffuse_dir, specular_dir, obj.roughness * float(is_specular));
return (new_ray);
}
@ -110,14 +106,15 @@ vec3 pathtrace(Ray ray, inout uint rng_state)
}
GPUObject obj = objects[hit.obj_index];
color *= obj.color;
bool is_specular = (obj.metallic >= randomValue(rng_state));
color *= mix(obj.color, vec3(1.0, 1.0, 1.0), is_specular);
light += obj.emission * obj.color;
if (obj.emission > 0.0)
break;
ray = newRay(hit, ray, rng_state);
ray = newRay(hit, ray, is_specular, rng_state);
}
return (color * light);
}
@ -142,14 +139,15 @@ void main()
Ray ray = Ray(u_cameraPosition, ray_direction);
vec3 color = pathtrace(ray, rng_state);
// color = vec3(sqrt(color.x), sqrt(color.y), sqrt(color.z));
float blend = 1.0 / float(u_frameCount + 1);
vec4 accum = imageLoad(accumulation_image, pixel_coords);
accum.rgb = mix(accum.rgb, color, blend);
accum.a = 1.0;
accum.a = 1.0;
imageStore(accumulation_image, pixel_coords, accum);
imageStore(output_image, pixel_coords, accum);
vec4 final_color = vec4(sqrt(accum.r), sqrt(accum.g), sqrt(accum.b), accum.a);
imageStore(output_image, pixel_coords, final_color);
}

View File

@ -1,48 +1,3 @@
float rand_seed = 0;
uint hash( uint x ) {
x += ( x << 10u );
x ^= ( x >> 6u );
x += ( x << 3u );
x ^= ( x >> 11u );
x += ( x << 15u );
return x;
}
uint hash( uvec2 v ) { return hash( v.x ^ hash(v.y) ); }
uint hash( uvec3 v ) { return hash( v.x ^ hash(v.y) ^ hash(v.z) ); }
uint hash( uvec4 v ) { return hash( v.x ^ hash(v.y) ^ hash(v.z) ^ hash(v.w) ); }
float floatConstruct( uint m ) {
const uint ieeeMantissa = 0x007FFFFFu;
const uint ieeeOne = 0x3F800000u;
m &= ieeeMantissa;
m |= ieeeOne;
float f = uintBitsToFloat( m );
return f - 1.0;
}
float randombis( float x ) { return floatConstruct(hash(floatBitsToUint(x))); }
float randombis( vec2 v ) { return floatConstruct(hash(floatBitsToUint(v))); }
float randombis( vec3 v ) { return floatConstruct(hash(floatBitsToUint(v))); }
float randombis( vec4 v ) { return floatConstruct(hash(floatBitsToUint(v))); }
float random(vec2 uv, float time)
{
if (rand_seed == 0)
rand_seed = time;
rand_seed *= 2;
return randombis(vec3(uv.xy, time * rand_seed));
}
vec3 randomVec3(vec2 uv, float time)
{
return (vec3((random(uv, time) - 0.5) * 2, (random(uv, time) - 0.5) * 2, (random(uv, time) - 0.5) * 2));
}
float randomValue(inout uint rng_state)
{
rng_state = rng_state * 747796405 + 2891336453;