Move reindexing to the shader

This commit is contained in:
Ali 2021-10-14 00:33:08 +04:00
parent 81fbc6b55c
commit 074df6febf
2 changed files with 6 additions and 7 deletions

View File

@ -26,10 +26,11 @@ vertex Varyings vertexPassthrough(
constant Vertex *verticies[[buffer(0)]], constant Vertex *verticies[[buffer(0)]],
constant float2 &offset[[buffer(1)]], constant float2 &offset[[buffer(1)]],
unsigned int vid[[vertex_id]], unsigned int vid[[vertex_id]],
constant float4x4 &transformMatrix[[buffer(2)]] constant float4x4 &transformMatrix[[buffer(2)]],
constant int &indexOffset[[buffer(3)]]
) { ) {
Varyings out; Varyings out;
constant Vertex &v = verticies[vid]; constant Vertex &v = verticies[vid + indexOffset];
float2 viewSize(512.0f, 512.0f); float2 viewSize(512.0f, 512.0f);
float4 transformedVertex = transformMatrix * float4(v.position, 0.0, 1.0); float4 transformedVertex = transformMatrix * float4(v.position, 0.0, 1.0);
out.position = float4(screenSpaceToRelative(float2(transformedVertex.x, transformedVertex.y) + offset, viewSize), 0.0, 1.0); out.position = float4(screenSpaceToRelative(float2(transformedVertex.x, transformedVertex.y) + offset, viewSize), 0.0, 1.0);

View File

@ -458,11 +458,7 @@ public final class MeshRenderer: MTKView {
let baseVertexIndex = Int32(startVertexIndex) let baseVertexIndex = Int32(startVertexIndex)
segment.triangles.withUnsafeBytes { triangles in segment.triangles.withUnsafeBytes { triangles in
let trianglesBase = triangles.baseAddress!.assumingMemoryBound(to: Int32.self) let _ = memcpy(indexData.advanced(by: nextIndexIndex), triangles.baseAddress!, triangles.count)
let indexBase = indexData.advanced(by: nextIndexIndex)
for i in 0 ..< triangles.count / 4 {
indexBase[i] = trianglesBase[i] + baseVertexIndex
}
} }
nextIndexIndex += segment.triangles.count / 4 nextIndexIndex += segment.triangles.count / 4
@ -527,6 +523,8 @@ public final class MeshRenderer: MTKView {
transformBytes[15] = Float(transform.m44) transformBytes[15] = Float(transform.m44)
renderEncoder.setVertexBytes(&transformBytes, length: transformBytes.count * 4, index: 2) renderEncoder.setVertexBytes(&transformBytes, length: transformBytes.count * 4, index: 2)
var baseVertexIndexBytes: Int32 = Int32(baseVertexIndex)
renderEncoder.setVertexBytes(&baseVertexIndexBytes, length: 4, index: 3)
renderEncoder.setVertexBuffer(mesh.vertexBuffer, offset: 0, index: 0) renderEncoder.setVertexBuffer(mesh.vertexBuffer, offset: 0, index: 0)
renderEncoder.drawIndexedPrimitives(type: .triangle, indexCount: iCount, indexType: .uint32, indexBuffer: mesh.indexBuffer, indexBufferOffset: iStart * 4) renderEncoder.drawIndexedPrimitives(type: .triangle, indexCount: iCount, indexType: .uint32, indexBuffer: mesh.indexBuffer, indexBufferOffset: iStart * 4)