MetalByTutorials/21-metal-performance-shaders
daemyung jang 9d6a5e19fe
Summerize Chapter 21: Metal Performance Shaders
2022-04-12 21:42:53 +09:00
..
final Copy source code from the official website 2021-04-15 11:39:00 +09:00
projects Copy source code from the official website 2021-04-15 11:39:00 +09:00
sobel.playground Copy source code from the official website 2021-04-15 11:39:00 +09:00
starter Copy source code from the official website 2021-04-15 11:39:00 +09:00
README.md Summerize Chapter 21: Metal Performance Shaders 2022-04-12 21:42:53 +09:00
references.markdown Copy source code from the official website 2021-04-15 11:39:00 +09:00

README.md

Chapter 21: Metal Performance Shaders

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.

3. Secondary rays

In Renderer, in draw(in:), the code for secondary rays is like this:

for _ in 0..<3 {
  // MARK: generate intersections between rays and model triangles
  intersector.intersectionDataType = .distancePrimitiveIndexCoordinates
  intersector.encodeIntersection(commandBuffer: commandBuffer,
                                 intersectionType: .nearest,
                                 rayBuffer: rayBuffer, rayBufferOffset: 0,
                                 intersectionBuffer: intersectionBuffer, intersectionBufferOffset: 0,
                                 rayCount: width * height,
                                 accelerationStructure: accelerationStructure)
  
  // MARK: shading
  computeEncoder = commandBuffer.makeComputeCommandEncoder()
  computeEncoder?.label = "Shading"
  computeEncoder?.setBuffer(uniformBuffer, offset: uniformBufferOffset, index: 0)
  computeEncoder?.setBuffer(rayBuffer, offset: 0, index: 1)
  computeEncoder?.setBuffer(shadowRayBuffer, offset: 0, index: 2)
  computeEncoder?.setBuffer(intersectionBuffer, offset: 0, index: 3)
  computeEncoder?.setBuffer(vertexColorBuffer, offset: 0, index: 4)
  computeEncoder?.setBuffer(vertexNormalBuffer, offset: 0, index: 5)
  computeEncoder?.setBuffer(randomBuffer, offset: randomBufferOffset, index: 6)
  computeEncoder?.setTexture(renderTarget, index: 0)
  computeEncoder?.setComputePipelineState(shadePipelineState!)
  computeEncoder?.dispatchThreadgroups(threadGroups, threadsPerThreadgroup: threadsPerGroup)
  computeEncoder?.endEncoding()
  
  // MARK: shadows
  intersector.label = "Shadow Intersector"
  intersector.intersectionDataType = .distance
  intersector.encodeIntersection(commandBuffer: commandBuffer,
                                 intersectionType: .any,
                                 rayBuffer: shadowRayBuffer, rayBufferOffset: 0,
                                 intersectionBuffer: intersectionBuffer, intersectionBufferOffset: 0,
                                 rayCount: width * height,
                                 accelerationStructure: accelerationStructure)
  
  computeEncoder = commandBuffer.makeComputeCommandEncoder()
  computeEncoder?.label = "Shadows"
  computeEncoder?.setBuffer(uniformBuffer, offset: uniformBufferOffset, index: 0)
  computeEncoder?.setBuffer(shadowRayBuffer, offset: 0, index: 1)
  computeEncoder?.setBuffer(intersectionBuffer, offset: 0, index: 2)
  computeEncoder?.setTexture(renderTarget, index: 0)
  computeEncoder?.setComputePipelineState(shadowPipelineState)
  computeEncoder?.dispatchThreadgroups(threadGroups, threadsPerThreadgroup: threadsPerGroup)
  computeEncoder?.endEncoding()
}