2012-08-15 3 views
5

저는 LibGDX 프레임 워크의 SpriteBatch 클래스를 사용하고 있습니다. 내 목표는 셰이더를 통해 스프라이트의 표현을 수정하는 것입니다. LibGDX SpriteBatch Multitexture 가능?

batch = new SpriteBatch(2, shaderProgram); 

가 나는의 SpriteBatch 클래스에서 기본 쉐이더를 복사하여 쉐이더에 텍스처를 제공 할 수있는 작업 방법이 있나요

+ "uniform sampler2D u_Texture2;\n"// 

2D 다른 균일 한 샘플러를 추가했다. 이렇게하면 allways가 ClearColor Screen으로 끝납니다.

batch.begin(); 
    texture2.bind(1); 
    shaderProgram.setUniformi("u_Texture2", 1); 
    batch.draw(spriteTexture,positions[0].x,positions[0].y); 
    batch.draw(spriteTexture,positions[1].x,positions[1].y); 
batch.end(); 

각 텍스처만으로 작동합니다. 메쉬 클래스를 사용하여 수동으로 그리기가 예상대로 작동합니다. SpriteBatch의 편리함을 사용하려면 어떻게해야합니까?

THX for

답변

6

텍스처 바인딩과 관련된 문제가 있다고 생각합니다. 의 SpriteBatch는 활성 텍스처 유닛이 0이 될 것이다 asumes, 그래서

lastTexture.bind(); 대신 lastTexture.bind(0);

문제에 대한 호출을 코드에서 texture2.bind(1); 전화로 당신이 그것을주는 활성 단위 (1 점이다). 그래서 텍스처 유닛 0은 절대로 바인딩되지 않으며 빈 화면을 유발할 수 있습니다.

예를 들어, draw 호출 전에 Gdx.GL20.glActiveTexture(0);을 추가합니다. 나는 이것이 문제를 해결할 지 확신하지 못한다. 그러나 그것은 시작이다!

편집 : 나는 제안 된 솔루션을 시도해보고 작동 해! :디. 더 명확하게하려면 다음을 수행해야합니다.

 batch.begin(); 
     texture2.bind(1); 
     shaderProgram.setUniformi("u_Texture2", 1); 
     Gdx.gl.glActiveTexture(GL10.GL_TEXTURE0);//This is required by the SpriteBatch!! 
      //have the unit0 activated, so when it calls bind(), it has the desired effect. 
     batch.draw(spriteTexture,positions[0].x,positions[0].y); 
     batch.draw(spriteTexture,positions[1].x,positions[1].y); 
    batch.end(); 
+0

안녕하세요. 마지막으로 답변을 얻었습니다. 감사합니다. 당신 말이 맞아요. 그것은 클래스가 텍스처를 바인딩하는 방식의 원인입니다. 나는 이미 SpriteBatch 클래스를 만들었다 고 말할 필요가있다. SpriteBatch는 더 큰 크기의 Framebuffer 텍스처를 렌더링 할 때 몇 가지 문제점을 보여줍니다. 그리고 전 항상 TEXTURE0를 바인딩합니다. 그게 내 방식대로하기로 결정한 이유 지. 덜 convinient하지만 더 유연한 방법. 이제는 꼭지점 생성 만 처리하는 스프라이트 배치가 있습니다. 모든 arround는 자체 셰이더로 사용자 정의 할 수 있습니다. – fky

+1

SpriteBatch는 꼭지점을 생성하는 것 이상을 수행합니다.주의하지 않으면 성능 문제가 발생할 수 있습니다. SpriteBatch 자체에는 '유용성'문제가 있지만 디자인 결정입니다. 이것은 가장 일반적인 드로잉 작업을 단순화하기위한 것이며, 어떻게 든 그것이 유연성을 아프게합니다. 어쨌든, 나는 지금까지 (대부분의 시간을 사용/그것을 사용하기 전에 적절한 OpenGL 플래그를 비활성화/대부분의 문제를 해결할 수있었습니다). 어쩌면 오늘 밤 너와 같이 멀티 텍스쳐를 구현하려고 노력할 것이다;) –

+1

늦게 지내기를 부탁 드리며 지원해 주셔서 감사합니다. 편집 한 것처럼 작동합니다. 그러나 나는 그것을 좋아하지 않는다. 이것은 나에게 위험한 것처럼 보입니다. 나는 더 작은 크기의 더 빠르고 더 나은 디버깅 가능한 내 전문 버전을 선호한다. SpriteBatch는 모두를 행복하게하려고 노력하고 있습니다. 제 생각에는 성능 최적화 클래스가 아닙니다. 그러나 SpriteBatch가 TEXTURE0뿐만 아니라 LAST BOUND 텍스처를 사용하고 있음을 분명히 한 것에 대해 감사드립니다. – fky