Quick Syntax
#version 330 core
layout(triangles) in;
layout(triangle_strip, max_vertices = 3) out;
void main() {
for (int i = 0; i < 3; ++i) {
gl_Position = gl_in[i].gl_Position;
EmitVertex();
}
EndPrimitive();
}GL 3.3 Core에서 삼각형을 그대로 넘기는 최소 geometry shader입니다. 입력은 프리미티브 하나, 출력은 직접 방출한 정점들이며 출력할 각 정점의 값을 EmitVertex 전에 씁니다.
단계 연결
정점 셰이더와 프래그먼트 셰이더 사이에 geometry 단계를 링크합니다. 위 코드는 위치만 전달하므로 색·UV 등 추가 출력을 프래그먼트 단계가 요구하면 해당 인터페이스도 선언·전달해야 합니다. geometry 단계를 추가하면 기존 vertex→fragment 연결이 자동으로 우회 전달되지 않습니다.
| 항목 | 가능한 값·한도 | 사용 조건 |
|---|---|---|
| 입력 layout | points·lines·lines_adjacency·triangles·triangles_adjacency | draw topology와 일치 |
| 출력 layout | points·line_strip·triangle_strip | 원하는 프리미티브를 직접 구성 |
| max_vertices | 양의 선언값, 구현 최대 이내 | 정점 수뿐 아니라 총 출력 성분 한도도 확인 |
| EmitVertex | 현재 출력값을 정점으로 방출 | 호출 뒤 다음 정점의 출력값을 다시 정의 |
| EndPrimitive | 현재 strip 종료 | 별도 도형으로 분리할 지점 지정 |
용도와 비용
작은 프리미티브 확장·레이어별 출력·단순한 디버그 도형에 사용할 수 있습니다. 많은 정점을 증폭한다고 항상 CPU 생성·instancing보다 빠른 것은 아닙니다. 정점 출력량과 단계 비용을 함께 고려합니다. 동일 메시 여러 개는 인스턴싱이 더 직접적인 경로일 수 있습니다.
gl_Layer로 레이어가 있는 출력에 라우팅할 수 있지만 FBO가 레이어 출력에 맞게 구성되어야 합니다. 정점마다 서로 다른 layer를 써서 프리미티브 전체의 레이어를 임의로 정하려 하지 않습니다. 출력 해석 규칙과 첨부 범위를 맞춥니다.
실패와 버전
geometry shader는 3.2 코어부터입니다. adjacency는 단순 TRIANGLES의 정점 수를 늘리는 옵션이 아니라 입력 조립 규칙입니다. 최대 출력 정점·성분 한도를 넘으면 링크가 실패할 수 있습니다. Geometry shader instancing의 invocations는 4.0 이후 조건으로 기본 330 예제와 구분합니다.
출력을 한 번도 방출하지 않으면 프래그먼트가 생기지 않습니다. 구형 고정 기능에 같은 단계 객체가 있었다고 설명하지 않습니다. 인터페이스와 보간, 컴파일·링크를 함께 확인합니다.
참고 링크
3 sources