.[ ČeskéHry.cz ].
Java LibGDX FBO/FrameBufferObject

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Java / J2ME
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Kroko309



Založen: 06. 06. 2015
Příspěvky: 17

PříspěvekZaslal: 13. červen 2015, 15:45:35    Předmět: Java LibGDX FBO/FrameBufferObject Odpovědět s citátem

Zdravím vás všetkých. Programujem už asi rok ale stále sa len učím. Skúšal som všetko sám ale v mojom okolí nie je nik kto by my mohol poradiť keď sa dostanem do slepej uličky.
Preto som začal používať LibGDX aby som si trošku uľahčil život. Smile

Práve skúšam vytvoriť FBO len v 2D prostredí.
Mohol by sa mi prosím niekto kto sa vyzná v LibGDX vysvetliť prečo keď som vytvoril fbo s rozmermi img.getwidth() a img.getheight() (obe sú 256) a do tohoto fbo-čka potom zakreslím tento obrázok je ten zmenšený??? Dokonca nemá ani štvorcoví rozmer.
Question

kód:

package com.fbo.test;

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import static com.badlogic.gdx.graphics.Pixmap.Format.RGBA8888;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.graphics.glutils.FrameBuffer;

public class FBOTest extends ApplicationAdapter {
   SpriteBatch batch;
   Texture img;
   FrameBuffer fbo;
        TextureRegion fboimg;
       
   @Override
   public void create () {
      batch = new SpriteBatch();
      img = new Texture("badlogic.jpg");
                               
   }

   @Override
   public void render () {
      Gdx.gl.glClearColor(0, 0, 0, 1);
      Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
         
            try {
                fbo = new FrameBuffer(RGBA8888, img.getWidth(), img.getHeight(), false);
            } catch (Exception e) {System.out.print(e);}
           
            fbo.begin();
            Gdx.gl.glClearColor(0, 0, 1, 1);    // Farba pozadia v FBO
            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
                       
            batch.begin();
            batch.draw(img, 0, 0);
            batch.end();
            fbo.end();
           
            //FBO ziska velkosť z img (256*256)
            fboimg = new TextureRegion(fbo.getColorBufferTexture(), 0, 0, fbo.getWidth(), fbo.getHeight());
                   
            fboimg.flip(false, true);   //otočí FBO správne
           
            batch.begin();
            batch.setColor(1, 1, 1, 1);  //ktore farby chcem vidieť v FBO
            batch.draw(fboimg, 0, 0);   //poloha FBO -lavý spodný roh
            batch.end();
           
   }
       
}


Ďakujem za vaše rady.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



Založen: 28. 07. 2007
Příspěvky: 1047

PříspěvekZaslal: 13. červen 2015, 21:02:38    Předmět: Odpovědět s citátem

Ako je nastaveny viewport a projekcna matica?
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Kroko309



Založen: 06. 06. 2015
Příspěvky: 17

PříspěvekZaslal: 14. červen 2015, 07:17:11    Předmět: Odpovědět s citátem

Po tvojej správnej otázke som kód upravil takto:
kód:

package com.fbo.test;

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import static com.badlogic.gdx.graphics.Pixmap.Format.RGBA8888;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.graphics.glutils.FrameBuffer;

public class FBOTest extends ApplicationAdapter {
   SpriteBatch batch;
   Texture img;
   FrameBuffer fbo;
        TextureRegion fboimg;
        OrthographicCamera cameraFbo, camera;
        float polohaX, polohaY;
       
   @Override
   public void create () {
      batch = new SpriteBatch();
      img = new Texture("badlogic.jpg");
               
                cameraFbo = new OrthographicCamera(256, 256);
                // vycentrovanie pohladu kamery v FBO
                cameraFbo.translate(cameraFbo.viewportHeight/2, cameraFbo.viewportWidth/2);
                camera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
   }

   @Override
   public void render () {
      Gdx.gl.glClearColor(0, 0, 0, 1);
      Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
                cameraFbo.update();
         
            try {
                fbo = new FrameBuffer(RGBA8888, img.getWidth(), img.getHeight(), false);
            } catch (Exception e) {System.out.print(e);}
           
            fbo.begin();
            Gdx.gl.glClearColor(0, 0, 1, 1);    // Farba pozadia v FBO
            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
           
            batch.setProjectionMatrix(cameraFbo.combined);
           
            batch.begin();
            batch.draw(img, 0, 0);
            batch.end();
            fbo.end();
           
            //FBO ziska velkosť z img (256*256)
            fboimg = new TextureRegion(fbo.getColorBufferTexture(), 0, 0, fbo.getWidth(), fbo.getHeight());
            //FBO ziska rozmer obrazovky/canvasu
            //fboimg = new TextureRegion(fbo.getColorBufferTexture(), 0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());           
            fboimg.flip(false, true);   //otočí FBO správne
           
            batch.setProjectionMatrix(camera.combined);
           
            batch.begin();
            batch.setColor(1, 1, 1, 1);  //ktore farby chceme vidieť v FBO
            batch.draw(fboimg, 0, 0);   //poloha FBO -lavý spodný roh
            batch.end();
           
           
      //batch.begin();
      //batch.draw(img, 0, 0);
      //batch.end();
   }

}

Mimochodom rozlíšenie obrazovky je 800*480. Po tejto úprave sa mi už zobrazuje obrázok v správnom pomere a vypĺňa mi celé FBO.

Jeden problém však mám.... camera je vycentrovaná na bod 0.0 kde začínam kresliť FBO. ako posuniem pohlad kamery? Skúšal som
camera.translate(camera.viewportHeight/2, camera.viewportWidth/2)
ale to mi nefungovalo. Chcel by som aby sa kamera pozerala na stred FBO ale aby bol ten kreslený z bodu x0,y0.
Zatial idem skúšať dalej, dakujem za pomoc. Ak by som na to prišiel sám tak sem napíšem.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Kroko309



Založen: 06. 06. 2015
Příspěvky: 17

PříspěvekZaslal: 14. červen 2015, 11:11:14    Předmět: Odpovědět s citátem

Ja babrák som zabudol do renderu dať camera.update()
Embarassed

Ďakujem. Ak by mal niekto záujem tak tu je hotový kód pre vytvorenie FBO v 2D

kód:

package com.fbo.test;

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Keys;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import static com.badlogic.gdx.graphics.Pixmap.Format.RGBA8888;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.graphics.glutils.FrameBuffer;

public class FBOTest extends ApplicationAdapter {
   SpriteBatch batch;
   Texture img;
   FrameBuffer fbo;
        TextureRegion fboimg;
        OrthographicCamera cameraFbo, camera;
        float polohaX, polohaY, magnetude =1;
       
   @Override
   public void create () {
      batch = new SpriteBatch();
      img = new Texture("badlogic.jpg");
               
                cameraFbo = new OrthographicCamera(256, 256);
                // vycentrovanie pohladu kamery v FBO
                cameraFbo.translate(cameraFbo.viewportHeight/2, cameraFbo.viewportWidth/2);
                // vytvorenie kamery pre okno a jej posunutie
                camera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
                camera.translate(camera.viewportWidth/2, camera.viewportHeight/2);
               
                createFBO();
   }
       
        public void createFBO()
        {
            Gdx.gl.glClearColor(0, 0, 0, 1);
            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
            cameraFbo.update(); camera.update();
               
           
            try {
                fbo = new FrameBuffer(RGBA8888, img.getWidth(), img.getHeight(), false);
            } catch (Exception e) {System.out.print(e);}
           
            fbo.begin();
            Gdx.gl.glClearColor(0, 0, 1, 1);    // Farba pozadia v FBO
            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
           
            batch.setProjectionMatrix(cameraFbo.combined);
           
            batch.begin();
            batch.draw(img, 0, 0);
            batch.end();
            fbo.end();
           
            //FBO ziska velkosť z img (256*256)
            fboimg = new TextureRegion(fbo.getColorBufferTexture(), 0, 0, fbo.getWidth(), fbo.getHeight());
            fboimg.flip(false, true);   //otočí FBO správne
        }
       
       
   @Override
   public void render () {
      Gdx.gl.glClearColor(0, 0, 0, 1);
      Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
                cameraFbo.update();
                camera.update();
         
           
            batch.setProjectionMatrix(camera.combined);
           
            batch.begin();
            batch.setColor(1, 1, 1, 1);  //ktore farby chceme vidieť v FBO
            batch.draw(fboimg, polohaY, polohaX);   //poloha FBO -lavý spodný roh
            batch.end();
           
            input();
   }
           
    private void input()
    {
        if (Gdx.input.isKeyPressed(Keys.RIGHT))
        {polohaY +=1 *magnetude;}
        if (Gdx.input.isKeyPressed(Keys.LEFT))
        {polohaY -=1 *magnetude;}
        if (Gdx.input.isKeyPressed(Keys.UP))
        {polohaX +=1 *magnetude;}
        if (Gdx.input.isKeyPressed(Keys.DOWN))
        {polohaX -=1 *magnetude;}
        if (Gdx.input.isKeyPressed(Keys.CONTROL_LEFT))
        {magnetude =3;}
        else magnetude = 1;
        //System.out.println("Poloha X:"+polohaX+" Y:"+polohaY);
    }
   
        @Override
   public void dispose()
   {
       fbo.dispose();
       img.dispose();
       batch.dispose();
   }
}


PS: nou možno ti to pride smiešne ale vďaka tvojej otázke som to vyriešil omnoho rýchlejšie. Ďakujem
_________________
Väčšinou nepotrebujem návody krok za krokom. Stačí ma len postrčiť správnym smerom. Ďakujem za vaše rady a skúsenosti pretože tie sa nedajú kopírovať.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



Založen: 28. 07. 2007
Příspěvky: 1047

PříspěvekZaslal: 14. červen 2015, 13:28:40    Předmět: Odpovědět s citátem

som rad ze som mohol pomoct. kazdy nejak zacinal, si spominak aky som bol hrdy ked som konecne pochopil nasobenie matic Smile
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Java / J2ME Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna