Простой класс vao для lwjgl

  1. public class Mesh {
  2.  
  3.     private int vao;
  4.     private int vertexCount;
  5.     private int attributeIndex = 0;
  6.     private boolean hasIndices = false;
  7.     private static List<Integer> vaos = new ArrayList<>();
  8.     private static List<Integer> vbos = new ArrayList<>();
  9.     private FloatBuffer fbuffer;
  10.     private IntBuffer ibuffer;
  11.  
  12.  
  13.     public Mesh getRectangle(int width, int height) {
  14.         float[] positions = { 0, 0, 0, height, width, height, width, 0 };
  15.         float[] texCoords = { 0, 1, 0, 0, 1, 0, 1, 1 };
  16.         int[] indices = { 2, 1, 0, 0, 3, 2 };
  17.  
  18.         bind();
  19.         {
  20.             storeIndices(indices);
  21.             storeData(2, positions);
  22.             storeData(2, texCoords);
  23.         }
  24.         unbind();
  25.  
  26.         return this;
  27.     }
  28.  
  29.     public void bind() {
  30.         vao = glGenVertexArrays();
  31.         vaos.add(vao);
  32.         glBindVertexArray(vao);
  33.     }
  34.  
  35.     public void storeIndices(int[] data) {
  36.         int vbo = glGenBuffers();
  37.         vbos.add(vbo);
  38.         glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo);
  39.         ibuffer = BufferUtils.createIntBuffer(data.length);
  40.         ibuffer.put(data);
  41.         ibuffer.flip();
  42.         glBufferData(GL_ELEMENT_ARRAY_BUFFER, ibuffer, GL_STATIC_DRAW);
  43.         vertexCount = data.length;
  44.         hasIndices = true;
  45.     }
  46.  
  47.     public void storeData(int size, float[] data) {
  48.         int vbo = glGenBuffers();
  49.         vbos.add(vbo);
  50.         glBindBuffer(GL_ARRAY_BUFFER, vbo);
  51.         fbuffer = BufferUtils.createFloatBuffer(data.length);
  52.         fbuffer.put(data);
  53.         fbuffer.flip();
  54.         glBufferData(GL_ARRAY_BUFFER, fbuffer, GL_STATIC_DRAW);
  55.         glVertexAttribPointer(attributeIndex++, size, GL_FLOAT, false, 0, 0);
  56.         glBindBuffer(GL_ARRAY_BUFFER, 0);
  57.         if (!hasIndices)
  58.             vertexCount = data.length / size;
  59.     }
  60.  
  61.     public void unbind() {
  62.         glBindVertexArray(0);
  63.     }
  64.  
  65.     public void begin() {
  66.         glBindVertexArray(vao);
  67.         for (int i = 0; i < attributeIndex; i++)
  68.             glEnableVertexAttribArray(i);
  69.     }
  70.  
  71.     public void render() {
  72.         if (hasIndices)
  73.             glDrawElements(GL_TRIANGLES, vertexCount, GL_UNSIGNED_INT, 0);
  74.         else
  75.             glDrawArrays(GL_TRIANGLES, 0, vertexCount);
  76.     }
  77.  
  78.     public void end() {
  79.         for (int i = 0; i < attributeIndex; i++)
  80.             glDisableVertexAttribArray(i);
  81.         glBindVertexArray(0);
  82.     }
  83.  
  84.     public static void dispose() {
  85.         for (int vao: vaos) {
  86.             glDeleteVertexArrays(vao);
  87.         }
  88.  
  89.         for (int vbo: vbos) {
  90.             glDeleteBuffers(vbo);
  91.         }
  92.     }
  93. }
Простой класс упаковки данных в vao

Как пользоваться:
создаёшь объект класса, дальше вызываешь метод bind и после него storeIndices (не обязательно) и storeData. После закрываешь методом unbind.
Для отрисовки вызываешь методы begin, дальше render, затем end.
Статичный метод dispose для выгрузки ресурсов.

Реклама

Мы в соцсетях

tw tg yt gt