Guest User

VBO Tutorials

a guest
Jun 25th, 2015
347
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.08 KB | None | 0 0
  1.     // Variable Declarations
  2.     //<editor-fold defaultstate="collapsed" desc="Variable Declarations">
  3.     private static FloatBuffer cBuffer;
  4.     private static FloatBuffer vBuffer;
  5.     private static ShortBuffer iBuffer;
  6.    
  7.     private static int vHandle3;
  8.     private static int cHandle3;
  9.    
  10.     private static int vHandle4;
  11.     private static int cHandle4;
  12.     private static int iHandle4;
  13.    
  14.     private static int vcHandle5;
  15.     private static FloatBuffer vcBuffer5;
  16.     private static int vcHandle6;
  17.     private static FloatBuffer vcBuffer6;
  18.     private static int vcHandle7;
  19.     private static FloatBuffer vcBuffer7;
  20.  
  21.     //</editor-fold>
  22.  
  23.     // Publicly accessable Methods to control functions of this class
  24.     //<editor-fold defaultstate="collapsed" desc="Public Methods">
  25.     public static void initializeBuffers(){
  26.  
  27.         initVertexArrays();
  28.         initVBO();
  29.         initVBOIndexed();
  30.         initVBOInterleaved1();
  31.         initVBOInterleaved2();
  32.         initVBOInterleaved3Mapped();
  33.        
  34.     }
  35.     public static void drawThem(){
  36.         // Initialize States
  37.         glEnableClientState(GL_VERTEX_ARRAY);
  38.         glEnableClientState(GL_COLOR_ARRAY);
  39.        
  40.         drawImmediateMode();
  41.        
  42.         glTranslatef(0.05f, -0.05f, 0);
  43.         drawVertexArrays();
  44.        
  45.         glTranslatef(0.05f, -0.05f, 0);
  46.         drawVBO();
  47.        
  48.         glTranslatef(0.05f, -0.05f, 0);
  49.         drawVBOIndexed();
  50.        
  51.         glTranslatef(0.05f, -0.05f, 0);
  52.         drawVBOInterleaved1();
  53.        
  54.         glTranslatef(0.05f, -0.05f, 0);
  55.         drawVBOInterleaved2();
  56.        
  57.         glTranslatef(0.05f, -0.05f, 0);
  58.         drawVBOInterleaved3Mapped();
  59.        
  60.         // Clean up States
  61.         glDisableClientState(GL_COLOR_ARRAY);
  62.         glDisableClientState(GL_VERTEX_ARRAY);
  63.  
  64.     }
  65.  
  66.     //</editor-fold>
  67.  
  68.     // Internal Methods used within this class only
  69.     //<editor-fold defaultstate="collapsed" desc="Internal Methods">
  70.  
  71.     private static void initVertexArrays(){
  72.        
  73.         cBuffer = BufferUtils.createFloatBuffer(9);
  74.         cBuffer.put(1).put(0).put(0);
  75.         cBuffer.put(0).put(1).put(0);
  76.         cBuffer.put(0).put(0).put(1);
  77.         cBuffer.flip();
  78.  
  79.         vBuffer = BufferUtils.createFloatBuffer(9);
  80.         vBuffer.put(-0.5f).put(-0.5f).put(0.0f);
  81.         vBuffer.put(+0.5f).put(-0.5f).put(0.0f);
  82.         vBuffer.put(+0.5f).put(+0.5f).put(0.0f);
  83.         vBuffer.flip();
  84.      
  85.         iBuffer = BufferUtils.createShortBuffer(3);
  86.         iBuffer.put((short) 0);
  87.         iBuffer.put((short) 1);
  88.         iBuffer.put((short) 2);
  89.         iBuffer.flip();
  90.  
  91.     }
  92.     private static void initVBO(){
  93.  
  94.         // Initialize Handles
  95.         vHandle3 = glGenBuffers();
  96.         cHandle3 = glGenBuffers();
  97.        
  98.         // Bind vertexes
  99.         glBindBufferARB(GL_ARRAY_BUFFER_ARB, vHandle3);
  100.         glBufferDataARB(GL_ARRAY_BUFFER_ARB, vBuffer, GL_STATIC_DRAW_ARB);
  101.        
  102.         // Bind Colors
  103.         glBindBufferARB(GL_ARRAY_BUFFER_ARB, cHandle3);
  104.         glBufferDataARB(GL_ARRAY_BUFFER_ARB, cBuffer, GL_STATIC_DRAW_ARB);
  105.        
  106.         glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);  // Unbind
  107.        
  108.     }
  109.     private static void initVBOIndexed(){
  110.         // Initialize Handles
  111.         vHandle4 = glGenBuffers();
  112.         cHandle4 = glGenBuffers();
  113.         iHandle4 = glGenBuffers();
  114.  
  115.         // Bind vertexes
  116.         glBindBufferARB(GL_ARRAY_BUFFER_ARB, vHandle4);
  117.         glBufferDataARB(GL_ARRAY_BUFFER_ARB, vBuffer, GL_STATIC_DRAW_ARB);
  118.  
  119.         // Bind Colors
  120.         glBindBufferARB(GL_ARRAY_BUFFER_ARB, cHandle4);
  121.         glBufferDataARB(GL_ARRAY_BUFFER_ARB, cBuffer, GL_STATIC_DRAW_ARB);
  122.  
  123.         // Bind Indexes
  124.         glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, iHandle4);
  125.         glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, iBuffer, GL_STATIC_DRAW_ARB);
  126.         glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);  // Unbind
  127.        
  128.     }
  129.     private static void initVBOInterleaved1(){
  130.         // Interleaved in pattern VCVCVC
  131.        
  132.         // create geometry buffer (both vertex and color)
  133.         vcBuffer5 = BufferUtils.createFloatBuffer(9 + 9);
  134.  
  135.         vcBuffer5.put(-0.5f).put(-0.5f).put(0.0f); // v
  136.         vcBuffer5.put(1).put(0).put(0); // c
  137.         vcBuffer5.put(+0.5f).put(-0.5f).put(0.0f); // v
  138.         vcBuffer5.put(0).put(1).put(0); // c
  139.         vcBuffer5.put(+0.5f).put(+0.5f).put(0.0f); // v
  140.         vcBuffer5.put(0).put(0).put(1); // c
  141.  
  142.         vcBuffer5.flip();
  143.  
  144.         // Initialize Handles
  145.         vcHandle5 = glGenBuffers();
  146.  
  147.         // Bind Buffer
  148.         glBindBufferARB(GL_ARRAY_BUFFER_ARB, vcHandle5);
  149.         glBufferDataARB(GL_ARRAY_BUFFER_ARB, vcBuffer5, GL_STATIC_DRAW_ARB);
  150.         glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);  // Unbind
  151.        
  152.  }
  153.     private static void initVBOInterleaved2(){
  154.         // create geometry buffer (both vertex and color)
  155.         vcBuffer6 = BufferUtils.createFloatBuffer(9 + 9);
  156.  
  157.         vcBuffer6.put(-0.5f).put(-0.5f).put(0.0f); // v
  158.         vcBuffer6.put(+0.5f).put(-0.5f).put(0.0f); // v
  159.         vcBuffer6.put(+0.5f).put(+0.5f).put(0.0f); // v
  160.         vcBuffer6.put(1).put(0).put(0); // c      
  161.         vcBuffer6.put(0).put(1).put(0); // c      
  162.         vcBuffer6.put(0).put(0).put(1); // c
  163.  
  164.         vcBuffer6.flip();
  165.  
  166.         // Initialize Handles
  167.         vcHandle6 = glGenBuffers();
  168.  
  169.         // Bind Buffer
  170.         glBindBufferARB(GL_ARRAY_BUFFER_ARB, vcHandle6);
  171.         glBufferDataARB(GL_ARRAY_BUFFER_ARB, vcBuffer6, GL_STATIC_DRAW_ARB);
  172.         glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);  // Unbind
  173.        
  174.     }
  175.     private static void initVBOInterleaved3Mapped(){
  176.         // No prep?
  177.     }
  178.    
  179.     private static void drawImmediateMode(){
  180.         glBegin(GL_TRIANGLES);
  181.         {
  182.             glColor3f(1, 0, 0);
  183.             glVertex3f(-0.5f, -0.5f, 0.0f);
  184.             glColor3f(0, 1, 0);
  185.             glVertex3f(+0.5f, -0.5f, 0.0f);
  186.             glColor3f(0, 0, 1);
  187.             glVertex3f(+0.5f, +0.5f, 0.0f);
  188.         }
  189.         glEnd();
  190.     }
  191.     private static void drawVertexArrays(){
  192.  
  193.         // Assign pointers
  194.         glVertexPointer(3, /* stride */3 << 2, vBuffer);
  195.         glColorPointer(3, /* stride */3 << 2, cBuffer);
  196.        
  197.         // Draw
  198.         glDrawArrays(GL_TRIANGLES, 0, /* elements */3);
  199.  
  200.     }
  201.     private static void drawVBO(){
  202.  
  203.         // Bind vertexes
  204.         glBindBufferARB(GL_ARRAY_BUFFER_ARB, vHandle3);
  205.         glVertexPointer(3, GL_FLOAT, /* stride */3 << 2, 0L);
  206.  
  207.         // Bind Colors
  208.         glBindBufferARB(GL_ARRAY_BUFFER_ARB, cHandle3);
  209.         glColorPointer(3, GL_FLOAT, /* stride */3 << 2, 0L);
  210.  
  211.         // Draw
  212.         glDrawArrays(GL_TRIANGLES, 0, 3 /* elements */);
  213.        
  214.         //<editor-fold defaultstate="collapsed" desc="Cleanup">
  215.         // Cleanup bound buffers
  216.         glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
  217.         // Cleanup VBO handles
  218.         glDeleteBuffers(vHandle3);
  219.         glDeleteBuffers(cHandle3);
  220.         //</editor-fold>
  221.     }
  222.     private static void drawVBOIndexed(){
  223.  
  224.         // Bind vertexes
  225.         glBindBufferARB(GL_ARRAY_BUFFER_ARB, vHandle4);
  226.         glVertexPointer(3, GL_FLOAT, /* stride */3 << 2, 0L);
  227.  
  228.         // Bind Colors
  229.         glBindBufferARB(GL_ARRAY_BUFFER_ARB, cHandle4);
  230.         glColorPointer(3, GL_FLOAT, /* stride */3 << 2, 0L);
  231.  
  232.         // Bind Indexes
  233.         glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, iHandle4);
  234.         glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, iBuffer, GL_STATIC_DRAW_ARB);
  235.         // Draw
  236.         glDrawElements(GL_TRIANGLES, /* elements */3, GL_UNSIGNED_SHORT, 0L);
  237.  
  238.         //<editor-fold defaultstate="collapsed" desc="Cleanup">
  239.         // Cleanup bound buffers
  240.         glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
  241.         glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
  242.         // Cleanup VBO handles
  243.         glDeleteBuffers(vHandle4);
  244.         glDeleteBuffers(cHandle4);
  245.         glDeleteBuffers(iHandle4);
  246.         //</editor-fold>
  247.     }
  248.     private static void drawVBOInterleaved1(){
  249.         // Interleaved in pattern VCVCVC
  250.        
  251.         // Bind Buffer
  252.         glBindBufferARB(GL_ARRAY_BUFFER_ARB, vcHandle5);
  253.         glBufferDataARB(GL_ARRAY_BUFFER_ARB, vcBuffer5, GL_STATIC_DRAW_ARB);
  254.         glVertexPointer(3, GL_FLOAT, /* stride **/(3 * 2) << 2, /* offset **/0 << 2); // float at index 0
  255.         glColorPointer(3, GL_FLOAT, /* stride **/(3 * 2) << 2, /* offset **/(3*1) << 2); // float at index 3
  256.  
  257.         // Draw
  258.         glDrawArrays(GL_TRIANGLES, 0, 3 /* elements */);
  259.        
  260.         //<editor-fold defaultstate="collapsed" desc="Cleanup">
  261.         // Cleanup bound buffers
  262.         glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
  263.         // Cleanup VBO handles
  264.         glDeleteBuffers(vcHandle5);
  265.         //</editor-fold>
  266.     }
  267.     private static void drawVBOInterleaved2(){
  268.         // Interleaved in pattern VVVCCC
  269.        
  270.         // Bind Buffer
  271.         glBindBufferARB(GL_ARRAY_BUFFER_ARB, vcHandle6);
  272.         glVertexPointer(3, GL_FLOAT, /* stride **/(3 * 1) << 2, /* offset */0 << 2); // float at index 0
  273.         glColorPointer(3, GL_FLOAT, /* stride **/(3 * 1) << 2, /* offset */(3 * 3) << 2); // float at index 9
  274.  
  275.         // Draw
  276.         glDrawArrays(GL_TRIANGLES, 0, 3 /* elements */);
  277.  
  278.         //<editor-fold defaultstate="collapsed" desc="Cleanup">
  279.         // Cleanup bound buffers
  280.         glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
  281.         // Cleanup VBO handles
  282.         glDeleteBuffers(vcHandle6);
  283.         //</editor-fold>
  284.     }
  285.     private static void drawVBOInterleaved3Mapped(){
  286.        
  287.         // Initialize Handles
  288.         vcHandle7 = glGenBuffers();
  289.  
  290.         // Bind Buffer
  291.         glBindBufferARB(GL_ARRAY_BUFFER_ARB, vcHandle7);
  292.         glBufferDataARB(GL_ARRAY_BUFFER_ARB, (9 + 9) << 2, GL_STATIC_DRAW_ARB);
  293.  
  294.         // Map Buffer?
  295.         {
  296.             ByteBuffer dataBuffer = glMapBufferARB(GL_ARRAY_BUFFER_ARB, ARBBufferObject.GL_WRITE_ONLY_ARB, (9 + 9) << 2, null);
  297.  
  298.             // create geometry buffer (both vertex and color)
  299.             vcBuffer7 = dataBuffer.order(ByteOrder.nativeOrder()).asFloatBuffer();
  300.  
  301.             vcBuffer7.put(-0.5f).put(-0.5f).put(0.0f); // v
  302.             vcBuffer7.put(1).put(0).put(0); // c
  303.  
  304.             vcBuffer7.put(+0.5f).put(-0.5f).put(0.0f); // v
  305.             vcBuffer7.put(0).put(1).put(0); // c
  306.  
  307.             vcBuffer7.put(+0.5f).put(+0.5f).put(0.0f); // v
  308.             vcBuffer7.put(0).put(0).put(1); // c
  309.  
  310.             vcBuffer7.flip();        
  311.  
  312.             glUnmapBufferARB(GL_ARRAY_BUFFER_ARB);
  313.         }
  314.  
  315.         // Initialize Pointers
  316.         glVertexPointer(3, GL_FLOAT, /* stride */(3 * 2) << 2, /* offset */0L << 2); // float at index 0
  317.         glColorPointer(3, GL_FLOAT, /* stride */(3 * 2) << 2, /* offset */(3 * 1) << 2); // float at index 3
  318.  
  319.         // Draw
  320.         glDrawArrays(GL_TRIANGLES, 0, 3 /* elements */);
  321.  
  322.         //<editor-fold defaultstate="collapsed" desc="Cleanup">
  323.         // Cleanup bound buffers
  324.         glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
  325.         // Cleanup VBO handles
  326.         glDeleteBuffers(vcHandle7);
  327.         //</editor-fold>
  328.     }
  329.     //</editor-fold>
Advertisement
Add Comment
Please, Sign In to add comment