목록ios (27)
momodudu.zip
Non-Interlaved vertex를 그리는 쉐이더를 작성중에.. 이런 문제를 발견했다. #include using namespace metal; struct VertexIn { float3 position; float4 color; }; struct VertexOut { float4 position [[position]]; float4 color; }; vertex VertexOut vertex_main(const device VertexIn* vertex_in [[ buffer(0) ]], unsigned int vid [[vertex_id]]) { VertexIn in = vertex_in[vid]; VertexOut out; out.position = float4(in.position.posi..
Apple의 MSL Spec문서를 보는데, 일단 양이 굉장히 방대해서.. 간단한 부분들만 정리해보려고한다. 봐도봐도 헷갈리는 MSL. 간단한 예제들로 머가 어떻게 구성되는지 알아보자. 1. Metal Coordinate System Metal의 NDC Space는 왼손 좌표계로, 아래와 같은 공간으로 구성된다. z는 [0, 1]의 범위로 구성되어 있다. 즉, 중앙값이 0.5이다. 그리고 NDC에서 나온 ouput은 rasterization을 거쳐서 뷰포트로 전환이 되는데, 원점은 좌상단인 viewport coordinate system이 완성된다. 2. Address Space Metal의 memory는 MSL program내의 memory object들의 구조와 동작을 묘사할 수 있도록 모델링되었다. ..
이제 약간 본격적인 챕터다. 점점 프로젝트에 살이 붙을 예정이니.. 지금까지 작성했던 코드들을 분리해보자. 튜토리얼에 맞춰서 ViewController쪽과 Renderer라는 클래스를 따로 분리할것이다. 그 전에, 앞에서 훑어봤던 Metal 초기화 과정을 다시 한번 짚어보자.. 1. MTLDevice 2. MTLCommandQueue : CommandBuffer를 생성한다. 3. MTLLibrary : 쉐이더 프로그램을 담고있음 4. MTLRenderPipelineState : 어떤 쉐이더 프로그램을 사용할지, 뎁스나 컬러 세팅 등 파이프라인에서 어떤 동작을 하는지 config지정. 5. MTLBuffer : CPU -> GPU로 보낼 데이터를 담고있는 컨테이너 1~2는 한번만 만들고, 4번의 경우 Pi..
cpu에서 만든 데이터를 gpu로 로드하기 위해서, 메탈에서는 MTLBuffer를 쓴다. 처음에 나온 예제에서는 vertex(x,y,z) 이렇게 position float3 포맷으로 MTLBuffer를 만들었다. 그치만 좀 더 복잡한 렌더링으로 들어가면 이 정점 하나에 position외에도 노말이나 텍스쳐 좌표까지 하나의 정점에 매칭된다. 예를들면 하나의 v1 = [px, py, pz, nx, ny, u, v] 이렇게 여러개의 attribute들이 매칭된다. 그래서 gpu에서 이 버퍼를 해석할 수 있도록 도움을 줘야 하는데, 그게 바로 vertex description이다. // vertex descriptor 설정 let vertexDescriptor = MTLVertexDescriptor() vert..