added more example scene and oren-nayar diffuse shading
This commit is contained in:
parent
074074704a
commit
427ccccc1b
|
@ -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
|
File diff suppressed because it is too large
Load Diff
|
@ -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
|
File diff suppressed because it is too large
Load Diff
|
@ -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
|
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 |
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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(),
|
||||||
|
|
|
@ -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));
|
||||||
|
|
||||||
|
if (random() * material.specular > fresnel) {
|
||||||
|
// 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.origin = ray.origin + ray.direction * hit.depth;
|
||||||
ray.direction = generate_brdf_ray_direction(hit.normal, ray.direction, 1.0);
|
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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Reference in New Issue