Advertisement
Guest User

FBOWut

a guest
Dec 25th, 2013
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.70 KB | None | 0 0
  1.  
  2. import com.jogamp.newt.opengl.GLWindow;
  3.  
  4. import com.jogamp.newt.event.WindowEvent;
  5. import com.jogamp.newt.event.WindowListener;
  6. import com.jogamp.newt.event.WindowUpdateEvent;
  7. import com.jogamp.opengl.util.glsl.ShaderCode;
  8. import com.jogamp.opengl.util.glsl.ShaderProgram;
  9.  
  10. import com.jogamp.opengl.*;
  11. import com.jogamp.opengl.FBObject.*;
  12. import javax.media.opengl.*;
  13.  
  14. import java.nio.FloatBuffer;
  15.  
  16. public class FBOTest3 implements GLEventListener, WindowListener{
  17.    
  18.     private final float[] canvasVertices = {
  19.             -1f, -1f, 0.0f,
  20.             -1f, 1f, 0.0f,
  21.             1f, -1f, 0.0f,
  22.             1f,  1f, 0.0f, 
  23.     };
  24.    
  25.     private final float[] canvasTexCoords = {
  26.             0.0f, 0.0f,
  27.             0.0f, 1.0f,
  28.             1.0f, 0.0f,
  29.             1.0f, 1.0f,
  30.     };
  31.    
  32.     private final float[] quadVertices = {
  33.             -0.5f, -0.5f, 0.0f,
  34.             -0.5f, 0.5f, 0.0f,
  35.             0.5f, -0.5f, 0.0f,
  36.             0.5f,  0.5f, 0.0f, 
  37.     };
  38.    
  39.     private final float[] offsetQuadVertices = {
  40.             -1f, -1f, 0.0f,
  41.             -1f, 0f, 0.0f,
  42.             0f, -1f, 0.0f,
  43.             0f, 0f, 0.0f,  
  44.     };
  45.    
  46.     //OpenGL Data
  47.     private GLProfile glProfile;
  48.     private GLCapabilities glCapabilities;
  49.     private GLWindow gameWindow;
  50.    
  51.     //Canvas data
  52.     private ShaderProgram canvasShader;
  53.     private int canvasVAO;
  54.     private int canvasTexture;
  55.     private int canvasColourFramebuffer;
  56.    
  57.     //Object data
  58.     private int vaoCentre;
  59.     private int vaoOffset;
  60.    
  61.     private FBObject source;
  62.     private FBObject target;
  63.     private GL3ES3 gl;
  64.    
  65.     private void initFBO()
  66.     {
  67.         gl = GLContext.getCurrentGL().getGL3ES3();
  68.         source = new FBObject(); // Create FrameBuffer
  69.        
  70.         source.reset(gl, 320, 320); // int width, height - size of FBO, can be resized with the same call
  71.         // With MSAA:
  72.         // fbo.reset(gl, width, height, sampleNum, true); // int width, height, sampleNum - size/sampleNum of FBO, can be resized with the same call
  73.         source.attachTexture2D(gl, 0, true); // Create GL_TEXTURE_2D texture which can be used as sampler2D at the shader code
  74.         // Created texture will be bound to FBO's GL_COLOR_ATTACHMENT0 (see the second parameter 0)
  75.         source.attachRenderbuffer(gl, Attachment.Type.DEPTH, 32); // Create depth buffer (if required)
  76.         source.unbind(gl); // See Note-3 for use with MSAA. Unbind FrameBuffer (You will probably want to make bind() - render - unbind() loop later on)
  77.     }
  78.    
  79.    
  80.     private void renderToFBO()
  81.     {
  82.         source.bind(gl);
  83.        
  84.         // Render scene as usual
  85.         gl.glClearColor(0, 0, 1, 1);
  86.         gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
  87.         gl.glBindVertexArray(vaoCentre);
  88.         gl.glDrawArrays(GL.GL_TRIANGLE_STRIP, 0, quadVertices.length);
  89.         gl.glBindVertexArray(vaoOffset);
  90.         gl.glDrawArrays(GL.GL_TRIANGLE_STRIP, 0, offsetQuadVertices.length);
  91.        
  92.         source.unbind(gl); // See Note-3 for use with MSAA
  93.     }
  94.    
  95.     public void renderFBOToScreen()
  96.     {
  97.         final TextureAttachment tex0 = (TextureAttachment) source.getColorbuffer(0);
  98.         gl.glActiveTexture(GL2.GL_TEXTURE0);
  99.         gl.glEnable(GL2.GL_TEXTURE_2D);  // Should not call this for CORE profiles, i.e. ES2, GL3, ..
  100.         gl.glBindTexture(GL2.GL_TEXTURE_2D, tex0.getName()); // See Notes 1, 2. Binding source FBO's TextureAttachment as GL_TEXTURE_2D
  101.         // Here you can just render a fullscreen quad to show FBO content, or do something more exciting
  102.            
  103.          //Draw the colour buffer to the screen
  104.         gl.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0);
  105.         gl.glClearColor(1f, 0f, 0f, 1f);
  106.         gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
  107.        
  108.         gl.glBindVertexArray(canvasVAO);
  109.         canvasShader.useProgram(gl, true);
  110.  
  111.         int textureSamplerIndex = gl.glGetUniformLocation(canvasShader.program(), "textureUnit");
  112.         gl.glUniform1f(textureSamplerIndex, 0);
  113.        
  114.         gl.glDrawArrays(GL.GL_TRIANGLE_STRIP, 0, canvasVertices.length/3);
  115.     }
  116.    
  117.     public final void init(GLAutoDrawable glad)
  118.     {
  119.         GL2 gl = glad.getGL().getGL2();
  120.        
  121.         //Load shaders
  122.         canvasShader = loadShader(gl, "Canvas.vsh", "Canvas.fsh");
  123.        
  124.         //Generate framebuffers
  125.         int[] framebuffers = new int[1];
  126.         gl.glGenFramebuffers(2, framebuffers, 0);
  127.         canvasColourFramebuffer = framebuffers[0];
  128.        
  129.         //Generate textures
  130.         int[] textures = new int[1];
  131.         gl.glGenTextures(1, textures, 0);
  132.         canvasTexture = textures[0];
  133.         gl.glBindTexture(GL.GL_TEXTURE_2D, canvasTexture);
  134.        
  135.         //Generate VAOs
  136.         int[] vaos = new int[3];
  137.         gl.glGenVertexArrays(3, vaos, 0);
  138.         vaoCentre = vaos[0];
  139.         vaoOffset = vaos[1];
  140.         canvasVAO = vaos[2];
  141.        
  142.         //Generate buffers
  143.         int[] buffers = new int[4];
  144.         gl.glGenBuffers(4, buffers, 0);
  145.         int vertBuffer = buffers[0];
  146.         int offsetVertBuffer = buffers[1];
  147.         int canvasVertBuffer = buffers[2];
  148.         int canvasTexCoordBuffer = buffers[3];
  149.        
  150.         //Initialize VAOs
  151.         gl.glBindVertexArray(vaoCentre);
  152.         gl.glBindBuffer(GL.GL_ARRAY_BUFFER, vertBuffer);
  153.         gl.glBufferData(GL.GL_ARRAY_BUFFER, quadVertices.length*(Float.SIZE/8), FloatBuffer.wrap(quadVertices), GL.GL_STATIC_DRAW);
  154.         gl.glEnableVertexAttribArray(0);
  155.         gl.glVertexAttribPointer(0, 3, GL.GL_FLOAT, false, 0, 0);
  156.        
  157.         gl.glBindVertexArray(vaoOffset);
  158.         gl.glBindBuffer(GL.GL_ARRAY_BUFFER, offsetVertBuffer);
  159.         gl.glBufferData(GL.GL_ARRAY_BUFFER, offsetQuadVertices.length*(Float.SIZE/8), FloatBuffer.wrap(offsetQuadVertices), GL.GL_STATIC_DRAW);
  160.         gl.glEnableVertexAttribArray(0);
  161.         gl.glVertexAttribPointer(0, 3, GL.GL_FLOAT, false, 0, 0);
  162.        
  163.         //Canvas VAO
  164.         canvasShader.useProgram(gl, true);
  165.         gl.glBindVertexArray(canvasVAO);
  166.         gl.glBindBuffer(GL.GL_ARRAY_BUFFER, canvasVertBuffer);
  167.         gl.glBufferData(GL.GL_ARRAY_BUFFER, canvasVertices.length*(Float.SIZE/8), FloatBuffer.wrap(canvasVertices), GL.GL_STATIC_DRAW);
  168.         int positionLoc = gl.glGetAttribLocation(canvasShader.program(), "position");
  169.         gl.glEnableVertexAttribArray(positionLoc);
  170.         gl.glVertexAttribPointer(positionLoc, 3, GL.GL_FLOAT, false, 0, 0);
  171.        
  172.         gl.glBindBuffer(GL.GL_ARRAY_BUFFER, canvasTexCoordBuffer);
  173.         gl.glBufferData(GL.GL_ARRAY_BUFFER, canvasTexCoords.length*(Float.SIZE/8), FloatBuffer.wrap(canvasTexCoords), GL.GL_STATIC_DRAW);
  174.         int texCoordLoc = gl.glGetAttribLocation(canvasShader.program(), "texCoord");
  175.         gl.glEnableVertexAttribArray(texCoordLoc);
  176.         gl.glVertexAttribPointer(texCoordLoc, 2, GL.GL_FLOAT, false, 0, 0);
  177.         canvasShader.useProgram(gl, false);
  178.        
  179.         //Setup the canvas
  180.         gl.glBindFramebuffer(GL.GL_FRAMEBUFFER, canvasColourFramebuffer);
  181.         gl.glBindTexture(GL.GL_TEXTURE_2D, canvasTexture);
  182.         gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGB, 320, 320, 0, GL.GL_RGB, GL.GL_FLOAT, null);
  183.        
  184.         gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR);
  185.         gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);
  186.        
  187.         gl.glFramebufferTexture2D(GL.GL_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT0, GL.GL_TEXTURE_2D, canvasTexture, 0);
  188.        
  189.         gl.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0);
  190.        
  191.         initFBO();
  192.     }
  193.    
  194.     public final void display(GLAutoDrawable glad)
  195.     {
  196.         renderToFBO();
  197.         renderFBOToScreen();
  198.     }
  199.    
  200.     public FBOTest3()
  201.     {
  202.         //Initialize the OpenGL profile that the game will use
  203.         glProfile = GLProfile.getDefault();
  204.         glCapabilities = new GLCapabilities(glProfile);
  205.        
  206.         //Create the game window
  207.         gameWindow = GLWindow.create(glCapabilities);
  208.         gameWindow.setSize(320, 320);
  209.         gameWindow.setVisible(true);
  210.         gameWindow.setTitle("JOGL Test");
  211.         gameWindow.addWindowListener(this);
  212.         gameWindow.addGLEventListener(this);
  213.     }
  214.    
  215.     public final void start()
  216.     {
  217.         while(true)
  218.         {
  219.             gameWindow.display();
  220.         }
  221.     }
  222.  
  223.     public static void main(String[] args)
  224.     {
  225.         FBOTest3 fbot = new FBOTest3();
  226.         fbot.start();
  227.     }
  228.    
  229.     private ShaderProgram loadShader(GL2 gl, String vertexShader, String fragmentShader)
  230.     {
  231.         ShaderCode vertShader = ShaderCode.create(gl, GL2ES2.GL_VERTEX_SHADER, 1, getClass(), new String[]{"/shaders/"+vertexShader},false);
  232.         vertShader.compile(gl);
  233.        
  234.         ShaderCode fragShader = ShaderCode.create(gl, GL2ES2.GL_FRAGMENT_SHADER, 1, getClass(), new String[]{"/shaders/"+fragmentShader},false);
  235.         fragShader.compile(gl);
  236.        
  237.         ShaderProgram newShader = new ShaderProgram();
  238.         newShader.init(gl);
  239.         newShader.add(vertShader);
  240.         newShader.add(fragShader);
  241.        
  242.         newShader.link(gl, System.out);
  243.        
  244.         vertShader.destroy(gl);
  245.         fragShader.destroy(gl);
  246.  
  247.         return newShader;
  248.     }
  249.    
  250.     //GLEvent listener methods
  251.     public void reshape(GLAutoDrawable glad, int x, int y, int width, int height)
  252.     {
  253.     }
  254.     public void dispose(GLAutoDrawable glad)
  255.     {
  256.     }
  257.    
  258.     //Window listener methods
  259.     public void windowDestroyNotify(WindowEvent we)
  260.     {
  261.         //The window and profile get cleaned up automatically in this case anyways
  262.         System.exit(0);
  263.     }
  264.     public void windowDestroyed(WindowEvent we){}
  265.     public void windowGainedFocus(WindowEvent we){}
  266.     public void windowLostFocus(WindowEvent we){}
  267.     public void windowMoved(WindowEvent we){}
  268.     public void windowResized(WindowEvent we){}
  269.     public void windowRepaint(WindowUpdateEvent wue){}
  270. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement