/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package tests.gl_330; import com.jogamp.opengl.GL; import static com.jogamp.opengl.GL2ES3.*; import com.jogamp.opengl.GL3; import com.jogamp.opengl.util.GLBuffers; import com.jogamp.opengl.util.glsl.ShaderCode; import com.jogamp.opengl.util.glsl.ShaderProgram; import framework.BufferUtils; import glm.glm; import glm.mat._4.Mat4; import framework.Profile; import framework.Semantic; import framework.Test; import java.nio.FloatBuffer; import glm.vec._2.Vec2; import glm.vec._4.Vec4; import java.nio.IntBuffer; /** * * @author GBarbieri */ public class Gl_330_draw_instanced_array extends Test { public static void main(String[] args) { Gl_330_draw_instanced_array gl_330_draw_instanced_array = new Gl_330_draw_instanced_array(); } public Gl_330_draw_instanced_array() { super("gl-330-draw-instanced-array", Profile.CORE, 3, 3, new Vec2(Math.PI * 0.2f)); } private final String SHADERS_SOURCE = "instanced-array"; private final String SHADERS_ROOT = "src/data/gl_330"; private int vertexCount = 6; private int positionSize = vertexCount * Vec2.SIZE; private float[] positionData = { -1.0f, -1.0f, +1.0f, -1.0f, +1.0f, +1.0f, +1.0f, +1.0f, -1.0f, +1.0f, -1.0f, -1.0f}; private int instanceCount = 5; private int colorSize = vertexCount * Vec4.SIZE; private float[] colorData = { 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.5f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f}; private class Buffer { public static final int POSITION = 0; public static final int COLOR = 1; public static final int MAX = 2; } private IntBuffer bufferName = GLBuffers.newDirectIntBuffer(Buffer.MAX), vertexArrayName = GLBuffers.newDirectIntBuffer(1); private int programName, uniformMvp; @Override protected boolean begin(GL gl) { GL3 gl3 = (GL3) gl; boolean validated = true; if (validated) { validated = initTest(gl3); } if (validated) { validated = initProgram(gl3); } if (validated) { validated = initBuffer(gl3); } if (validated) { validated = initVertexArray(gl3); } return validated && checkError(gl3, "begin"); } private boolean initTest(GL3 gl3) { boolean validated = true; gl3.glEnable(GL_DEPTH_TEST); return validated && checkError(gl3, "initTest"); } private boolean initProgram(GL3 gl3) { boolean validated = true; if (validated) { ShaderCode vertShaderCode = ShaderCode.create(gl3, GL_VERTEX_SHADER, this.getClass(), SHADERS_ROOT, null, SHADERS_SOURCE, "vert", null, true); ShaderCode fragShaderCode = ShaderCode.create(gl3, GL_FRAGMENT_SHADER, this.getClass(), SHADERS_ROOT, null, SHADERS_SOURCE, "frag", null, true); ShaderProgram shaderProgram = new ShaderProgram(); shaderProgram.add(vertShaderCode); shaderProgram.add(fragShaderCode); shaderProgram.init(gl3); programName = shaderProgram.program(); shaderProgram.link(gl3, System.out); } // Get variables locations if (validated) { uniformMvp = gl3.glGetUniformLocation(programName, "mvp"); } return validated & checkError(gl3, "initProgram"); } private boolean initBuffer(GL3 gl3) { FloatBuffer positionBuffer = GLBuffers.newDirectFloatBuffer(positionData); FloatBuffer colorBuffer = GLBuffers.newDirectFloatBuffer(colorData); gl3.glGenBuffers(Buffer.MAX, bufferName); gl3.glBindBuffer(GL_ARRAY_BUFFER, bufferName.get(Buffer.POSITION)); gl3.glBufferData(GL_ARRAY_BUFFER, positionSize, positionBuffer, GL_STATIC_DRAW); gl3.glBindBuffer(GL_ARRAY_BUFFER, 0); gl3.glBindBuffer(GL_ARRAY_BUFFER, bufferName.get(Buffer.COLOR)); gl3.glBufferData(GL_ARRAY_BUFFER, colorSize, colorBuffer, GL_STATIC_DRAW); gl3.glBindBuffer(GL_ARRAY_BUFFER, 0); BufferUtils.destroyDirectBuffer(positionBuffer); BufferUtils.destroyDirectBuffer(colorBuffer); return checkError(gl3, "initBuffer"); } private boolean initVertexArray(GL3 gl3) { gl3.glGenVertexArrays(1, vertexArrayName); gl3.glBindVertexArray(vertexArrayName.get(0)); { gl3.glBindBuffer(GL_ARRAY_BUFFER, bufferName.get(Buffer.POSITION)); gl3.glVertexAttribPointer(Semantic.Attr.POSITION, 2, GL_FLOAT, false, 0, 0); gl3.glVertexAttribDivisor(Semantic.Attr.POSITION, 0); gl3.glBindBuffer(GL_ARRAY_BUFFER, bufferName.get(Buffer.COLOR)); gl3.glVertexAttribPointer(Semantic.Attr.COLOR, 4, GL_FLOAT, false, 0, 0); gl3.glVertexAttribDivisor(Semantic.Attr.COLOR, 2); gl3.glBindBuffer(GL_ARRAY_BUFFER, 0); gl3.glEnableVertexAttribArray(Semantic.Attr.POSITION); gl3.glEnableVertexAttribArray(Semantic.Attr.COLOR); } gl3.glBindVertexArray(0); return checkError(gl3, "initVertexArray"); } @Override protected boolean render(GL gl) { GL3 gl3 = (GL3) gl; Mat4 projection = glm.perspective_((float) Math.PI * 0.25f, 4.0f / 3.0f, 0.1f, 100.0f); Mat4 model = new Mat4(1.0f); Mat4 mvp = projection.mul(viewMat4()).mul(model); gl3.glViewport(0, 0, windowSize.x, windowSize.y); float[] depth = {1.0f}; gl3.glClearBufferfv(GL_DEPTH, 0, depth, 0); gl3.glClearBufferfv(GL_COLOR, 0, clearColor.put(0, 0).put(1, 0).put(2, 0).put(3, 1)); gl3.glUseProgram(programName); gl3.glUniformMatrix4fv(uniformMvp, 1, false, mvp.toFa_(), 0); gl3.glBindVertexArray(vertexArrayName.get(0)); gl3.glDrawArraysInstanced(GL_TRIANGLES, 0, vertexCount, 10); return true; } @Override protected boolean end(GL gl) { GL3 gl3 = (GL3) gl; gl3.glDeleteBuffers(bufferName.capacity(), bufferName); gl3.glDeleteProgram(programName); gl3.glDeleteVertexArrays(1, vertexArrayName); BufferUtils.destroyDirectBuffer(bufferName); BufferUtils.destroyDirectBuffer(vertexArrayName); return checkError(gl3, "end"); } }