rdeterre

LWJGL - Multiple VAOs issue

Oct 10th, 2013
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.31 KB | None | 0 0
  1. import java.io.File;
  2. import java.io.FileNotFoundException;
  3. import java.nio.FloatBuffer;
  4. import java.util.Scanner;
  5.  
  6. import org.lwjgl.BufferUtils;
  7. import org.lwjgl.LWJGLException;
  8. import org.lwjgl.opengl.Display;
  9. import org.lwjgl.opengl.DisplayMode;
  10.  
  11. import static org.lwjgl.opengl.GL11.*;
  12. import static org.lwjgl.opengl.GL15.*;
  13. import static org.lwjgl.opengl.GL20.*;
  14. import static org.lwjgl.opengl.GL30.*;
  15.  
  16. public class MainDisplay {
  17.     public void start() {
  18.         try {
  19.             Display.setDisplayMode(new DisplayMode(400,300));
  20.             Display.create();
  21.         } catch (LWJGLException e) {
  22.             e.printStackTrace();
  23.             System.exit(-1);
  24.         }
  25.        
  26.         float[] triangle = {
  27.                 -.5f, -.5f, 0f,
  28.                 0.5f, -.5f, 0f,
  29.                   0f, 0.5f, 0f
  30.         };
  31.        
  32.         float[] square = {
  33.                 -.4f, -.4f, 0f,
  34.                 0.4f, -.4f, 0f,
  35.                 0.4f, 0.4f, 0f,
  36.                 -.4f, 0.4f, 0f
  37.         };
  38.        
  39.         String[] attributes = {"position"};
  40.         int shaderProgram = createShaderProgram("res/simple.vert",
  41.                 "res/simple.frag",
  42.                 attributes);
  43.        
  44.         int tVao = glGenBuffers();
  45.         int sVao = glGenBuffers();
  46.        
  47.         glBindVertexArray(tVao);
  48.         int tVbo = glGenBuffers();
  49.         glBindBuffer(GL_ARRAY_BUFFER, tVbo);
  50.         FloatBuffer tBuffer = (FloatBuffer) BufferUtils
  51.                 .createFloatBuffer(triangle.length)
  52.                 .put(triangle)
  53.                 .flip();
  54.         glBufferData(GL_ARRAY_BUFFER, tBuffer, GL_STATIC_DRAW);
  55.         glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
  56.         glEnableVertexAttribArray(0);
  57.         glBindVertexArray(sVao);
  58.         int sVbo = glGenBuffers();
  59.         glBindBuffer(GL_ARRAY_BUFFER, sVbo);
  60.         FloatBuffer sBuffer = (FloatBuffer) BufferUtils
  61.                 .createFloatBuffer(square.length)
  62.                 .put(square)
  63.                 .flip();
  64.         glBufferData(GL_ARRAY_BUFFER, sBuffer, GL_STATIC_DRAW);
  65.         glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
  66.         glEnableVertexAttribArray(0);
  67.         glBindVertexArray(0);
  68.        
  69.        
  70.        
  71.         while (!Display.isCloseRequested()) {
  72.             glClearColor(0.0f,0f,0f,1f);
  73.             glClear(GL_COLOR_BUFFER_BIT);
  74.             glUseProgram(shaderProgram);
  75.             glBindVertexArray(tVao);
  76.             glBindBuffer(GL_ARRAY_BUFFER, tVbo);
  77.             glBindVertexArray(sVao);
  78.             glDrawArrays(GL_QUADS, 0, 4);
  79.             glBindVertexArray(0);
  80.             glUseProgram(0);
  81.             Display.update();
  82.         }
  83.        
  84.         Display.destroy();
  85.     }
  86.    
  87.     public static void main(String[] args) {
  88.         MainDisplay display = new MainDisplay();
  89.         display.start();
  90.     }
  91.    
  92.     public static int createShaderProgram(String vertex,
  93.             String fragment,
  94.             String[] attributes) {
  95.         int vertexShader = glCreateShader(GL_VERTEX_SHADER);
  96.         String s = null;
  97.         String f = null;
  98.         try {
  99.             s = new Scanner(new File(vertex)).useDelimiter("\\Z").next();
  100.             f = new Scanner(new File(fragment)).useDelimiter("\\Z").next();
  101.         } catch (FileNotFoundException e) {
  102.             // TODO Auto-generated catch block
  103.             e.printStackTrace();
  104.         }
  105.         glShaderSource(vertexShader, s);
  106.         glCompileShader(vertexShader);
  107.        
  108.         // Error check
  109.         if (glGetShaderi(vertexShader, GL_COMPILE_STATUS) == GL_FALSE) {
  110.             System.err.print("Failure in compiling vertex shader. Error log :\n"
  111.                     + glGetShaderInfoLog(vertexShader,
  112.                             glGetShaderi(vertexShader, GL_INFO_LOG_LENGTH)));
  113.             System.exit(1);
  114.         }
  115.        
  116.         int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
  117.         glShaderSource(fragmentShader, f);
  118.         glCompileShader(fragmentShader);
  119.        
  120.         // Error check
  121.         if (glGetShaderi(fragmentShader, GL_COMPILE_STATUS) == GL_FALSE) {
  122.             System.err.print("Failure in compiling fragment shader. Error log :\n"
  123.                     + glGetShaderInfoLog(fragmentShader,
  124.                             glGetShaderi(fragmentShader, GL_INFO_LOG_LENGTH)));
  125.             System.exit(1);
  126.         }
  127.        
  128.         int shaderProgram = glCreateProgram();
  129.         glAttachShader(shaderProgram, vertexShader);
  130.         glAttachShader(shaderProgram, fragmentShader);
  131.        
  132.         // Vertex attributes to shader mapping
  133.         for (int i = 0; i < attributes.length; i++) {
  134.             glBindAttribLocation(shaderProgram, i, attributes[i]);
  135.         }
  136.        
  137.         glLinkProgram(shaderProgram);
  138.        
  139.         // Error check
  140.         if (glGetProgrami(shaderProgram, GL_LINK_STATUS) == GL_FALSE) {
  141.             System.err.println("Failure in linking program. Error log:\n"
  142.                     + glGetProgramInfoLog(shaderProgram,
  143.                             glGetProgrami(shaderProgram, GL_INFO_LOG_LENGTH)));
  144.             System.exit(1);
  145.         }
  146.        
  147.         glDetachShader(shaderProgram, vertexShader);
  148.         glDetachShader(shaderProgram, fragmentShader);
  149.         glDeleteShader(vertexShader);
  150.         glDeleteShader(fragmentShader);
  151.        
  152.         return shaderProgram;
  153.     }
  154. }
Advertisement
Add Comment
Please, Sign In to add comment