반응형
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
반응형
'iOS > 라이브러리' 카테고리의 다른 글
[iOS, Metal] Metal에서 Image를 MTKView에 올리는 방법 (0) | 2023.03.21 |
---|---|
[Library, Metal] vertex를 index로 메모리 절약하기 (0) | 2023.02.03 |
[Library, Metal] 삼각형 그리기 (pipeline) (0) | 2023.02.03 |
[Library, Metal] MetalView 그리기 (0) | 2023.02.03 |