From c1179f41e32c308e80e312802e24edaa14574fda Mon Sep 17 00:00:00 2001 From: daemyung jang Date: Thu, 14 Apr 2022 08:11:11 +0900 Subject: [PATCH] Summerize Chapter 22: Integrating SpriteKit & SceneKit --- 22-integrating-spritekit-scenekit/README.md | 42 ++++++++++++++++++ .../step-function.png | Bin 0 -> 58108 bytes README.md | 1 + 3 files changed, 43 insertions(+) create mode 100644 22-integrating-spritekit-scenekit/README.md create mode 100644 22-integrating-spritekit-scenekit/step-function.png diff --git a/22-integrating-spritekit-scenekit/README.md b/22-integrating-spritekit-scenekit/README.md new file mode 100644 index 0000000..d37c24d --- /dev/null +++ b/22-integrating-spritekit-scenekit/README.md @@ -0,0 +1,42 @@ +# Chapter 22: Integrating SpriteKit & SceneKit + +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. + +## The fwidth function + +fwidth() is equivalent to: + +``` +abs(dfdx(p)) + abs(dfdy(p)) +``` + +The camera position is defined by the constant value in the fragment shader. It's not good because the camera position can be changed. + +In Shaders.metal, in shipFragment(), replace: + +``` +float3 v = normalize(float3(0, 0, 10)); // camera position +``` + +With: + +``` +float3 v = normalize(cameraPosition); +``` + +Add the float3 as a parameter to the fragment function: + +``` +constant float3 &cameraPosition +``` + +In GameViewController.swift, in the conditional block where you set up the material, add this: + +``` +let cameraPosition = cameraNode.position +material.setValue(cameraPosition, forKey: "cameraPosition") +``` + +step() generates a step function by comparing x to edge: + +![](./step-function.png) diff --git a/22-integrating-spritekit-scenekit/step-function.png b/22-integrating-spritekit-scenekit/step-function.png new file mode 100644 index 0000000000000000000000000000000000000000..c90bb349a6c0ad986ee3b75368c15d943174fe9e GIT binary patch literal 58108 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index d492018..847beae 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ You can see color images in this book at [here](https://www.raywenderlich.com/bo * [Chapter 19: Advanced Shadows](https://github.com/daemyung/metal-by-tutorials/tree/main/19-shadows) * [Chapter 20: Advanced Lighting](https://github.com/daemyung/metal-by-tutorials/tree/main/20-advanced-lighting) * [Chapter 21: Metal Performance Shaders](https://github.com/daemyung/metal-by-tutorials/tree/main/21-metal-performance-shaders) + * [Chapter 22: Integrating SpirteKit & SceneKit](https://github.com/daemyung/metal-by-tutorials/tree/main/22-integrating-spritekit-scenekit) ## Copyright