2010-12-03 3 views
4

OpenGL에서 32x32 비트 맵의 ​​큐브 모델을 만들고 싶습니다. 예를 들어 Super Mario의 Bob-omb 2D 비트 맵이 주어지면 결과는 다음과 같아야합니다. http://fc02.deviantart.net/fs49/f/2009/186/f/a/Bob_omb_in_Minecraft_by_Luafox.png 아이디어는 비트 맵의 ​​각 2D 픽셀을 3D 큐브로 표현하는 것입니다.2D 비트 맵을 3D 큐브 모델로 변환하는 효율적인 방법은 무엇입니까?

각 모델은 게임에서 적을 대표하므로 신속하게 렌더링 할 수 있어야합니다. 이것을하는 좋은 방법은 무엇입니까?

내가 만든 한 가지 시도는 먼저 32x32x2 정점 그리드를 만든 다음 해당 정점에서 큐브면을 형성하는 적절한 위치에 삼각형을 작성하여 비트 맵에서 정적 3D 모델을 생성하는 것입니다. 한 가지 큰 문제는 얼굴에 색상과 법선을 저장하는 방법입니다. 각면의 삼각형은 꼭지점을 공유해야하며 공유 꼭지점은 해당면의 색상과 법선을 저장해야합니다. 그러나 각 얼굴이 적절한 색과 표준을 갖기에 충분한 정점이 있다고 나는 생각하지 않습니다. 나는 이것을 해결하는 우아한 방법을 생각할 수 없다.

+0

왜이 작업을 수행해야합니까? – DMan

+0

게임용입니다. 나는 이처럼 보이는 적을 원한다. – RichardNewton

+0

올바른 질문을 하시겠습니까? 결국 당신은 이미 당신이 어떻게했는지 말한 다음, 다른 질문을했습니다. – Arne

답변

0

얼굴의 색과 법선을 저장하는 것에 관해서; 다른면의 같은 위치에 정점을 복제해야한다는 점을 받아 들여야합니다. 두 개의 정점이 일부 속성을 공유하지만 다른 속성이 다른 경우, 공유하는 속성 중 하나가 위치 일지라도 본질적으로 다릅니다.

그래서 필요에 따라 중복 된 꼭지점이있는 일부 VBO를 빌드해야합니다. 이것을 디자인 타임 단계로 실행하고 결과를 편리한 형식으로 저장하여 런타임에 일부 작업을 저장하고자 할 수 있습니다.

편집 : 그렇다고 모든 큐브의 모든면의 모든 구석에 대해 별도의 꼭지점이 있어야한다는 의미는 아닙니다. 사실, 합리적으로 쉬운 구현으로 원하는 것을 렌더링하는 가장 저렴한 방법은 아마도 앞면과 뒷면을 각각 색으로 텍스처를 사용하여 두 개의 삼각형으로 렌더링하고, GL_MAG_FILTER, GL_NEAREST 샘플링하고 텍스처 좌표를주의 깊게 정렬하는 것입니다. 픽셀 쉐이더를 사용하여 투명한 텍셀을 클립.

그런 다음 측면에서 볼 수있는면을 처리하기 위해 런타임에 반드시 필요한 작업을 더 수행해야하며 각면을 지오메트리로 만듭니다 (모든 지오메트리는 단일 정적 VBO입니다. 따라서 예를 들어 -deprecated를 호출하는 것과 비교하여 draw 호출의 수와 기하학 비용을 줄이면서 각 큐브에 대해 유용한리스트를 표시 할 수 있습니다. 다시 한번주의 깊게 살펴보면 앞면과 뒷면의 보이지 않는 부분과 정확히 조화를 이룰 수 있습니다.

원수를 날려 버리고 구성 큐브가 각각 다른 방식으로 이동하기를 원할 경우 모든 단일 큐브를 표시하는 더 비싼 버전으로 전환 할 수 있습니다.

+0

팁 주셔서 감사합니다. 나는 이것을 어려운 방법으로 배웠다. 그런데, 나는 OpenGL ES를 사용하여 iPhone 용으로이 글을 쓰고있다. 얼마나 많은 정점이 너무 많은 지에 대한 지침이 있습니까? 이것은 매우 일반적인 질문입니다. 그러나 게임의 적을 예를 들어 32x32 픽셀 비트 맵을 기반으로하고 각 픽셀을 큐브로 표현할 때 8 개의 꼭지점을 사용하려면 8192 개의 꼭지점과 몇 천 개의 삼각형을 사용해야합니다. 그게 내게 많이 들리네. 나는 이것이 매우 비효율적으로 들리는 지 궁금해하고 있습니다. – RichardNewton

+0

저는 아이폰 하드웨어에 대해 잘 모릅니다. 그러나 그것은 저에게 많은 verts처럼 들리지 않습니다. – PeterT

+0

또한 큐브를 분리하고 싶지 않고 링크 된 이미지와 비슷하게 렌더링하는 경우 꼭 필요한 정점보다 훨씬 적은 수의 정점이 필요합니다. 숨겨진 내부면을 피할 수 있고 같은면에 나타나는 정점을 공유 할 수 있습니다 (특히 정점 속성으로 지정해야하는 고유 한 정보가 적도록 색상에 텍스처를 사용하는 경우). – PeterT

2

'투명한'부분에 대해 알파와 GL_ALPHA_TEST를 사용하여 앞면을 단일 텍스처 매핑 GL_QUAD로 렌더링하면 속도가 가장 빠릅니다. 경계선, 즉 정면이 아닌 정사각형을 하나 이상의 GL_QUAD_STRIP으로 만듭니다.

스프라이트를 일련의 실제 큐브로 그리기로 결정한 경우 (예 : 스프라이트를 별도의 큐브로 날려 버리려는 경우 또는 작은 큐브면에 매우 상세한 텍스처가있는 경우) 하나의 큐브에 대한 목록을 만들고 그 표시 목록을 반복적으로 호출하십시오.

+0

쿼드는 더 이상 사용되지 않으므로 더 이상 사용하지 마십시오. 하드웨어는 tris 만 렌더링합니다. –

+0

팁 주셔서 감사합니다. 최근에이 접근법을 실제로 시도했지만 문제는 텍스쳐의 구멍이 쿼드에 매핑되고 경계 쿼드 스트립이 만나는 지점 (예 : 작은 틈)을 볼 수 있다는 것입니다. 나는 이것에 대한 해결책을 찾을 수 없었다. 작은 트라이앵글을 많이 사용하여 앞면과 뒷면을 렌더링하는 방식으로 작업하지만이 방법은 훨씬 더 많은 렌더링 성능을 사용합니다. – RichardNewton

+0

@ 리차드 솔기가 크면 수학을 다시 확인하십시오. 크기가 작은 경우 (1 픽셀 이하) 테두리 커브의 앞면을 그리고 부분적으로 투명한 앞면 쿼드에 사용되는 비트 맵의 ​​테두리를 따라 일부 픽셀을 제거하여이를 해결할 수 있습니다. 전면 쿼드를 입방체 앞에 아주 약간 넣으십시오. 내부 큐브 인 큐브의 전면 대부분을 그릴 수 있습니다. –

0

"voxel"을 검색하는 방법에 대한 흥미로운 내용을 확인할 수 있습니다. http://en.wikipedia.org/wiki/Voxel

어쩌면 당신은 좋은 게임 편집기로 맵 큐브 세분을 기반으로하는 오픈 소스 게임 엔진 큐브/자우어 브라 텐의 소스 코드를 살펴 및 올 싶습니다 : http://sauerbraten.org/

관련 문제