Schedule the vertex normal update kernel
This commit is contained in:
parent
55e63cd2cc
commit
3cd9aca62b
3 changed files with 26 additions and 5 deletions
|
@ -321,8 +321,8 @@ class Renderer: NSObject, MTKViewDelegate {
|
||||||
renderEncoder.setRenderPipelineState(normalPipelineState)
|
renderEncoder.setRenderPipelineState(normalPipelineState)
|
||||||
renderEncoder.setDepthStencilState(depthState)
|
renderEncoder.setDepthStencilState(depthState)
|
||||||
|
|
||||||
encodeVertexNormalsDrawCall(encoder: renderEncoder)
|
|
||||||
encodeFaceNormalsDrawCall(encoder: renderEncoder)
|
encodeFaceNormalsDrawCall(encoder: renderEncoder)
|
||||||
|
encodeVertexNormalsDrawCall(encoder: renderEncoder)
|
||||||
|
|
||||||
renderEncoder.endEncoding()
|
renderEncoder.endEncoding()
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,9 +50,12 @@ kernel void updateGeometryNormals(constant packed_float3 *meshPositions [[buffer
|
||||||
faceMidpoints[tid] = (1.0 / 3.0) * (v1 + v2 + v3);
|
faceMidpoints[tid] = (1.0 / 3.0) * (v1 + v2 + v3);
|
||||||
}
|
}
|
||||||
|
|
||||||
kernel void updateGeometryVertexNormals()
|
kernel void updateGeometryVertexNormals(constant packed_float3 *meshPositions [[buffer(GeneratorBufferIndexMeshPositions)]],
|
||||||
|
constant packed_ushort3 *indexes [[buffer(GeneratorBufferIndexIndexes)]],
|
||||||
|
constant packed_float3 *faceNormals [[buffer(GeneratorBufferIndexFaceNormals)]],
|
||||||
|
device packed_float3 *vertexNormals [[buffer(GeneratorBufferIndexNormals)]],
|
||||||
|
uint2 tid [[thread_position_in_grid]])
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - ZeroGenerator
|
#pragma mark - ZeroGenerator
|
||||||
|
|
|
@ -82,6 +82,7 @@ class Terrain: NSObject {
|
||||||
|
|
||||||
private let updateHeightsPipeline: MTLComputePipelineState
|
private let updateHeightsPipeline: MTLComputePipelineState
|
||||||
private let updateSurfaceNormalsPipeline: MTLComputePipelineState
|
private let updateSurfaceNormalsPipeline: MTLComputePipelineState
|
||||||
|
private let updateVertexNormalsPipeline: MTLComputePipelineState
|
||||||
|
|
||||||
let dimensions: float2
|
let dimensions: float2
|
||||||
let segments: uint2
|
let segments: uint2
|
||||||
|
@ -114,6 +115,7 @@ class Terrain: NSObject {
|
||||||
do {
|
do {
|
||||||
updateHeightsPipeline = try Terrain.computePipeline(withFunctionNamed: "updateGeometryHeights", device: device, library: library)
|
updateHeightsPipeline = try Terrain.computePipeline(withFunctionNamed: "updateGeometryHeights", device: device, library: library)
|
||||||
updateSurfaceNormalsPipeline = try Terrain.computePipeline(withFunctionNamed: "updateGeometryNormals", device: device, library: library)
|
updateSurfaceNormalsPipeline = try Terrain.computePipeline(withFunctionNamed: "updateGeometryNormals", device: device, library: library)
|
||||||
|
updateVertexNormalsPipeline = try Terrain.computePipeline(withFunctionNamed: "updateGeometryVertexNormals", device: device, library: library)
|
||||||
} catch {
|
} catch {
|
||||||
print("Unable to create compute pipelines for terrain geometry updates. Error: \(error)")
|
print("Unable to create compute pipelines for terrain geometry updates. Error: \(error)")
|
||||||
return nil
|
return nil
|
||||||
|
@ -158,7 +160,7 @@ class Terrain: NSObject {
|
||||||
if let computeEncoder = commandBuffer.makeComputeCommandEncoder() {
|
if let computeEncoder = commandBuffer.makeComputeCommandEncoder() {
|
||||||
//print("Scheduling update geometry heights")
|
//print("Scheduling update geometry heights")
|
||||||
computeEncoder.label = "Geometry Heights Encoder"
|
computeEncoder.label = "Geometry Heights Encoder"
|
||||||
computeEncoder.pushDebugGroup("Update Geometry: Heights")
|
computeEncoder.pushDebugGroup("Update Heights")
|
||||||
computeEncoder.setComputePipelineState(updateHeightsPipeline)
|
computeEncoder.setComputePipelineState(updateHeightsPipeline)
|
||||||
computeEncoder.setTexture(generator.outTexture, index: GeneratorTextureIndex.in.rawValue)
|
computeEncoder.setTexture(generator.outTexture, index: GeneratorTextureIndex.in.rawValue)
|
||||||
let vertexBuffer = mesh.vertexBuffers[BufferIndex.meshPositions.rawValue]
|
let vertexBuffer = mesh.vertexBuffers[BufferIndex.meshPositions.rawValue]
|
||||||
|
@ -174,7 +176,7 @@ class Terrain: NSObject {
|
||||||
if let computeEncoder = commandBuffer.makeComputeCommandEncoder() {
|
if let computeEncoder = commandBuffer.makeComputeCommandEncoder() {
|
||||||
//print("Scheduling update geometry normals")
|
//print("Scheduling update geometry normals")
|
||||||
computeEncoder.label = "Surface Normals Encoder"
|
computeEncoder.label = "Surface Normals Encoder"
|
||||||
computeEncoder.pushDebugGroup("Update Geometry: Surface Normals")
|
computeEncoder.pushDebugGroup("Update Surface Normals")
|
||||||
computeEncoder.setComputePipelineState(updateSurfaceNormalsPipeline)
|
computeEncoder.setComputePipelineState(updateSurfaceNormalsPipeline)
|
||||||
let indexBuffer = mesh.submeshes[0].indexBuffer
|
let indexBuffer = mesh.submeshes[0].indexBuffer
|
||||||
computeEncoder.setBuffer(indexBuffer.buffer, offset: indexBuffer.offset, index: GeneratorBufferIndex.indexes.rawValue)
|
computeEncoder.setBuffer(indexBuffer.buffer, offset: indexBuffer.offset, index: GeneratorBufferIndex.indexes.rawValue)
|
||||||
|
@ -186,6 +188,22 @@ class Terrain: NSObject {
|
||||||
computeEncoder.popDebugGroup()
|
computeEncoder.popDebugGroup()
|
||||||
computeEncoder.endEncoding()
|
computeEncoder.endEncoding()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let computeEncoder = commandBuffer.makeComputeCommandEncoder() {
|
||||||
|
computeEncoder.label = "Vertex Normals Encoder"
|
||||||
|
computeEncoder.pushDebugGroup("Update Vertex Normals")
|
||||||
|
computeEncoder.setComputePipelineState(updateVertexNormalsPipeline)
|
||||||
|
let indexBuffer = mesh.submeshes[0].indexBuffer
|
||||||
|
computeEncoder.setBuffer(indexBuffer.buffer, offset: indexBuffer.offset, index: GeneratorBufferIndex.indexes.rawValue)
|
||||||
|
let positionsBuffer = mesh.vertexBuffers[BufferIndex.meshPositions.rawValue]
|
||||||
|
computeEncoder.setBuffer(positionsBuffer.buffer, offset: positionsBuffer.offset, index: GeneratorBufferIndex.meshPositions.rawValue)
|
||||||
|
computeEncoder.setBuffer(faceNormalsBuffer, offset: 0, index: GeneratorBufferIndex.faceNormals.rawValue)
|
||||||
|
let normalsBuffer = mesh.vertexBuffers[BufferIndex.normals.rawValue]
|
||||||
|
computeEncoder.setBuffer(normalsBuffer.buffer, offset: normalsBuffer.offset, index: GeneratorBufferIndex.normals.rawValue)
|
||||||
|
computeEncoder.dispatchThreads(MTLSize(width: 2 * Int(segments.x * segments.y), height: 1, depth: 1), threadsPerThreadgroup: MTLSize(width: 8, height: 8, depth: 1))
|
||||||
|
computeEncoder.popDebugGroup()
|
||||||
|
computeEncoder.endEncoding()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func populateInitialFaceNormals() {
|
private func populateInitialFaceNormals() {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue