diff --git a/Terrain2/Shaders.metal b/Terrain2/Shaders.metal index 86cf8fe..82a43f2 100644 --- a/Terrain2/Shaders.metal +++ b/Terrain2/Shaders.metal @@ -30,12 +30,17 @@ typedef struct } ColorInOut; vertex ColorInOut vertexShader(Vertex in [[stage_in]], - texture2d heights [[ texture(1) ]], - constant Uniforms & uniforms [[ buffer(BufferIndexUniforms) ]]) + texture2d heights [[texture(0)]], + constant Uniforms & uniforms [[buffer(BufferIndexUniforms)]]) { + constexpr sampler s(coord::pixel, address::clamp_to_zero, filter::linear); + ColorInOut out; - float4 position = float4(in.position, 1.0); + uint2 gridCoord(in.texCoord.x * heights.get_width(), in.texCoord.y * heights.get_height()); + half4 height = heights.read(gridCoord).rrrr; + + float4 position(in.position.x, float(height.r), in.position.z, 1.0); out.position = uniforms.projectionMatrix * uniforms.modelViewMatrix * position; out.texCoord = in.texCoord; diff --git a/Terrain2/Terrain.swift b/Terrain2/Terrain.swift index a67af2d..459e95c 100644 --- a/Terrain2/Terrain.swift +++ b/Terrain2/Terrain.swift @@ -43,10 +43,11 @@ class Terrain: NSObject { } /// Create and condition mesh data to feed into a pipeline using the given vertex descriptor. - /// @param dimensions Coordinate dimensions of the plane - /// @param segments Number of segments to divide each dimension into - /// @param device Metal device - /// @param vertexDescriptor Description of how to lay out vertex data in GPU memory + /// + /// - parameter dimensions: Coordinate dimensions of the plane. + /// - parameter segments: Number of segments to divide each dimension into. + /// - parameter device: Metal device. + /// - parameter vertexDescriptor: Description of how to lay out vertex data in GPU memory. class func buildMesh(withDimensions dimensions: float2, segments: uint2, device: MTLDevice, vertexDescriptor: MTLVertexDescriptor) throws -> MTKMesh { let metalAllocator = MTKMeshBufferAllocator(device: device)