Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Kroko309
Založen: 06. 06. 2015 Příspěvky: 17
|
Zaslal: 13. červen 2015, 15:45:35 Předmět: Java LibGDX FBO/FrameBufferObject |
|
|
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.
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.
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 |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 13. červen 2015, 21:02:38 Předmět: |
|
|
Ako je nastaveny viewport a projekcna matica? _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
Kroko309
Založen: 06. 06. 2015 Příspěvky: 17
|
Zaslal: 14. červen 2015, 07:17:11 Předmět: |
|
|
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 |
|
 |
Kroko309
Založen: 06. 06. 2015 Příspěvky: 17
|
Zaslal: 14. červen 2015, 11:11:14 Předmět: |
|
|
Ja babrák som zabudol do renderu dať camera.update()
Ď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 |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 14. červen 2015, 13:28:40 Předmět: |
|
|
som rad ze som mohol pomoct. kazdy nejak zacinal, si spominak aky som bol hrdy ked som konecne pochopil nasobenie matic  _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
|