From 8ad28f0d9ff50deac18ab36291eba425be27fb7c Mon Sep 17 00:00:00 2001 From: daemyung jang Date: Tue, 5 Apr 2022 09:57:58 +0900 Subject: [PATCH] Summerize Chapter 19: Advanced Shadows --- 19-shadows/README.md | 97 ++++++++++++++++++++++++++++++ 19-shadows/specular-lighting.jpeg | Bin 0 -> 16161 bytes README.md | 1 + 3 files changed, 98 insertions(+) create mode 100644 19-shadows/README.md create mode 100644 19-shadows/specular-lighting.jpeg diff --git a/19-shadows/README.md b/19-shadows/README.md new file mode 100644 index 0000000..4e398d4 --- /dev/null +++ b/19-shadows/README.md @@ -0,0 +1,97 @@ +# Chapter 19: Advanced Shadows + +As I read this book, I summarize what I think is wrong. If you think my comments are wrong then please let me know. We can dicuss more and update your opinion. + +## Hard shadows + +There is a runtime error in because Shaders.metal files isn't included in the bundle. But we have the default library. + +In Renderer.swift, in initializeMetal(), replace this: + +``` +guard let path = Bundle.main.path(forResource: "Shaders", ofType: "metal") else { fatalError() } +let input = try String(contentsOfFile: path, encoding: String.Encoding.utf8) +let library = try device.makeLibrary(source: input, options: nil) +``` + +With: + +``` +let library = device.makeDefaultLibrary()! +``` + +## Soft shadows + +There is a runtime error in because Shaders.metal files isn't included in the bundle. But we have the default library. + +In Renderer.swift, in initializeMetal(), replace this: + +``` +guard let path = Bundle.main.path(forResource: "Shaders", ofType: "metal") else { fatalError() } +let input = try String(contentsOfFile: path, encoding: String.Encoding.utf8) +let library = try device.makeLibrary(source: input, options: nil) +``` + +With: + +``` +let library = device.makeDefaultLibrary()! +``` + +We have created a new function named lighting() and this function calculates diffuse lighting and specular lighting. But calculating lighting reflection is totally wrong as I think. Specular lighting is based on the light's direction vector and the object's normal vectors, but this time it is also based on the view direction. You can see this below figure. + +![](./specular-lighting.jpeg) + +Thus instead of calculating the intensity between the reflected direction and the light direction, we should deal with the eye position for the specular lighting. + +In Shaders.metal, in compute(output, time, gid), replace this: + +``` +Ray ray = Ray{float3(0.0, 4.0, -12.0), normalize(float3(uv, 1.0))}; +``` + +With: + +``` +float3 eye = float3(0.0, 4.0, -12.0); +Ray ray = Ray{eye, normalize(float3(uv, 1.0))}; +``` + +In Shaders.metal, in lighting(ray, normal, light), pass the eye position as a paramter: + +``` +float lighting(Ray ray, float3 normal, Light light, float3 eye) +``` + +And replace this: + +``` +float3 reflectedRay = reflect(ray.direction, normal); +float specular = max(0.0, dot(reflectedRay, lightRay)); +``` + +With: + +``` +float3 reflectedRay = reflect(-lightRay, normal); +float3 eyeDir = normalize(eye - ray.origin); +float specular = max(0.0, dot(reflectedRay, eyeDir)); +``` + +## Ambient occlusion + +There is a runtime error in because Shaders.metal files isn't included in the bundle. But we have the default library. + +In Renderer.swift, in initializeMetal(), replace this: + +``` +guard let path = Bundle.main.path(forResource: "Shaders", ofType: "metal") else { fatalError() } +let input = try String(contentsOfFile: path, encoding: String.Encoding.utf8) +let library = try device.makeLibrary(source: input, options: nil) +``` + +With: + +``` +let library = device.makeDefaultLibrary()! +``` diff --git a/19-shadows/specular-lighting.jpeg b/19-shadows/specular-lighting.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..1c17b511dbd8e5290ac19a49905497ea5ac997af GIT binary patch literal 16161 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 39abb7c..46dacdc 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,7 @@ You can see color images in this book at [here](https://www.raywenderlich.com/bo * [Chapter 15: GPU-Driven Rendering](https://github.com/daemyung/metal-by-tutorials/tree/main/15-gpu-driven-rendering) * [Chapter 16: Particle Systems](https://github.com/daemyung/metal-by-tutorials/tree/main/16-particle-systems) * [Chapter 18: Rendering with Rays](https://github.com/daemyung/metal-by-tutorials/tree/main/18-rendering-with-rays) + * [Chapter 19: Advanced Shadows](https://github.com/daemyung/metal-by-tutorials/tree/main/19-shadows) ## Copyright