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를 다루는 방식은 아래와 같다.
- 하지만, Vertex Shader는 이런 처리를 하지 않기 때문에 NDC(Normalized Device Coordinates, 정규화 장치 좌표계)를 기준으로 위치 데이터를 출력한다.
Vertex 속성
- Fragment Shader는 어떤 Fragment가 각 Vertex로부터 얼마나 멀리 있는가에 따라서 세 색상을 섞을 수 있음.
- Mesh의 모든 Vertex에 동일한 종류의 정보를 담는 다는 전제하에 Vertex에는 숫자로 된 어떤 데이터도 담을 수 있다.
- 대표적인 예가 Vertex에 색상을 지정하는 것.
- 이처럼 Verex에 어떤 데이터를 저장하는 것을 Vertex 속성을 추가한다고 함.
- 대표적인 예가 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 |