2011-09-06 4 views
3

텍스처가 다른 쿼드의 VBO를 렌더링 할 수 있습니까? 자, 텍스처 또는 텍스처 아트 선으로 정렬에 대해 읽었지만 여전히 내 질문에 대답하지 않습니다. 나는 2 차원 게임에서 일하고있다. 이제 내 애니메이션 스프라이트는 프레임과 일반 맵에 대한 텍스처 맵을 가질 것이며, 가능한 모든 경우 동일한 VBO를 공유 할 것입니다. 따라서 각 스프라이트에는 아틀라스가 생깁니다 (일부 애니메이션의 경우 4096 * 4096 텍스처를 채울 수있는 많은 프레임과 포즈가있을 수 있습니다). 그래서 가능합니까? 예 혹은 아니오. 그렇지 않다면 각 스프라이트에 대해 모든 텍스처 프레임에 대해 모든 텍스처 좌표를 가진 인덱싱 된 VBO를 갖고 각 프레임 (단일 애니메이션 프레임에 대해) 만 4 개의 인덱스 만 보내고 각 VBO에 대한 텍스처를 변경하는 것이 효율적입니까? 편집 : 일부는 움직일 수 있으며 (분명히) 일부는 그렇지 않을 수도 있습니다.다중 텍스처가있는 VBO


생각한 후에도 약간의 메모리 사용량도 문제가 있다는 것을 알고있었습니다. 그 질감 선글래스는 많은 기억을 먹을 것입니다. 4096 * 4096 RGBA 텍스처는 64MB를 필요로합니다 (사용량이 두 배가되는 일반지도가없는 경우). 그리고 나는 많은 애니메이션을 하나의 아틀라스로 밀어 넣을 수 있다고 생각하지 않습니다. 디아블로 나 Infinity Engine과 같은 구형 게임은 몇 메가의 VRAM 만 있으면 좋았습니다.

답변

1

물론 가능합니다 (텍스처 좌표가 동일하다고 가정). 사용하고자하는 텍스처를 첨부하려면 glBindTexture()을 사용하고 수정하고자하는 텍스처 유닛을 선택하려면 glActiveTexture()을 사용하면됩니다. 당신은 단지 하나 개의 텍스처로 작업하는 경우 분명히 glActiveTexture()

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE2D, texture_texid); 
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE2D, normalmap_texid); 
DrawStuff(); 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE2D, texture2_texid); 
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE2D, normalmap2_texid); 
DrawStuff(); 

는 건너 뛸 수 있습니다.

+0

답변 해 주셔서 감사합니다. 내가 한 말은 단 한 번의 무승부로 그렸습니다. 귀하의 제안은 내가 게시물의 끝에 말한 것과 비슷합니다. – M3rlyn

+0

또한 텍스처 단위도 제한되어 있습니다. 그들은 충분하지 않을 것이다. – M3rlyn

6

VBO에는 텍스처 좌표가 포함될 수 있지만 적용 할 텍스처는 알지 못합니다.

텍스처와 독립적 인 VBO는 그대로두고 애니메이션/프레임 인덱스에 따라 프래그먼트/픽셀 쉐이더에서 텍스처 좌표를 계산하십시오. VBO에 쿼드가 있다고 가정하면 텍스처 좌표를 설정하여 텍스처 전체를 매핑합니다. 그런 다음 셰이더에서 텍스처 좌표를 스케일 및 변환하여 텍스처 맵에 단일 프레임을 매핑합니다. 그런 다음 애니메이션 색인, 아틀라스의 프레임 수 등을 셰이더에 균일 한 값으로 지정할 수 있습니다.

편집 (더 명확하게)

텍스처는이 단일 쿼드 전체 텍스처 매핑에 대응하는 쿼드

(0,1)   (1,1) 
    x-------------x 
    |    | 
    |    | 
    |    | 
    |    | 
    |    | 
    x-------------x 
(0,0)   (1,0) 

좌표.

텍스처가 아트라스의 행 - 열 순서로 스택 된 16x16 "프레임"으로 편리하게 분할되어 있다고 가정 해 보겠습니다. 따라서 단일 프레임의 크기는 u 및 v 각각의 텍스처 좌표에서 1/16입니다. 이것은 움직이는 창입니다. 이제 쉐이더에서 애니메이션의 "프레임"번호를 전달하고 쿼드의 각 정점에 대한 텍스처 좌표는 텍스처 좌표를 16으로 스케일 한 다음 프레임 (0- 기준 정수)으로 변환합니다.

float scale = 0.0625 // 1/16. 
texCoord *= scale; 
texCoord += float2(scale*frame%16, scale*(frame/16)) 

이제 머리 부분에서이 부분을 작성하여 사소한 오류가있을 수 있습니다. 또한이 코드는 texCoord가 쿼드의 조각의 텍스처 좌표라고 가정합니다. 1/16 계산은 16 픽셀 씩을 반복 할 때보 다 훨씬 저렴합니다. 픽셀 당 더할 수 있습니다. float2 (scale * frame % 16, scale * (frame/16)) 라인은 당신이 나를 따라 오지 않으면 혼란 스러울 수 있습니다.간단한 경우 :

(with a total of 64 frames in an 8x8 grid) 
     frame 0 1 2 3 4 5 6 7 8 9 10 11 12 
x = frame%8 0 1 2 3 4 5 6 7 0 1 2 3 4 
y = frame/8 0 0 0 0 0 0 0 0 1 1 1 1 1  
(note integer division) 
+0

글쎄, 나에게 계몽 수 있다면, 어떻게 할 수 있니? 4 개의 정점마다 다른 균일 한 값을 주어야합니다 ... 그것은 나에게 매우 효율적으로 들리지 않습니다. 내가 잘못? – M3rlyn

+0

나는 조금 더 철저하게 대답을 편집했습니다. – edvaldig

+0

완전히 이해합니다. 그러나 그것은 실제로 내 문제가 아니 었습니다. 내 문제는 각각의 쿼드에 대해 각각 다른 텍스처에서 프레임을 "자르기"때문에 적절한 텍스처를 효과적으로 선택하는 방법입니다. (glActiveTexture를 사용하지 않고) – M3rlyn

관련 문제