2011-01-15 5 views
0

DynamicVertexBuffer에 대해 읽었으며 자주 변경되는 데이터에 대해 더 나은 방법을 제시했습니다. 나는 큐브에 의해 구축 된 세계를 가지고 있으며 큐브의 꼭지점을이 버퍼에 저장하여 화면에 그려야합니다.XNA 4.0의 DynamicVertexBuffer 사용

그러나 모든 큐브에 정점이있는 것은 아닙니다 (일부는 공기이며 투명합니다). 그리고 큐브의 모든면이 서로 마주보아야하는 것은 아닙니다 (서로 마주 보게됩니다). 그래서 정점이 무엇인지 어디 버퍼에 저장? 또한 특정면을 마지막으로 그려야합니다. 예를 들어 유리나 잎처럼 투명도가있는면이 있어야하며이 면도 알파 블렌딩을 엉망으로 만들지 않기 위해 뒤에서 앞으로 보이는 순서로 그려야합니다.

이러한 모든 정점이이 버퍼에 임의로 저장되는 경우, 정점이 어디에 있는지 어떻게 알 수 있습니까?

또한 vertex 수는 바뀔 수 있지만 DynamicVertexBuffer는 크기를 전혀 변경할 수 없기 때문에 나에게는 매우 동적 인 것처럼 보이지 않습니다. 얼굴을 추가하거나 제거해야 할 때마다 버퍼를 다시 만들어야합니까?

답변

3

당신이 틀린 방식으로이 소리에 접근하는 것처럼 들리 겠지만 - 당신의 세상에는 사소한 숫자 이상의 큐브가 있다고 가정하십시오. 주어진 방향에서 바라 볼 때 주어진 지점에서 세계의 규칙에 따라 볼 수있는 큐브 (및면)를 빠르게 결정할 수있는 사용자 지정 데이터 구조에 세계 (및 큐브)를 저장해야합니다.

그런 다음 장면을 렌더링 할 때마다이면들의 버텍스 버퍼 배치를 생성합니다. 따라서 세계의 전체 지오메트리를 저장하기위한 기준으로 버텍스 버퍼를 사용하지 마십시오. 버텍스 버퍼는 월드 씬 그래프 도구가 아닌 렌더링 도구입니다.

이러한 종류의 대규모 가시성 문제는 GPU보다 훨씬 빠르게 코드에서 실행됩니다. 예를 들어, 원점에 앉아서 + x를 보면, -ve x 방향의 모든 큐브를 즉시 무시할 수 있습니다. 이것은 아주 간단한 예입니다.

oct-tree 렌더링에 대한보다 완벽한 예제 검색. 이런 종류의 렌더링은 여러분의 월드 레이아웃과 매우 잘 어울립니다.

마지막 팁 - 내가 버텍스 버퍼의 일괄 처리를 생성 할 때 - GPU의 상태 변화 (예 : 동일한 텍스처, 동일한 셰이더 등)를 최소화하는 방식으로 큐브를 배치하는 것을 의미합니다. GPU의 상태에 대한 변경을 최소화하는 것은 렌더링을 최적화하는 데 중요합니다. 처음부터 렌더링에서 얼굴을 도려내는 것만 큼 멀리하면됩니다.

+0

"모든면을 -ve x 방향으로 무시하십시오"라고 생각합니다. 어쨌든,이 정보를 주셔서 감사합니다. 텍스처는 모두 같은 텍스처 맵에서 가져온 것이므로 문제가되지 않습니다. 그러나 내가 세상에 큐브를 추가한다고 말하면,이 큐브는 렌더링이 필요한 곳에 배치됩니다. 정점을 추가하려면? 다른 모든 정점이 저장된 장소의 크기를 수정하지 않고 GPU에이 새 큐브에 대해 어떻게 알릴 수 있습니까? 나는 옥트리 렌더링을 찾을 것이며, 언급 된 quadtrees와 octree를 보았다. – Bevin

+0

큐브가 얼굴보다 높은 수준의 데이터 구조라고 가정 할 때 -ve x 방향의 모든 큐브를 무시한다는 의미였습니다. 큐브를 무시할 수 있으면 6 개의 얼굴을 모두 자동으로 무시할 수 있습니다. 따라서 큐브를 먼저 놓는 것이 더 빠르며 잠재적으로 보이는 큐브를 설정하면 얼굴을 삭제하려고 시도합니다. –

+1

당신은 여전히 ​​버텍스 버퍼를 여러 프레임에 걸쳐 영속적 인 것으로 생각하고 있습니다. 대부분의 엔진에서는 그렇지 않습니다. 매 프레임마다 처음부터 정점 버퍼를 채 웁니다. 물론 공간을 할당 할 수는 있지만 데이터를 다시 작성해야합니다. 잠재적으로 눈에 보이는 얼굴 집합이 모든 프레임마다 바뀝니다. 생각해 보면 수백만 개의 큐브가있는 세계를 가질 수 있지만 가능한 한 적은 수의 얼굴로 렌더링하려는 각 프레임 - 아마도 수백 개 -이 트릭은 가능한 한 작은 크기의 버텍스 버퍼를 얻는 것입니다. 틀. –