버퍼 객체와 쉐이더가있는 스프라이트 시트


9

셰이더와 버퍼로 스프라이트 시트를 처리하는 가장 좋은 방법은 무엇입니까? 즉각적인 모드에서는 스프라이트의 texcoord를 그릴 때 쉽게 수정할 수 있지만 현대적인 OpenGL 로이 작업을 수행하는 방법을 모르겠습니다. 모든 texcoord를 버퍼에 저장하고 모든 스프라이트에 대한 포인터를 변경해야합니까, 아니면 더 좋은 방법이 있습니까?

답변:


11

당신은 항상 looong 버퍼 "vertex; texcoord"를 반복 할 수 있습니다. 그리고 당신이 말한 방법으로 색인을 사용하십시오. 그것은 아마도 당신이 알고있는 것과 가장 쉽고 유사합니다.

메모리를 절약하려면 깔끔한 솔루션이 있으며 단일 texcoord를 가진 버퍼에 하나의 스프라이트를 가지고 UVs 변환 매트릭스를 생성하고이를 셰이더에 보내고 texcoords와 함께 버텍스 셰이더를 곱하는 것입니다.

당신이 그것을 잘하지 않는다면 스스로 매트릭스를 만들 필요가 없습니다. 일반 GL 함수를 사용하고 glGetFloatv함수가있는 행렬을 읽는 것만 가능 합니다. 이처럼 :

glGetFloatv (GL_MODELVIEW_MATRIX ,&g_TexCoordMat);

더 잘 설명하기 위해 이미지를 만들었습니다. glTranslate ang glScale은 UV 공간만으로 움직이는 것처럼 보일 수 있습니다.

스프라이트 시트 uv

셰이더에 매트릭스를 보내는 방법을 모른다면 코드를 공유 할 수 있습니다.

편집 : 사진 추가
(내가 사용한 스프라이트 시트 소스 : funorb.com )


와우 고마워! 완벽한 답변. 나는이 솔루션을 정말로 좋아하며 직장에서 돌아 오면 곧이 솔루션을 조사 할 것입니다. :-) 막히면 몇 가지 질문이 더 있습니다.
uggwar

내가 볼 수있는 한, 각 스프라이트에 대해 하나의 드로우 콜을 생성합니다. 원활한 구현을 위해 이러한 스프라이트를 배치하는 방법이 있습니까?
uggwar

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