지오메트리 쉐이더에서 물리를 절차 적으로 생성 된 세계에 통합하려면 어떻게해야합니까?


10

본질적으로 CPU에서 GPU로 코 히어 런트 노이즈를 생성 할 필요가 없습니다. 여기에서이 노이즈를 복셀 포인트의 밀도로 사용하여 3 차원 세계에 대한 지형을 생성하고 싶습니다. 그 후, 나는 그 밀도를 가져 와서 세계 지형을 나타내는 다각형을 정점 화 (정점 생성)하고 싶습니다.

이것은 괜찮습니다. 그러나 나는 또한 세상을 실시간으로 동적으로 변형시키고 싶다. 이 시점에 도달하면 충돌 감지 및 GPU가 아닌 CPU에 포함하려는 모든 게임 계산과 같은 작업을 수행하기 위해 정점을 CPU로 다시 가져 오는 데 문제가 있습니다.

그래서 문제는 : 다른 것들 사이의 충돌을 처리하기 위해 어떻게 정점의 부분 집합을 CPU로 다시 가져올 수 있습니까?

그리고 하나 더 질문 : GPU에서 정점을 가져 와서 지수를 생성하는 쉬운 방법이 있습니까?

이러한 다양한 것들에 어떤 종류의 쉐이더를 사용해야하는지 혼란 스럽습니다. 밀도를 모으기 위해 픽셀 쉐이더를 사용하고 정점에서 지형 생성을 처리하고 어떻게 든 정점 쉐이더를 통합하여 동적 변형을 수행하기 위해 지오메트리 쉐이더를 사용하는 사람들이 있습니다.

C # 4.0, .NET 4.0 및 XNA Game Studio 4.0을 사용하고 있습니다.


1
제목에 지오메트리 셰이더를 사용하고 있다고 말하지만 XNA 4.0에는 DirectX 10이 필요하다는 한 XNA4.0을 사용한다고 말합니다 (더 균일 한 플랫폼을 위해 개발하기가 더 쉬워 짐). SM3.0 기능 만 지원하므로 지오메트리 셰이더가 없습니다. forums.create.msdn.com/forums/p/31369/178924.aspx
Roy T.

이제는 더 이상 XNA를 사용하거나 디자인을 재 작업하지 않을 것입니다. 지적 해 주셔서 감사합니다. 나는 그것을 조사하고 있었고이 한계를 깨닫지 못했습니다 (SM 4 없음). 그래도 XNA를 고려하지 않고 질문이 여전히 남아 있다고 가정합니다. 따라서 DirectX만의 관점에서 원하는 것을 수행 할 수있는 방법이 있습니까? 아니면 XNA에서 꼭짓점 셰이더가 있습니까?

1
XNA는 변형과 생성이 너무 느린 입증 된 테스트 사례가 없다면 사용하기에 여전히 유효합니다. 또 다른 테스트 사례에서 GPU 변형 + 생성 후 데이터를 CPU로 다시 가져 오는 것이 더 빠르다는 것이 입증되었습니다.
Roy T.

과연. XNA를 사용하고 CPU에 모든 것을 유지하면 스레드 당 여러 지형 섹션을 병렬화하는 8 개의 코어와 8 개의 스레드가있는 Core i7에서 약 3 분 만에 약 100 만 개의 정점이 제공됩니다. 이를 실시간으로 시도하고 플레이어가보기 전에 지형을 렌더링하면 초당 약 20 프레임을 달성했습니다. 따라서 테스트 사례는 각 방법에 따라 순서대로 진행됩니다.
마이클 J. 그레이

답변:


3

XNA는 지오메트리 쉐이더를 지원하지 않으므로 DX 10을 사용하는 것처럼 대답합니다. 기본적으로 세 가지 옵션이 있습니다.

지오메트리 셰이더 지오메트리 셰이더는 실제로 정점 버퍼를 수정하고 정점을 추가 할 수 있습니다. 이것을 CPU로 다시 읽을 수 있습니다. 나는 그것을 보지 않았지만 확실히 가능합니다.

CPU 만 사용하십시오. 둘째, CPU에서 CPU를 계산하지 않는 이유는 무엇입니까? GPU에서 셰이더로 GPU에서 실행된다는 사실은 변형 알고리즘이 현지화 가능하다는 것을 나타냅니다. 즉 충돌 검사를 위해 관련 부분 만 쉽게 생성 할 수 있습니다.

예를 들어, 나는 얼마 전에 세일링 게임을 만들었습니다. 바다는 정점과 기하학 쉐이더를 사용하여 파도로 물을 변형시켰다. 파도에서 보트의 움직임을 위해 보트 아래 몇 지점에서만 CPU에서 계산 된 동일한 알고리즘을 사용했습니다. 복셀 맵과 비슷한 것을 할 수 있다고 확신합니다.

픽셀 쉐이더 마지막 옵션으로, 당신은 당신의 질문에 이것을 언급했습니다 : 픽셀 쉐이더에서 밀도를 생성하고 3D 텍스처에 씁니다. CPU와 쉐이더에서 상당히 무해하게 액세스 할 수 있습니다. 픽셀 셰이더는이 작업에 적합하지만이 방법에는 많은 오버 헤드가 있습니다. 볼륨 텍스처 렌더링과 버텍스 및 지오에서의 샘플링. 쉐이더, CPU에서 텍스처를 읽어야합니다.

나는 프로젝트의 세부 사항을 모르지만 항상 이것을 위해 CPU를 사용합니다. 반드시 셰이더의 밀도도 계산하되 렌더링에 그래픽 카드를 사용하십시오.


우리가 가진 주요 문제는 GPU-CPU 장벽이었습니다. GPU에서 지형을 생성하고 렌더링하면 충돌 및 기타 작업을 수행하기 위해 CPU 측면에서 지형이 어떻게 보이는지 어떻게 알 수 있습니까? CPU에 유지하는 것에 대한 귀하의 생각이 유효하다고 가정합니다. 우리는 아마도 알고리즘을 상당히 최적화하고 더 적은 지형을 생성 할 수 있습니다. 다른 사람이 답변을했는지 확인하기 위해 하루나 이틀 안에 답변을 답변으로 표시하겠습니다. 다른 대안을 제시해 주셔서 감사합니다.
마이클 J. 그레이

항해 예제를 사용하면 파도를 통해 튀는 보트의 파형 결과를 GPU에 쉽게 연결할 수 없습니까?
감속

1
동일한 렌더링 시스템을 유지할 수 있습니다. 즉, GPU에서 터 레인을 생성 및 렌더링하지만 CPU에서 필요한 터 레인 부분을 미러링합니다. 동일한 알고리즘과 동일한 매개 변수를 사용하면 화면에서 볼 수있는 것과 동일한 지형을 CPU에서 얻을 수 있습니다.
Hannesh

@Daniel 웨이브 알고리즘을 직접 사용하지는 않지만 각 보트가 배후에 "배치"되는 변위 텍스처로 보트의 웨이크에 따라 워터 메시를 변형시킬 수 있습니다.
Hannesh

아! 좋은 생각입니다 :). 그러나 아마도 여러 선박을 잘 지원하지 못할 것입니다.
감속
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.