Простой класс vao для lwjgl
- public class Mesh {
- private int vao;
- private int vertexCount;
- private int attributeIndex = 0;
- private boolean hasIndices = false;
- private static List<Integer> vaos = new ArrayList<>();
- private static List<Integer> vbos = new ArrayList<>();
- private FloatBuffer fbuffer;
- private IntBuffer ibuffer;
- public Mesh getRectangle(int width, int height) {
- float[] positions = { 0, 0, 0, height, width, height, width, 0 };
- float[] texCoords = { 0, 1, 0, 0, 1, 0, 1, 1 };
- int[] indices = { 2, 1, 0, 0, 3, 2 };
- bind();
- {
- storeIndices(indices);
- storeData(2, positions);
- storeData(2, texCoords);
- }
- unbind();
- return this;
- }
- public void bind() {
- vao = glGenVertexArrays();
- vaos.add(vao);
- glBindVertexArray(vao);
- }
- public void storeIndices(int[] data) {
- int vbo = glGenBuffers();
- vbos.add(vbo);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo);
- ibuffer = BufferUtils.createIntBuffer(data.length);
- ibuffer.put(data);
- ibuffer.flip();
- glBufferData(GL_ELEMENT_ARRAY_BUFFER, ibuffer, GL_STATIC_DRAW);
- vertexCount = data.length;
- hasIndices = true;
- }
- public void storeData(int size, float[] data) {
- int vbo = glGenBuffers();
- vbos.add(vbo);
- glBindBuffer(GL_ARRAY_BUFFER, vbo);
- fbuffer = BufferUtils.createFloatBuffer(data.length);
- fbuffer.put(data);
- fbuffer.flip();
- glBufferData(GL_ARRAY_BUFFER, fbuffer, GL_STATIC_DRAW);
- glVertexAttribPointer(attributeIndex++, size, GL_FLOAT, false, 0, 0);
- glBindBuffer(GL_ARRAY_BUFFER, 0);
- if (!hasIndices)
- vertexCount = data.length / size;
- }
- public void unbind() {
- glBindVertexArray(0);
- }
- public void begin() {
- glBindVertexArray(vao);
- for (int i = 0; i < attributeIndex; i++)
- glEnableVertexAttribArray(i);
- }
- public void render() {
- if (hasIndices)
- glDrawElements(GL_TRIANGLES, vertexCount, GL_UNSIGNED_INT, 0);
- else
- glDrawArrays(GL_TRIANGLES, 0, vertexCount);
- }
- public void end() {
- for (int i = 0; i < attributeIndex; i++)
- glDisableVertexAttribArray(i);
- glBindVertexArray(0);
- }
- public static void dispose() {
- for (int vao: vaos) {
- glDeleteVertexArrays(vao);
- }
- for (int vbo: vbos) {
- glDeleteBuffers(vbo);
- }
- }
- }
Простой класс упаковки данных в vao
Как пользоваться:
создаёшь объект класса, дальше вызываешь метод bind и после него storeIndices (не обязательно) и storeData. После закрываешь методом unbind.
Для отрисовки вызываешь методы begin, дальше render, затем end.
Статичный метод dispose для выгрузки ресурсов.
Как пользоваться:
создаёшь объект класса, дальше вызываешь метод bind и после него storeIndices (не обязательно) и storeData. После закрываешь методом unbind.
Для отрисовки вызываешь методы begin, дальше render, затем end.
Статичный метод dispose для выгрузки ресурсов.