NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: FBO(framebuffer object) v 2D prostredí-> Prosím o radu.

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
taligatomas
Člen
Avatar
taligatomas:20.5.2015 20:18

Skušam programovať v jave hru na základe dos hry Tunneler(Geoffrey Silverton).

Potrebujem vytvoriť obrovskú plochu z malých častí ktorá bude prechodom postavy(Tanku) ničená(podobne ako v hre "where is my water"). Na inom fóre mi poradili použiť FBO.

Programujem pomocou LWJGL knižnice a mám taký problém že neviem nájsť návod na vytvorenie FBO-cka v 2D (GL_ortho). Našiel som návody pre 3D ktoré neviem upraviť tak aby mi to fungovalo v 2D a našiel som aj návody v 2D ale tie boli v c++ a ani to som si nevedel prerobiť do javy.

Skúšal som tieto návody:
http://www.opengl-tutorial.org/…-to-texture/#…
http://wiki.lwjgl.org/…Objects_(FBO)

Prosím o radu, pomoc, alebo iný návrh riešenia môjho problému. Ďakujem všetkým vopred.

Toto je môj posledný neúspech:

import java.util.logging.Level;
import java.util.logging.Logger;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.*;
import static org.lwjgl.opengl.ARBFramebufferObject.*;
import static org.lwjgl.opengl.EXTFramebufferObject.*;
import static org.lwjgl.opengl.GL11.*;


/**
 *
 *
 */
public class FBO2dTutorial2 {

    public static int dispHeight = 600, dispWidth = 800;
    static int colorTextureID;
    static int framebufferID;
    static int depthRenderBufferID;

    public static void main(String[] args)
    {


        initDisplay();
        initGL();

        initLoop();

        cleanUp();

    }




    private static void initLoop()
    {
        while (!Display.isCloseRequested())
        {
            try {
                Thread.sleep(100);
            } catch (InterruptedException ex) {
                Logger.getLogger(FBO2dTutorial2.class.getName()).log(Level.SEVERE, null, ex);
            }

            glBegin(GL_QUADS);
            glVertex2f(0.0f, 0.0f);System.out.println("Kreslím bod A");
            glVertex2f(1.0f, 0.0f);System.out.println("Kreslím bod B");
            glVertex2f(1.0f, 1.0f);System.out.println("Kreslím bod C");
            glVertex2f(0.0f, 1.0f);System.out.println("Kreslím bod D");
            glEnd();

            renderToFBO();

        }
    }


    private static void renderToFBO()
    {
        glBindTexture(GL_TEXTURE_2D, 0);                                // unlink textures because if we dont it all is gonna fail
        glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebufferID);        // switch to rendering on our FBO

        System.out.println("Kreslím");
        glClearColor (1.0f, 0.0f, 0.0f, 0.5f);
        glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);            // Clear Screen And Depth Buffer on the fbo to red
        glLoadIdentity ();                                              // Reset The Modelview Matrix


        glBegin(GL_QUADS);
            glTexCoord2f(0.0f, 0.0f); glVertex2f(-1.0f, -1.0f);  // Bottom Left Of The Texture and Quad
            glTexCoord2f(1.0f, 0.0f); glVertex2f( 1.0f, -1.0f);  // Bottom Right Of The Texture and Quad
            glTexCoord2f(1.0f, 1.0f); glVertex2f( 1.0f,  1.0f);  // Top Right Of The Texture and Quad
            glTexCoord2f(0.0f, 1.0f); glVertex2f(-1.0f,  1.0f);  // Top Left Of The Texture and Quad
        glEnd();


        glDisable(GL_TEXTURE_2D);
        glFlush ();
    }

    /******************************************************************************/

    private static void cleanUp() {
        Display.destroy();
    }

    private static void initGL() {
        glMatrixMode(GL_PROJECTION);                                            //zvolili sme si projekcny matrix
        glLoadIdentity();                                                       //zresetovali sme pamať matrixu
        glOrtho(0,Display.getWidth(),0, Display.getHeight(), -1, 1);            // zvolili sme si typ zobrazenia a velkosť videnej plochy
        glMatrixMode(GL_MODELVIEW);                                             //zvolili sme si modelview matrix

        glClearColor(0,0,0,1);                                                  //nastavenie farby pozadia/ničoho na danu hodnotu

        glDisable(GL_DEPTH_TEST);                                               //Deaktivovali sme Depth test pretože nebudeme pracovatť v 3D
        glEnable(GL_TEXTURE_2D);

        /***************/
        initFBO();
    }

    private static void initDisplay() {
        try {
            Display.setDisplayMode(new DisplayMode(dispWidth,dispHeight));
            Display.create();
            Display.setVSyncEnabled(true);
        }
        catch (LWJGLException ex) {
            Logger.getLogger(FBO2dTutorial2.class.getName()).log(Level.SEVERE, null, ex);
        }

        glColor3f(1,1,0);
        glBegin(GL_QUADS);
            glTexCoord2f(0.0f, 0.0f);System.out.println("Kreslím bod 1");
            glTexCoord2f(1.0f, 0.0f);System.out.println("Kreslím bod 2");
            glTexCoord2f(1.0f, 1.0f);System.out.println("Kreslím bod 3");
            glTexCoord2f(0.0f, 1.0f);System.out.println("Kreslím bod 4");
        glEnd();
    }

    private static void initFBO() {
       // check if GL_EXT_framebuffer_object can be use on this system
        if (!GLContext.getCapabilities().GL_EXT_framebuffer_object) {
            System.out.println("FBO not supported!!!");
            System.exit(0);
        }
        else {

            System.out.println("FBO is supported!!!");

            // init our fbo

            framebufferID = glGenFramebuffersEXT();                                         // create a new framebuffer
            colorTextureID = glGenTextures();                                               // and a new texture used as a color buffer
            //depthRenderBufferID = glGenRenderbuffersEXT();                                  // And finally a new depthbuffer

            glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebufferID);                        // switch to the new framebuffer

            // initialize color texture
            glBindTexture(GL_TEXTURE_2D, colorTextureID);                                   // Bind the colorbuffer texture

            glTexImage2D(GL_TEXTURE_2D, 0,GL_RGBA8, 500, 400, 0,GL_RGBA, GL_INT, (java.nio.ByteBuffer) null); // Give an empty image to OpenGL

            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);              // Poor filtering. Needed !
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);              // Poor filtering. Needed !
            glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,GL_COLOR_ATTACHMENT0_EXT,GL_TEXTURE_2D, colorTextureID, 0); // attach it to the framebuffer


            // Always check that our framebuffer is ok
            if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
            System.out.println("pojebalo sa to");

            glViewport(0,0,500,400);
    }

}


}
 
Odpovědět
20.5.2015 20:18
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 1 zpráv z 1.