Technical/Shader

Vertex Shader

ParkJinseok 2021. 3. 1. 16:00

Vertex Shader

  • 보통 C++ 파일이 아닌 .vert라는 확장자를 가진 별도의 파일에 저장함.

  • Shader도 다른 에셋들과 마찬가지로 Runtime으로 불러오기 때문에 메쉬나 이미지 같은 에셋이 있는 디렉토리에 저장함.

  • OpenFrameworks에서 에셋 디렉토리는 bin/data 폴더를 사용함.

  • Vertex Shader는 한번에 하나의 Vertex만을 처리하며, 직접 데이터를 주지 않는 이상 다른 Vertex에 대한 정보를 가지고 있지 않다.

  • in 키워드는 앞 단계에서 전달 받을 데이터가 무엇인지 구체적으로 명시 할 때 사용.

  • Out 키워드는 다음 단계로 전달할 변수를 선언 할 때 사용.

  • Vertex Shader 앞 단계에서는 GPU가 메쉬 데이터를 Vetex Shader를 비롯한 이후 파이프라인에서 읽을 수 있는 포맷으로 변환함.

  • OpenFramework 기본 Shader는 Vertex 좌표를 스크린 픽셀 좌표에 맞추기 위한 별도의 처리가 들어있다.
    • 하지만, Vertex Shader는 이런 처리를 하지 않기 때문에 NDC(Normalized Device Coordinates, 정규화 장치 좌표계)를 기준으로 위치 데이터를 출력한다.

    • 앞에서 언급한 스크린 픽셀 좌표계는 (1024, 768)과 같이 화면의 크기에 영향을 받음.

    • 하지만, NDC는 다양한 화면을 하나의 공통 좌표계에 Mapping 함으로써 문제를 해결함.

    • OpenGL이 NDC를 다루는 방식은 아래와 같다.

OpenGL이 NDC를 다루는 방식

 

Vertex 속성

  • Fragment Shader는 어떤 Fragment가 각 Vertex로부터 얼마나 멀리 있는가에 따라서 세 색상을 섞을 수 있음.

  • Mesh의 모든 Vertex에 동일한 종류의 정보를 담는 다는 전제하에 Vertex에는 숫자로 된 어떤 데이터도 담을 수 있다.
    • 대표적인 예가 Vertex에 색상을 지정하는 것.

    • 이처럼 Verex에 어떤 데이터를 저장하는 것을 Vertex 속성을 추가한다고 함.

  • Vertex에 속성을 추가하는 함수를 넣을 때 Vertex를 정의한 순서대로 작성해야 함.

  • GPU 입장에서는 무엇이 위치고, 무엇이 색상인지 알지 못한다. Shader에서 어떤 데이터를 위치로 사용할지 색상으로 사용할지는 우리의 선택이다.

  • Vertex 속성의 순서는 OpenFramework가 정하기 때문에 OpenGL에게 어떻게 알려줄지 고민할 필요가 없음.

  • Layout은 Shader에게 Vertex 데이터가 저장된 순서를 알려주는 역할을 함.

  • Vertex Shader에서 Out으로 보낸 변수의 이름과 Fragment Shader에서 In으로 받는 변수의 이름이 반드시 같아야 함. (다를 경우 GPU가 둘을 연결하지 못함)

'Technical > Shader' 카테고리의 다른 글

Texture  (0) 2021.03.01
Fragment Shader  (0) 2021.03.01
OpenGL  (0) 2021.03.01
Shader  (0) 2021.03.01
Rendering Pipeline  (0) 2021.03.01