그래픽스 파이프 라인을 사용하여 밀도 함수를 기반으로 체적 데이터를 렌더링하려면 어떻게해야합니까?


12

두 그래픽 API (OpenGL 및 DirectX)는 여러 단계를 프로그래밍 할 수있는 잘 정의 된 파이프 라인을 고안합니다. 이러한 프로그램 가능 스테이지는 고정 된 최소량의 데이터를 필요로하며, 데이터에 대해 올바르게 정의 된 범위의 작업을 수행하고 정의 된 최소 출력을 출력하여 데이터가 다음 스테이지로 올바르게 전달 될 수 있도록해야합니다. 이 파이프 라인은 제한된 양의 유형의 기하학적 데이터에서만 작동하도록 설계된 것처럼 보입니다. D3D와 OGL의 경우 모두 정점 데이터와 텍스처 좌표입니다.

그러나 내가 만들려고하는 응용 프로그램이 기하 데이터를 나타내는 데 정점 (또는 voxels)을 사용하지 않고 변환 또는 투영 또는 래스터 화 또는 보간 또는 이와 유사한 것을 수행하지 않는 경우 API의 이러한 제한 또는 파이프 라인은 상황을 어렵게 만듭니다.

각 단계가 데이터에 대해 수행하는 기능과 각 단계에서 출력되는 데이터 유형이 제 이점으로 바뀌도록 그래픽 파이프 라인을 변경할 수있는 방법이 있습니까? 그렇지 않은 경우 '원시'API 함수를 사용하여 자체 파이프 라인을 구성 할 수있는 방법이 있습니까? 그렇지 않다면 왜 불가능한지 언급하십시오.

편집 : 내 응용 프로그램은 밀도 함수를 사용하여 형상을 나타냅니다. 이 함수는 공간의 각 지점에 값을 갖습니다. 카메라의 절두체를 3D 그리드로 나누면 각 블록을 픽셀로 투영 할 수 있습니다. 각 블록에서 밀도 함수를 통합하고 해당 값이 필요한 값 이상인지 확인합니다. 그렇다면 블록에 무언가 존재하고 해당 블록에 해당하는 픽셀이 렌더링 된 것으로 가정합니다. 이제 렌더러에서 정점 버퍼의 정점 데이터 대신 그래픽 하드웨어에 함수 (문자열로 표시)를 전달하고 싶습니다. 이것은 또한 버텍스 쉐이더에 균질 한 클립 공간으로 변환 할 버텍스가없고 프래그먼트 쉐이더가 픽셀 정보를 얻지 않음을 의미합니다. 대신, 이제 대부분의 조회 및 평가가 픽셀 당 발생합니다.


'기능 밀도 기능'은 타우 톨 로지입니까?
Pharap

@Pharap, 오타였습니다. 공간에서 "물질"의 존재를 나타내는 단순히 "desity functon".
라이트 스파크

2
잘 조사 된 문제인 isosurface를 만들려는 것처럼 들립니다. http.developer.nvidia.com/GPUGems3/gpugems3_ch07.html을 보거나 메타 볼 , 포인트 클라우드 시각화, 등면 추출 또는 볼륨 렌더링에서 검색 했습니까? 또한 어떤 종류의 성능이 필요한지, 계산의 복잡성과 결합 할 때 검색하는 기술 선택에 큰 차이가 있습니다. 또한 카메라가 움직일 때 픽셀 당 흐릿하게 빛나고 서브 픽셀이 필요하다는 것을 알게 될 것입니다.
Patrick Hughes

답변:


18

GPU를 사용하여 볼륨 데이터를 렌더링 할 수 있습니다.

화면에서 픽셀 당 함수 집합을 평가하려는 경우 간단한 방법은 전체 화면 삼각형을 렌더링하는 것입니다. 이것은 전체 화면을 덮는 단일 삼각형입니다 (실제로는 화면이 삼각형이 아니기 때문에 화면 이외의 부분은 GPU에 의해 버려지기 때문에 화면보다 더 많이 덮습니다). 그런 다음 픽셀 쉐이더 (그 쉐이딩되는 픽셀의 화면 좌표를 수신함)를 사용하여 볼륨을 통해 광선을 구성하고 필요한 기능을 평가할 수 있습니다.

(다른 답변과 달리, 픽셀 당 작업을 수행하는 것처럼 들리기 때문에 컴퓨팅 셰이더는 권장하지 않으며 전체 화면 삼각형 + 픽셀 셰이더는 일반적으로 컴퓨팅 셰이더보다 효율적입니다. 컴퓨팅 셰이더도 확실히 작동합니다.)

전체 화면 삼각형 방법은 후 처리 작업을위한 실시간 그래픽에서 매우 일반적이므로 약간의 인터넷 검색으로 필요한 모든 정보를 찾을 수 있습니다.

BTW, 전체 화면 픽셀 쉐이더 기술을 사용하여 수학 함수 (특히 거리 필드)를 사용하여 구성된 3D 장면을 렌더링하는 방법을 설명하는 Iñigo Quílez의 두 개의 삼각형이있는 렌더링 세계 를 읽는 것이 좋습니다.


따라서 픽셀 셰이더는 문자열이나 다른 유형의 사용자 정의 객체와 같은 임의의 입력을 받아 함수에 전달할 수 있습니까?
라이트 스파크

GPU의 임의 함수 문자열에서 파서 및 / 또는 언어를 실행하려고 시도하는 것이 의심 스럽습니다 .GPU는 실제로 범용 적이 지 않기 때문에 어색합니다. 메인 코드에서 쉐이더 자체를 동적으로 생성 한 다음 그래픽 시스템이 결과 쉐이더를 컴파일하고 실행하게 할 수 있습니다.
Patrick Hughes

@TheLightSpark 맞아, 문자열을 쉐이더에 전달하지 않을 것입니다 (음영 언어에는 문자열 유형조차 없습니다). 원하는 함수에 대한 쉐이더 코드를 생성하고 컴파일하고 싶을 것입니다. 필요한 경우 런타임에 수행 할 수 있습니다.
Nathan Reed

답을 읽기 시작했을 때 삼각형 모양의 모니터를 상상했습니다.) 픽셀을 버리지 않고 화면을 덮는 두 개의 삼각형 대신 하나의 삼각형 만 사용하는 것이 유리합니까?
danijar

@danijar 예, 전체 화면 쿼드를 사용하면 대각선을 따라 일부 픽셀이 두 번 음영 처리되므로 쿼드를 사용하는 것보다 약간의 이점이 있습니다. 반면에, 래스터 라이저는 시작할 픽셀을 생성하지 않기 때문에 오프 스크린 픽셀을 버리는 것은 자유 롭습니다.
Nathan Reed

6

레이트 레이싱 및 기타 기술은 일반적으로 D3D11 릴리스 이후 Direct3D가 지원하고 4.3 이후 OpenGL이 지원되는 OpenGL과 일부 변형을 통해 Direct3D가 지원하는 Compute Shader를 사용하여 수행됩니다.


5

GPU 컴퓨팅 셰이더를 사용하거나 "Shader Storage Buffer"객체를 사용하여 파이프 라인을 필요에 맞게 확장하는 데 매우 유용합니다. 수학자, 과학자 및 표준 그래픽으로 정확하게 번역되지 않은 것들에 대한 GPU 계산을 원하는 다른 사람들은 이런 종류의 것을 사용합니다.

최신 그래픽 파이프 라인은 매우 유연하지만 개발자는 여전히 몇 가지 제한 사항에 걸려 넘어지는 경향이 있습니다. 그러나 컴퓨팅 셰이더 기능을 사용하면 정점과 조각에 대해 생각할 때 파이프 라인 단계를 생각하지 않아도됩니다. 우리는 더 이상 특정 파이프 라인 단계의 입력 및 출력에 의해 제한되지 않습니다. 예를 들어 SSBO (Shader Storage Buffer Object) 기능은 컴퓨팅 셰이더와 함께 도입되었으며 파이프 라인 단계간에 데이터를 교환하고 컴퓨팅 셰이더에 대한 유연한 입력 및 출력을위한 추가 가능성을 제공합니다.

http://community.arm.com/groups/arm-mali-graphics/blog/2014/04/17/get-started-with-compute-shaders

이것이 올바른 방향을 가리 키지 않는다면 정점 / 조각 패러다임에 맞지 않는 개념을 확장 하시겠습니까?


내가하고있는 일을 포함하도록 답변을 편집했습니다. 컴퓨 트 셰이더가 답인 것처럼 보이지만, 내가 할 수있는 다른 것이 있는지 알려주십시오.
라이트 스파크
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.