2013-07-13 71 views
1

我使用繪製一些2D紋理並與它們一起工作的程序。在這個程序中使用了libgdx。我在使用FrameBuffer時遇到了一些問題。我嘗試在我的FrameBuffer中繪製一些紋理,然後我需要保存更改的紋理(或繪製),並在此FrameBuffer中使用此紋理更多時間。我試着通過在FrameBuffer中繪製

Texture texture = mFrameBuffer.getColorBufferTexture() 

保存質地和我儘量只綁定紋理通過FrameBuffer

mFilterBuffer.getColorBufferTexture().bind(); 

對於第一次迭代的所有工作良好。但是當我嘗試在FrameBuffer中使用他的ColorBufferTexture紋理時,我的紋理完全是黑色的。 代碼:

public void process(MySprite psObject, float startX, float startY,  
float endX, float endY, int mWidth, int mHeight) { 
         boolean frst = false; 
         if(psObject.getFrameBuffer() == null){ 
             psObject.setFrameBuffer(new FrameBuffer(Pixmap.Format.RGBA8888,  psObject.getTexture().getWidth(), psObject.getTexture().getHeight(), true)); 
         } 
         if(pSprite == null || pSprite != psObject){ 
             mFrameBuffer = psObject.getFrameBuffer(); 
             frst = true; 
             pSprite = psObject; 
         } 
         mFrameBuffer.begin(); 
         Gdx.gl.glViewport(0, 0, psObject.getTexture().getWidth(), psObject.getTexture().getHeight()); 
         Gdx.graphics.getGL20().glClearColor(0f, 0f, 0f, 1f); 
         Gdx.graphics.getGL20().glClear(GL20.GL_COLOR_BUFFER_BIT); 
         ShaderProgram shader = MyUtils.newInstance().getCurrentShader(); 
         if(!shader.isCompiled()){ 
             Log.i("ERROR", "SHERROR " + shader.getLog()); 
         } 
         if(shader != null){ 
             if(frst){ 
                 psObject.getTexture().bind(); 
             }else{ 
     mFrameBuffer.getColorBufferTexture().bind(); 
             } 
             shader.begin(); 
             Matrix4 matrix = new Matrix4(); 
             matrix.setToRotation(1, 0, 0, 180); 
             matrix.scale(scaleSizeInFilterProcessor, scaleSizeInFilterProcessor, 1); 
             shader.setUniformMatrix("u_worldView", matrix); 
             shader.setUniformi("u_texture", 0); 
             float [] start = new float[]{0f,0}; 
             float [] end = new float[]{1f,1f}; 
             MyUtils.newInstance().getShaderData(shader, start, end, mWidth, mHeight); 
             psObject.getMesh().render(shader, GL20.GL_TRIANGLES); 
             shader.end(); 
         } 
         mFrameBuffer.end(); 
     } 
+0

你多久打一次「過程」功能?當你在程序中第一次調用函數時,你對「pSprite」有什麼價值?什麼是着色器源代碼?即使沒有發生任何錯誤,着色器仍然可能負責黑屏。你是否使用白色紋理或類似的東西來測試你想渲染的場景?還有一些關於你的問題的問題... – TheWhiteLlama

回答

1

你的代碼需要一些重構;)。無論如何,如果這是你的問題,你不能讀寫同一個FBO。 你需要2 FBO的(比如A和B)

Draw scene to A, 
Bind A's color texture 
Draw scene to B (now you can read from A). 

請注意,您可以擴展libgdx FBO到具有相同FBO相關的許多紋理。

+0

謝謝,它工作正常 – Dima