복셀 얼굴 크롤링


9

편집 : 이것은 내 자신의 학습 경험을위한 것이며,이 질문을하는 것은 성능상의 이유가 아닙니다.

이것은 Minecraft와 같은 지형 엔진과 관련이 있습니다. 블록에 청크를 저장합니다 (청크에 16x256x16 블록). 청크를 생성 할 때 여러 절차 기술을 사용하여 지형을 설정하고 객체를 배치합니다. 생성하는 동안 전체 청크 (단단한 지 여부)에 대한 하나의 1D 배열과 단단한 블록의 별도의 1D 배열을 유지합니다.

생성 후, 나는 이웃을 확인하는 단단한 블록을 반복하여 이웃이없는 블록면 만 생성합니다. 나는 자신의 목록에 생성 할 얼굴을 저장합니다 (가능한 얼굴 / 법선 당 하나의 6 개의 목록). 청크를 렌더링 할 때 카메라의 현재 청크에있는 모든 목록을 렌더링하고 다른 모든 청크에있는 카메라를 향한 목록 만 렌더링합니다. 6 개의리스트를 모두 하나의 버퍼에 저장 한 다음, 그리는 범위를 간단히 변경합니다.

Andrew Russell이 제안한 작은 쉐이더 트릭 으로 2D 아틀라스를 사용하여 비슷한 얼굴을 완전히 병합하고 싶습니다. 즉, 동일한 목록에 있거나 (동일한 일반) 서로 인접하고 동일한 조명 수준을 갖는 경우 등입니다. 나는 여전히 사각형으로 끝나지만 정점 수를 50 % 쉽게 줄일 수 있다는 것을 알고 있습니다. 내 추정이 정확하면 더 좋습니다.

내 가정은 6 개의 목록을 각각 축에 따라 정렬 한 다음 다른 두 축으로 정렬하는 것입니다 (블록 상단의 목록은 Y 값, X, Z 순으로 정렬됩니다).

이것만으로도 얼굴을 쉽게 병합 할 수는 있지만 가능한 한 스트립을 병합하는 것 이상을 병합하려고합니다. 욕심 많은 메시 알고리즘을 읽었 지만 이해하는 데 많은 어려움이 있습니다.

내 질문 : 설명 된 것처럼 얼굴 병합을 수행하려면 (동적 지형 / 조명에 대한 나쁜 생각인지 무시) 구현하기가 더 쉬운 알고리즘이 있습니까? 또한 욕심 많은 알고리즘을 훨씬 더 간단한 방법 (링크 또는 설명)으로 안내하는 답변을 행복하게 받아 들일 것입니다.

구현하기가 쉽거나 스트립을하는 것보다 조금 나아도 성능이 약간 저하되지는 않습니다. 나는 대부분의 알고리즘이 쿼드가 아닌 삼각형에 초점을 맞추고 2D 아틀라스를 사용하는 방식을 사용한다고 생각합니다. 현재 기술을 기반으로 삼각형을 구현할 수 있는지 모르겠습니다.

추신 : 나는 덩어리 당 이미 절두체를 뽑았으며 설명 된대로 단단한 블록 사이의 면도 컬합니다. 나는 아직 폐색하지 않고 결코 못할 수도 있습니다.

* 편집 : 나는 아마도 이름이있는 내 자신의 작은 기술을 구현했지만 간단하게 축에 따라 정렬 된 6 개의 목록, 블록 유형 및 조명 수준으로 정렬합니다. 나는 그것들을 반복하면서 새 직사각형을 만들고 동시에 성장합니다 (특정 축을 향한 치우침). 확실히 최적은 아니지만 실제로 매우 빠르며 평균적으로 평균 50 % 가까이 내 정점 수를 줄입니다. Byte56의 의견은 실제 답변으로 생각되는 옷장이지만 답변 / 현상금으로 선택할 수는 없습니다.

최적화없이 많은 초기 지형을 생성 한 후이 문제를 처리하는 빠르고 간단한 방법은 다음과 같습니다. 주어진 모든 정사각형이 동일한 이미지, 조명 수준, 법선 등이라고 가정하면 각 색상은 렌더링 할 다른 쿼드입니다. 내 목록을 원래대로 정렬하면 매우 쉽고 빠르게 접근 할 수 있습니다.


모든 최적화 후에도 여전히 성능 문제가 발생합니까? 코드 프로파일 링을 시도하여 문제가있는 위치를 확인 했습니까?
MichaelHouse

@ Byte56 아, 그것은 현재 전혀 성능 문제가 아닙니다. 내가 실제 게임에 사용하기 위해 배우는 것을 넣으려고 할 때 미래에 하나 일 수 있습니다. 하지만 지금은 단순히 배우고 싶습니다. 나는 단순히 배우기 위해 물건을 배우고 싶을 때 도움이 덜 들기 때문에 그 어떤 것도 언급하지 않았습니다.
신화

나는 실제로 이것으로 적절한 게임을 시도한다면, 보이는 세계가 거대하기를 원할 것이라고 생각합니다. 캐릭터가 Minecraft 및 다른 많은 블록과 같이 높이가 2 블록, 너비가 1 블록이 아닌 3 블록 폭 / 길이 및 6-9 높이가 더 좋습니다. 아마도 정적 지형 일 것입니다.
신화

1
아, 팀. 설명 주셔서 감사합니다. 게임 엔진을 만들 때 이것에 대해 조사했습니다. 내 풍경이 역동적이기 때문에 무언가가 바뀔 때마다 성능 비용이 가치가 있다고 생각하지 않았습니다. 그러나 일부 사용을 찾을 수 있습니다 최대 직사각형의 문제에 대한 기사를. 본질적으로 유사한 얼굴을 병합하기 위해 말하는 알고리즘입니다 (욕심스럽지 않지만 최적). 행운을 빕니다!
MichaelHouse

@ Byte56 감사합니다. 대단히 감사합니다. 그것은 내가 발견하지 않는다면 내가 찾고있는 종류의 알고리즘에 더 가깝게 보입니다. 한 번의 실행으로 최대 사각형을 모두 얻을 수 있는지 확인하려면 조금만 살펴 봐야합니다. 나는 질문과 자세한 답변이 미래에 다른 많은 사람들을 도울 수 있다고 생각하기 때문에 이것에 대한 현상금을 조금씩 내릴 수도 있습니다.
신화

답변:


4

당신은 스트립 또는 최선의 사각형 만하고 싶습니다. 해결할 수 있거나 유용한 다른 모양은 없습니다.

또한 청크 당 6 개의 목록을 유지함으로써 어느 시점에서든 청크에서 5 개의 목록을 기본 방향으로 사용하고 다른 목록에서는 3 개 이상을 사용한다는 점을 지적하고 싶습니다. 비디오 카드 가이 최적화를 수행 할 수있을뿐만 아니라 직접 수행하더라도 모든 얼굴을 한곳에 유지하고 법선과 방향을 법선과 비교하는 것이 좋습니다. 카메라 (벡터의 DOT 곱 연구).

이미 본 Greedy 메시에 대한 CaptainRedMuff의 링크는 문제에 대한 해답입니다. 또한 "Stripy"메시로 끝날 것이지만, 그것들은 완벽하게 효과적이며,보다 최적의 무언가를 제공하는 것이 더 복잡 할 것이며, 욕심 많은 메시가 이미 너무 복잡하다는 것을 표현했습니다.

단일 청크로 성능 문제가 발생하면 다른 것이 크게 잘못되었다고 생각합니다.

내 첫 번째 추측은 그리기 작업을 너무 자주 호출하는 것입니다. 하드웨어에 따라 그래픽 카드에 초당 50 ~ 400 ~ 1 회만 그릴 수 있습니다. .setData 또는 .draw ____ Primitives를 몇 번 호출합니까?


사각형은 내가 원하는 것입니다. Byte56은 욕심보다 따르기가 훨씬 간단한 알고리즘을 연결했지만 의견으로 답변을 수락 할 수 없습니다. 나는 그가 알고리즘을 설명하는 것이 아니라 알고리즘에만 연결했기 때문에 대신 주석을 달았다 고 가정했다. 내 목록과 관련하여 당신이 무슨 뜻인지 모르겠습니다. 나는 일반적으로 청크 당 1-2 개의 그리기 호출을합니다. 내 목록은 청크 당 하나의 버퍼에 저장됩니다. 프레임 당 그릴 범위를 변경합니다. 틀릴 수도 있지만 GPU에 불필요한 데이터를 보내는 것은 비생산적인 것 같습니다. 청크로 당 추가 드로우 또는 두 개는 GPU에 더 많은 데이터를 보내고 강제로 강제하는 것보다 낫습니다.
신화

성능 문제가 없습니다. 나는 단순히 이런 것들을 배우는 것을 즐깁니다. 나는 이것을 말하기 위해 내 질문을 편집 할 것이지만, Byte56에게도 말했듯이 실제로하려고하는 것이 실제로 문제를 해결하지 않으면 도움이 덜됩니다. 귀하의 질문에 대답하기 위해 현재 프레임 당 최대 200-260 개의 청크를 렌더링합니다. 이것은 프레임 당 500ish DrawIndexedPrimitives입니다. vsync없이 정기적으로 100-130 FPS를 받고 초당 65,000 건의 통화를합니다. 나는 무례하려고하지 않지만, 당신이 나에게 의미가 있다고 말한 사람은 거의 없습니다. 이해가되지 않을 수 있으므로 오해가 있으면 자세히 설명해주십시오. 아마도 XNA와 관련이 있습니까?
신화

아, 죄송합니다. 초당이 아니라 프레임 당이라고 말하고 싶습니다. 당신은 거기의 상한에 가까워지고 있고 지형에만 있다면 거의 다 떨어졌습니다.
Phil

내가 할 수있는 몇 가지 개선 사항을 생각하게 만들었으므로 대답을 +1했지만 질문과는 아무런 관련이 없습니다. 또한, 가능한 통화 제한 통화 링크
신화

400-500으로 인용 한 기사를 한도로 찾아야합니다. 빠른 Google은 도움이되지 않았습니다.
Phil

0

링크하는 기사는 실제로 메쉬를 생성하는 알고리즘을 제공하지 않습니다. 가능한 솔루션을 평가하는 방법을 설명합니다.

그러나 일반적으로 기사는 좋은 요약을 제공합니다 .1) 순진한 솔루션이 나쁘다 .2) 최적의 솔루션이 있지만 작성하고 실행하는 데 시간이 많이 걸릴 것입니다 .3) 빠른 컬링은 훨씬 더 나은 결과를 제공합니다 ( 그리고 이것이 Minecraft 자체의 모든 것입니다.) 4) 더 똑똑한 솔루션 (욕심 많은 알고리즘)이있을 수 있습니다.

귀하의 질문에있는 이미지에서 암시하는 "솔루션" 욕심 알고리즘입니다. 귀하의 질문은 "그의 솔루션을 올바르게 구현 했습니까?" "그는 해결책을주지 않았습니다. 당신은 이것을 스스로 해결했습니다."

솔루션이 더 나을 수 있습니까? Meh. 확실한. 아마 가치가 없을 것입니다. 다음 단계에서는 폐색 제거 또는 LOD가 더 나을 것이라고 생각합니다. 마인 크래프트는 지하에있을 때도 표면을 그리는 많은 사이클을 낭비하고 표면에있을 때 동굴과 광산 시스템의 광대 한 네트워크를 그리는 것입니다. 메쉬가 잘 정리되면, 가려진 표면을 제거하는 것이 좋을 수 있습니다. 그러나 일반적으로 비디오 카드가 CPU에서 수행하는 것보다 후면 컬링을 수행하는 것이 더 빠릅니다.

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