added more example scene and oren-nayar diffuse shading

This commit is contained in:
Sven Vogel 2023-04-20 15:09:52 +02:00
parent 074074704a
commit 427ccccc1b
16 changed files with 13543 additions and 25 deletions

32
res/head.mtl Normal file
View File

@ -0,0 +1,32 @@
# Blender 3.4.1 MTL File: 'None'
# www.blender.org
newmtl light
Ns 250.000000
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 1.000000
illum 2
newmtl light_blue
Ns 250.000000
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 1.000000
illum 2
newmtl white
Ns 250.000000
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 1.000000
illum 2

6752
res/head.obj Normal file

File diff suppressed because it is too large Load Diff

42
res/light_box.mtl Normal file
View File

@ -0,0 +1,42 @@
# Blender 3.4.1 MTL File: 'None'
# www.blender.org
newmtl light
Ns 250.000000
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 1.000000
illum 2
newmtl light_green
Ns 250.000000
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 1.000000
illum 2
newmtl light_red
Ns 250.000000
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 1.000000
illum 2
newmtl white
Ns 250.000000
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 1.000000
illum 2

2047
res/light_box.obj Normal file

File diff suppressed because it is too large Load Diff

42
res/plane.mtl Normal file
View File

@ -0,0 +1,42 @@
# Blender 3.4.1 MTL File: 'None'
# www.blender.org
newmtl light_blue
Ns 250.000000
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 1.000000
illum 2
newmtl light_green
Ns 250.000000
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 1.000000
illum 2
newmtl light_red
Ns 250.000000
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 1.000000
illum 2
newmtl white
Ns 250.000000
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 1.000000
illum 2

4568
res/plane.obj Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 638 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 460 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 285 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 869 KiB

View File

@ -24,7 +24,7 @@ void main() {
vec3 color = texture(image, uv).rgb; vec3 color = texture(image, uv).rgb;
color = smart_de_noise(image, uv, 5.0, 1.0, 0.400).rgb; color = smart_de_noise(image, uv, 5.0, 1.0, 0.200).rgb;
color = reinhard_jodie(color); color = reinhard_jodie(color);

View File

@ -17,8 +17,8 @@ impl Camera {
front: Vector3::new(0.0, 0.0, -1.0), front: Vector3::new(0.0, 0.0, -1.0),
left: Vector3::new(1.0, 0.0, 0.0), left: Vector3::new(1.0, 0.0, 0.0),
up: Vector3::new(0.0, -1.0, 0.0), up: Vector3::new(0.0, -1.0, 0.0),
pos: Vector3::new(0.0, 1.0, 9.0), pos: Vector3::new(0.0, 0.0, 9.0),
fov: 90.0f32 fov: 65.0f32
} }
} }

View File

@ -36,10 +36,10 @@ lazy_static! {
emission: Padded::from([0.0, 0.0, 0.0]), emission: Padded::from([0.0, 0.0, 0.0]),
specular_color: [0.0, 0.0, 0.0], specular_color: [0.0, 0.0, 0.0],
roughness: 1.0, roughness: 1.0,
specular: 0.0,
transmission: 0.0, transmission: 0.0,
ior: 1.0, ior: 1.0,
metallic: false as u32, metallic: false as u32,
__padding: 0
}; };
} }
@ -51,10 +51,21 @@ fn add_default_materials() {
emission: Padded::from([0.0, 0.0, 0.0]), emission: Padded::from([0.0, 0.0, 0.0]),
specular_color: [0.0, 0.0, 0.0], specular_color: [0.0, 0.0, 0.0],
roughness: 1.0, roughness: 1.0,
specular: 0.0,
transmission: 0.0,
ior: 1.0,
metallic: false as u32,
});
material_collection.insert(String::from("glossy"), cs::Material {
albedo: Padded::from([1.0, 1.0, 1.0]),
emission: Padded::from([0.0, 0.0, 0.0]),
specular_color: [0.0, 0.0, 0.0],
roughness: 0.0,
specular: 0.8,
transmission: 0.0, transmission: 0.0,
ior: 1.0, ior: 1.0,
metallic: false as u32, metallic: false as u32,
__padding: 0
}); });
material_collection.insert(String::from("red"), cs::Material { material_collection.insert(String::from("red"), cs::Material {
@ -62,10 +73,10 @@ fn add_default_materials() {
emission: Padded::from([0.0, 0.0, 0.0]), emission: Padded::from([0.0, 0.0, 0.0]),
specular_color: [0.0, 0.0, 0.0], specular_color: [0.0, 0.0, 0.0],
roughness: 1.0, roughness: 1.0,
specular: 0.0,
transmission: 0.0, transmission: 0.0,
ior: 1.0, ior: 1.0,
metallic: false as u32, metallic: false as u32,
__padding: 0
}); });
material_collection.insert(String::from("green"), cs::Material { material_collection.insert(String::from("green"), cs::Material {
@ -73,10 +84,10 @@ fn add_default_materials() {
emission: Padded::from([0.0, 0.0, 0.0]), emission: Padded::from([0.0, 0.0, 0.0]),
specular_color: [0.0, 0.0, 0.0], specular_color: [0.0, 0.0, 0.0],
roughness: 1.0, roughness: 1.0,
specular: 0.0,
transmission: 0.0, transmission: 0.0,
ior: 1.0, ior: 1.0,
metallic: false as u32, metallic: false as u32,
__padding: 0
}); });
material_collection.insert(String::from("glass"), cs::Material { material_collection.insert(String::from("glass"), cs::Material {
@ -84,10 +95,10 @@ fn add_default_materials() {
emission: Padded::from([0.0, 0.0, 0.0]), emission: Padded::from([0.0, 0.0, 0.0]),
specular_color: [0.0, 0.0, 0.0], specular_color: [0.0, 0.0, 0.0],
roughness: 1.5, roughness: 1.5,
specular: 0.0,
transmission: 1.0, transmission: 1.0,
ior: 1.0, ior: 1.0,
metallic: false as u32, metallic: false as u32,
__padding: 0
}); });
material_collection.insert(String::from("light"), cs::Material { material_collection.insert(String::from("light"), cs::Material {
@ -95,10 +106,10 @@ fn add_default_materials() {
emission: Padded::from([1.0, 1.0, 1.0]), emission: Padded::from([1.0, 1.0, 1.0]),
specular_color: [0.0, 0.0, 0.0], specular_color: [0.0, 0.0, 0.0],
roughness: 1.5, roughness: 1.5,
specular: 0.0,
transmission: 0.0, transmission: 0.0,
ior: 0.0, ior: 0.0,
metallic: false as u32, metallic: false as u32,
__padding: 0
}); });
material_collection.insert(String::from("light_blue"), cs::Material { material_collection.insert(String::from("light_blue"), cs::Material {
@ -106,10 +117,10 @@ fn add_default_materials() {
emission: Padded::from([0.3, 0.3, 1.0]), emission: Padded::from([0.3, 0.3, 1.0]),
specular_color: [0.0, 0.0, 0.0], specular_color: [0.0, 0.0, 0.0],
roughness: 1.5, roughness: 1.5,
specular: 0.0,
transmission: 0.0, transmission: 0.0,
ior: 0.0, ior: 0.0,
metallic: false as u32, metallic: false as u32,
__padding: 0
}); });
material_collection.insert(String::from("light_red"), cs::Material { material_collection.insert(String::from("light_red"), cs::Material {
@ -117,10 +128,10 @@ fn add_default_materials() {
emission: Padded::from([1.0, 0.3, 0.3]), emission: Padded::from([1.0, 0.3, 0.3]),
specular_color: [0.0, 0.0, 0.0], specular_color: [0.0, 0.0, 0.0],
roughness: 1.5, roughness: 1.5,
specular: 0.0,
transmission: 0.0, transmission: 0.0,
ior: 0.0, ior: 0.0,
metallic: false as u32, metallic: false as u32,
__padding: 0
}); });
material_collection.insert(String::from("light_green"), cs::Material { material_collection.insert(String::from("light_green"), cs::Material {
@ -128,10 +139,10 @@ fn add_default_materials() {
emission: Padded::from([0.3, 1.0, 0.3]), emission: Padded::from([0.3, 1.0, 0.3]),
specular_color: [0.0, 0.0, 0.0], specular_color: [0.0, 0.0, 0.0],
roughness: 1.5, roughness: 1.5,
specular: 0.0,
transmission: 0.0, transmission: 0.0,
ior: 0.0, ior: 0.0,
metallic: false as u32, metallic: false as u32,
__padding: 0
}); });
} }
@ -291,7 +302,7 @@ fn create_image(memory_allocator: &StandardMemoryAllocator, queue: &Arc<Queue>,
} }
fn load_example_scene() -> (Vec<[f32; 4]>, Vec<u32>, Vec<cs::Material>) { fn load_example_scene() -> (Vec<[f32; 4]>, Vec<u32>, Vec<cs::Material>) {
let (mut models, materials) = tobj::load_obj("res/example-scene.obj", &tobj::GPU_LOAD_OPTIONS).expect("unable to load scene from obj"); let (mut models, materials) = tobj::load_obj("res/head.obj", &tobj::GPU_LOAD_OPTIONS).expect("unable to load scene from obj");
// allocate some host memory // allocate some host memory
let mut vertices:Vec<[f32; 4]> = vec![]; let mut vertices:Vec<[f32; 4]> = vec![];
@ -336,7 +347,7 @@ fn create_gpu_buffer(vertices: &Vec<[f32; 4]>, indices: &Vec<u32>, materials: &V
..Default::default() ..Default::default()
}, },
AllocationCreateInfo { AllocationCreateInfo {
usage: MemoryUsage::DeviceOnly, usage: MemoryUsage::Upload,
..Default::default() ..Default::default()
}, },
vertices.clone(), vertices.clone(),
@ -349,7 +360,7 @@ fn create_gpu_buffer(vertices: &Vec<[f32; 4]>, indices: &Vec<u32>, materials: &V
..Default::default() ..Default::default()
}, },
AllocationCreateInfo { AllocationCreateInfo {
usage: MemoryUsage::DeviceOnly, usage: MemoryUsage::Upload,
..Default::default() ..Default::default()
}, },
indices.clone(), indices.clone(),
@ -362,7 +373,7 @@ fn create_gpu_buffer(vertices: &Vec<[f32; 4]>, indices: &Vec<u32>, materials: &V
..Default::default() ..Default::default()
}, },
AllocationCreateInfo { AllocationCreateInfo {
usage: MemoryUsage::DeviceOnly, usage: MemoryUsage::Upload,
..Default::default() ..Default::default()
}, },
materials.clone(), materials.clone(),

View File

@ -27,6 +27,22 @@ uint get_pixel_index() {
return gl_GlobalInvocationID.y * uint(program_metadata.resolution.x) + gl_GlobalInvocationID.x; return gl_GlobalInvocationID.y * uint(program_metadata.resolution.x) + gl_GlobalInvocationID.x;
} }
// from: https://github.com/glslify/glsl-diffuse-oren-nayar/blob/master/index.glsl
vec3 oren_nayar_diffuse(in vec3 lightDirection, in vec3 viewDirection, in vec3 surfaceNormal, in float roughness, in vec3 albedo) {
float LdotV = dot(lightDirection, viewDirection);
float NdotL = dot(lightDirection, surfaceNormal);
float NdotV = dot(surfaceNormal, viewDirection);
float s = LdotV - NdotL * NdotV;
float t = mix(1.0, max(NdotL, NdotV), step(0.0, s));
float sigma2 = roughness * roughness;
vec3 A = 1.0 + sigma2 * (albedo / (sigma2 + 0.13) + 0.5 / (sigma2 + 0.33));
float B = 0.45 * sigma2 / (sigma2 + 0.09);
return albedo * max(0.0, NdotL) * (A + B * s / t) / PI;
}
vec3 trace_direct(in Ray ray) { vec3 trace_direct(in Ray ray) {
vec3 color = vec3(0); vec3 color = vec3(0);
vec3 throughput = vec3(1); vec3 throughput = vec3(1);
@ -42,12 +58,23 @@ vec3 trace_direct(in Ray ray) {
Material material = materials[hit.material_index]; Material material = materials[hit.material_index];
color += material.emission * 64.0 * throughput * pdf; color += material.emission * 256.0 * throughput * pdf;
throughput *= material.albedo; float fresnel = abs(dot(ray.direction, hit.normal));
ray.origin = ray.origin + ray.direction * hit.depth; if (random() * material.specular > fresnel) {
ray.direction = generate_brdf_ray_direction(hit.normal, ray.direction, 1.0); // reflection ray
ray.origin = ray.origin + ray.direction * hit.depth;
ray.direction = generate_brdf_ray_direction(hit.normal, ray.direction, material.roughness);
} else {
vec3 incident = ray.direction;
// diffuse ray
ray.origin = ray.origin + ray.direction * hit.depth;
ray.direction = generate_brdf_ray_direction(hit.normal, ray.direction, 1.0);
throughput *= oren_nayar_diffuse(ray.direction, incident, hit.normal, material.roughness, material.albedo);
}
} }
return color; return color;

View File

@ -30,16 +30,13 @@ struct Material {
vec3 specular_color; vec3 specular_color;
// roughtness of the microfacets // roughtness of the microfacets
float roughness; float roughness;
float specular;
// index of refraction (exclusive to metalic) // index of refraction (exclusive to metalic)
float ior; float ior;
// how transmissive the surface is (exclusive to metalic) // how transmissive the surface is (exclusive to metalic)
float transmission; float transmission;
// whether the surface is metalic or not (exclusive to ior and transmission) // whether the surface is metalic or not (exclusive to ior and transmission)
bool metallic; bool metallic;
// extra padding required for vulkano not properly padding the structs in the buffer
// the size of the useble data is 60 bytes, GLSL will add 4 additional bytes, to round up to 64.
// for compatibility I added the padding manually
bool __padding;
}; };
layout(set = 0, binding = 3) buffer VertexBuffer { layout(set = 0, binding = 3) buffer VertexBuffer {
@ -74,7 +71,7 @@ vec3 intersect_triangle(in Ray ray, in vec3 v0, in vec3 v1, in vec3 v2, out vec3
// test if the intersection lies outside of the triangle by checking the bounds of the barycentric coordinates // test if the intersection lies outside of the triangle by checking the bounds of the barycentric coordinates
// also perform backface culling // also perform backface culling
if(u < 0.0 || v < 0.0 || (u + v) > 1.0 || d > 0.0) if(u < 0.0 || v < 0.0 || (u + v) > 1.0)
t = -1.0; t = -1.0;
return vec3(t, u, v); return vec3(t, u, v);