iOS/라이브러리

[Library, Metal] shader 사용방법

검은참깨두유vm 2023. 2. 6. 11:25
반응형

iOS 16.1, Xcode 14.1, Swift 5, Playground 환경에서 진행했습니다.

 

import simd

struct Vertex {
    var position: SIMD<Float>
    var color: SIMD4<Float>
}

let vertices: [Vertex] = [
    Vertex(position: SIMD3<Float>(-1, 1, 0), color: SIMD4<Float>(1, 0, 0, 1)),
    Vertex(position: SIMD3<Float>(-1, -1, 0), color: SIMD4<Float>(0, 1, 0, 1)),
    Vertex(position: SIMD3<Float>(1, -1, 0), color: SIMD4<Float>(0, 0, 1, 1)),
    Vertex(position: SIMD3<Float>(1, 1, 0), color: SIMD4<Float>(1, 0, 1, 1))
]

 

기존에 있던 vertex와 fragment을 나누어 좌표의 위치와 컬러를 나타내었으나,

위와 같이 Vertex 구조를 만들어서 사용할 수 있습니다.

 

let shader = """
#include <metal_stdlib>
using namespace metal;

struct VertexIn {
    float4 position [[ attribute(0) ]];
    float4 color [[ attribute(1) ]];
};

struct VertexOut {
    float4 position [[ position ]];
    float4 color;
};


vertex VertexOut vertex_main(const VertexIn vertexIn [[ stage_in ]]) {
    VertexOut vertexOut;
    vertexOut.position = vertexIn.position;
    vertexOut.color = vertexIn.color;

    return vertexOut;
}

fragment half4 fragment_main(VertexOut vertexIn [[ stage_in ]]) {
    return half4(vertexIn.color);
}
"""

 

shader 파일에 VertexIn과 VertexOut 구조를 만들어 Shader를 사용할 수 있습니다.

 

 

let vertexDescriptor = MTLVertexDescriptor()
vertexDescriptor.attributes[0].format = .float3
vertexDescriptor.attributes[0].offset = 0
vertexDescriptor.attributes[0].bufferIndex = 0

vertexDescriptor.attributes[1].format = .float4
vertexDescriptor.attributes[1].offset = MemoryLayout<SIMD3<Float>>.stride
vertexDescriptor.attributes[1].bufferIndex = 0

vertexDescriptor.layouts[0].stride = MemoryLayout<Vertex>.stride

pipelineDescriptor.vertexDescriptor = vertexDescriptor

 

vertexDescriptor를 만들 후 pipelineDescriptor에 vertexDescriptor를 넣은 후 실행시키면 아래와 같은 그림이 나오게됩니다.

 

 

float3을 쓰게되면 Float type의 3배인 메모리를 사용하게 되는데, 

SIMD4<Float>를 사용하게 되면 padding 값을 넣어 float4 타입과 같은 16bytes를 쓰게합니다.

 

참조 :

https://www.youtube.com/watch?v=c-5MD03NUMw&list=PL23Revp-82LJG3vcDPm8w7b5HTKjBOY0W&index=6

 

반응형