2015-01-22 2 views
-1

나는 많은 raytracers가 CUDA 또는 OpenCL을 사용한다고 읽었습니다. 그러나, 왜 현대 (버전 4.0 이상) OpenGL을 사용하지 않는지 모르겠다. CUDA와 OpenCL이 더 많은 기능을 가지고 있다는 것을 알고 있습니다. 나는 그들이 하드웨어에 더 가깝다고 생각하지만, ... 이것은이 목적에 정말로 유용한가요? 그렇다면 왜?raytracer 용 OpenGL 또는 CUDA/OpenCL?

답변

1

OpenGL 디자인은 점, 선 또는 삼각형을 프레임 버퍼에 래스터 화하는 것에 관한 것입니다. 셰이더는이 프로세스를 제어하는 ​​데 사용되지만 궁극적으로는 래스터 화에만 사용됩니다. 래스터화할 때 각 삼각형을 하나씩 가져 와서 프레임 버퍼에서 어느 위치에 있는지 결정한 다음 해당 픽셀을 조작합니다.

광선 추적 또는 경로 추적은 완전히 다른 것입니다. 터치 할 픽셀을 결정하는 삼각형으로 시작하는 대신 픽셀로 시작하고 각 픽셀에 대해 해당 도형이 픽셀과 관련이있는 장면으로 추적합니다. 나는. 그것은 OpenGL이하는 보완적인 것입니다. 그러므로 이것을 OpenGL에 맞추려는 시도는 잘못된 트리를 짖는 것과 같습니다. 완전히 다른 데이터 구조로 작업해야하며 프로그램은 셰이더와 다르게 구조화됩니다. OpenCL 및 CUDA는 레이 또는 경로 추적 알고리즘을 프로그래밍하는 데 훨씬 적합합니다.

1

OpenCV 및 OpenCV 또는 CUDA와 같은 일반적인 병렬 컴퓨팅 메커니즘을 사용하여 Raytracing을 포함한 모든 종류의 레이 - 캐스팅을 구현할 수 있습니다. 사실, Shadertoy으로 가면 대다수의 쉐이더가 단일 조각 쉐이더 만 사용하여 재미있는 3D 장면과 효과를 생성합니다. 대부분 광선 추적보다는 광선 행진을 사용합니다.

모든 종류의 레이 캐스팅에서는 일반적으로 렌더링하는 모든 단일 픽셀에 대해 많은 계산을 수행합니다. 어떤 픽셀도 다른 픽셀의 출력에 의존하지 않으며 각 픽셀의 알고리즘이 동일하기 때문에 이러한 종류의 문제는 병렬 처리에 이상적입니다. 이는 OpenCV가 설계 한 핵심입니다. 병렬 컴퓨팅을 위해 OpenGL을 사용할 수도 있습니다. 여기서 OpenGL의 가장 큰 장점은 실시간으로 무언가를 렌더링하려고 할 때 계산 결과를 비디오 카드에 남겨서 출력 장치에 표시되게하려는 것입니다.

반면에 비 실시간 렌더링을 수행하는 경우 OpenCV는 작업을 수행하는 데 더 많은 기능과 오버 헤드가 필요합니다.

두 경우 모두 가장 큰 문제는 렌더러의 구현이 아닌 렌더링 코드에서 장면 설명을 직접 표현하거나 일부 장면 설명자 파일에서 장면 설명을로드하여 일부에서 인코딩하는 것입니다 렌더링 코드는 OpenCV 또는 OpenGL 프레임 워크 내에서 해석 할 수 있습니다. 예를 들어 XML 또는 JSON 장면 설명 파일을로드하고 OpenCV Kernel/OpenGL 조각 쉐이더로 전달할 수는 없습니다. 궁극적으로 어떤 종류의 구조와 프리미티브가 표현 되든간에 언어로 표현할 수 있습니다.