Add grid coordinate argument encoding stuff and a texture to hold heights

This commit is contained in:
Eryn Wells 2018-11-03 16:25:19 -04:00
parent a5c86f9c31
commit dac8f24568
3 changed files with 28 additions and 7 deletions

View file

@ -23,15 +23,17 @@
typedef NS_ENUM(NSInteger, BufferIndex)
{
BufferIndexMeshPositions = 0,
BufferIndexMeshGenerics = 1,
BufferIndexUniforms = 2
BufferIndexMeshPositions = 0,
BufferIndexMeshGenerics = 1,
BufferIndexMeshGridCoords = 2,
BufferIndexUniforms = 3,
};
typedef NS_ENUM(NSInteger, VertexAttribute)
{
VertexAttributePosition = 0,
VertexAttributeTexcoord = 1,
VertexAttributeGridCoord = 2,
};
typedef NS_ENUM(NSInteger, TextureIndex)

View file

@ -20,6 +20,7 @@ typedef struct
{
float3 position [[attribute(VertexAttributePosition)]];
float2 texCoord [[attribute(VertexAttributeTexcoord)]];
uint2 gridCoord [[attribute(VertexAttributeGridCoord)]];
} Vertex;
typedef struct
@ -29,6 +30,7 @@ typedef struct
} ColorInOut;
vertex ColorInOut vertexShader(Vertex in [[stage_in]],
texture2d<half> heights [[ texture(1) ]],
constant Uniforms & uniforms [[ buffer(BufferIndexUniforms) ]])
{
ColorInOut out;

View file

@ -15,21 +15,29 @@ class Terrain: NSObject {
class func buildVertexDescriptor() -> MTLVertexDescriptor {
let mtlVertexDescriptor = MTLVertexDescriptor()
mtlVertexDescriptor.attributes[VertexAttribute.position.rawValue].format = MTLVertexFormat.float3
mtlVertexDescriptor.attributes[VertexAttribute.position.rawValue].format = .float3
mtlVertexDescriptor.attributes[VertexAttribute.position.rawValue].offset = 0
mtlVertexDescriptor.attributes[VertexAttribute.position.rawValue].bufferIndex = BufferIndex.meshPositions.rawValue
mtlVertexDescriptor.attributes[VertexAttribute.texcoord.rawValue].format = MTLVertexFormat.float2
mtlVertexDescriptor.attributes[VertexAttribute.texcoord.rawValue].format = .float2
mtlVertexDescriptor.attributes[VertexAttribute.texcoord.rawValue].offset = 0
mtlVertexDescriptor.attributes[VertexAttribute.texcoord.rawValue].bufferIndex = BufferIndex.meshGenerics.rawValue
mtlVertexDescriptor.attributes[VertexAttribute.gridCoord.rawValue].format = .uint2
mtlVertexDescriptor.attributes[VertexAttribute.gridCoord.rawValue].offset = 0
mtlVertexDescriptor.attributes[VertexAttribute.gridCoord.rawValue].bufferIndex = BufferIndex.meshGridCoords.rawValue
mtlVertexDescriptor.layouts[BufferIndex.meshPositions.rawValue].stride = 12
mtlVertexDescriptor.layouts[BufferIndex.meshPositions.rawValue].stepRate = 1
mtlVertexDescriptor.layouts[BufferIndex.meshPositions.rawValue].stepFunction = MTLVertexStepFunction.perVertex
mtlVertexDescriptor.layouts[BufferIndex.meshPositions.rawValue].stepFunction = .perVertex
mtlVertexDescriptor.layouts[BufferIndex.meshGenerics.rawValue].stride = 8
mtlVertexDescriptor.layouts[BufferIndex.meshGenerics.rawValue].stepRate = 1
mtlVertexDescriptor.layouts[BufferIndex.meshGenerics.rawValue].stepFunction = MTLVertexStepFunction.perVertex
mtlVertexDescriptor.layouts[BufferIndex.meshGenerics.rawValue].stepFunction = .perVertex
mtlVertexDescriptor.layouts[BufferIndex.meshGridCoords.rawValue].stride = MemoryLayout<uint2>.stride
mtlVertexDescriptor.layouts[BufferIndex.meshGridCoords.rawValue].stepRate = 1
mtlVertexDescriptor.layouts[BufferIndex.meshGridCoords.rawValue].stepFunction = .perVertex
return mtlVertexDescriptor
}
@ -64,6 +72,7 @@ class Terrain: NSObject {
let segments: uint2
let vertexDescriptor: MTLVertexDescriptor
let mesh: MTKMesh
let heights: MTLTexture
init?(dimensions dim: float2, segments seg: uint2, device: MTLDevice) {
dimensions = dim
@ -77,6 +86,14 @@ class Terrain: NSObject {
return nil
}
let heightsDesc = MTLTextureDescriptor.texture2DDescriptor(pixelFormat: .r16Float, width: Int(segments.x), height: Int(segments.y), mipmapped: false)
heightsDesc.usage = [.shaderRead, .shaderWrite]
guard let tex = device.makeTexture(descriptor: heightsDesc) else {
print("Couldn't create heights texture")
return nil
}
heights = tex
super.init()
}
}