입력 지오메트리없이 지오메트리 셰이더에서 프리미티브를 생성하는 방법이 있습니까?


17

몇 년 전에 저는 Marching Cubes를 사용하여 3D 절차 지형을 생성하기 위해 OpenGL 에서이 GPU Gem 을 구현하려고했습니다 . 이 기사에서는 지오메트리 쉐이더에 Marching Cube를 구현하여 효율성을 극대화 할 것을 제안합니다. 즉, 도메인의 모든 복셀에 대해 셰이더를 한 번만 실행하면 해당 셀에 전체 지오메트리가 생성됩니다.

내가 우연히 만난 한 가지 문제는 실제로 셰이더 외부에서 렌더링 할 것이 없어도 형상 셰이더를 실행하는 방법이었습니다. 내 솔루션 (거의 해킹 된 것처럼 보임)은 각 셀에서 점을 렌더링하고 기하학 쉐이더로 버리고 삼각형을 대신 방출하는 것이 었습니다. 적절한 솔루션을 찾지 못 했으며이 해결 방법은 최종 코드에 남아 있습니다.

그러면 입력 지오메트리없이 지오메트리 셰이더에서 렌더링 패스를 시작하도록 OpenGL에 지시해야합니까? 아니면 일을 실행하려면 항상 더미 포인트를 GPU에 보내야합니까?

답변:


15

아니요, 실제로 그렇게 할 수있는 방법이 없습니다.

지오메트리 셰이더 호출에는 입력 프리미티브가 필요하며 0 개 이상의 출력 프리미티브를 생성합니다. 입력 프리미티브가 없으면 실제로 형상 셰이더 를 실제로 호출 하는 방법이 없습니다 . 물론 각 입력 프리미티브에 대해 지오메트리 쉐이더의 최대 출력 프리미티브 수의 한계를 늘릴 수 있습니다 (현재 실제 한계를 모릅니다, 아마도 수천 정도 여야합니다). 당신 그래서 아마 각 지점에 대한 1024 개 삼각형을 생성 할 수 있지만, 당신은 항상 있어야 어떤 입력 프리미티브.

당신이 필요하지 않습니다 그러나 것은 기하학의 실제 개념이다. 합리적인 위치에서 3D 포인트를 렌더링 할 필요는 없으며 추상 인덱스 또는 텍스처 좌표 또는 속성과 같은 의미를 가질 수 있으며 의미있는 3D 위치는 아닙니다. 정점에 어떤 속성이 있는지 지정하는 사람은 없습니다. 속성 없이 정점 렌더링 할 수도 있습니다 . 그러나 기본 요소에 실제 속성이없는 경우에도 일부 기본 요소 를 렌더링 하여 기하 도형 셰이더를 호출해야합니다.

그러나 실제로 각 그리드 셀에 대한 점을 렌더링하고 해당 셀에 대한 행진 큐브 삼각형을 생성하는 것은 실제로 간단한 접근 방식입니다. 물론이 셀에 포함 된 속성은 사용자에게 달려 있습니다. 3D 위치, 3D 텍스처의 텍 코드 등 무엇이든 렌더링 할 수있는 그리드 셀입니다. 순전히 의미 적으로 말하면, 실제로는 그 점들을 "파기"한 다음 삼각형으로 "대체"하지 않고, 각 점을 삼각형 세트로 "변환"합니다. 이것이 바로 쉐이더 쉐이더의 목적이며 "해킹"또는 "부적절한"것은 없습니다. 아무도 기하학 셰이더가 "적절한"입력과 동일한 출력 기본 유형을 생성해야한다고 말합니다 .


복셀 그리드를 렌더링하는 입력이 거의없는 방법을 달성하기 위해 할 수있는 일은 속성이없는 점을 그리는 것입니다. 즉, 속성 배열이 전혀 필요하지 않으며 모든 속성 배열을 비활성화하고 glDrawArrays필요한 셀 수로 단순 을 호출하십시오 . 그런 다음 정점 셰이더 또는 지오메트리 셰이더에서 입력 정점 ID (예 : gl_VertexID유일하게 보유한 정보) 에서 약간의 인덱스 마법으로 필요한 3D 그리드 셀 인덱스를 생성 한 다음 조회에서 마칭 큐브 지오메트리를 계산할 수 있습니다. 3D 볼륨 텍스처 (또는 모든 데이터 구조)

그래서 돌이켜 보면 처음부터 진술을 다시 언급해야 합니다. 입력 프리미티브 없이 프리미티브 를 생성 할 수 없지만 입력 지오메트리 없이 프리미티브 를 생성 할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.