public QuadShader(GLContext ctx) { super(ctx); int maxVecs = usableMaxUniformVectors(ctx) - extraVec4s(); if (maxVecs < vec4sPerQuad()) throw new RuntimeException( "GL_MAX_VERTEX_UNIFORM_VECTORS too low: have " + maxVecs + ", need at least " + vec4sPerQuad()); maxQuads = maxVecs / vec4sPerQuad(); }
/** * Returns the vertex shader program. Note that this program <em>must</em> preserve the use of * the existing attributes and uniforms. You can add new uniforms and attributes, but you cannot * remove or change the defaults. */ protected String vertexShader() { return baseVertexShader().replace("_MAX_QUADS_", ""+maxQuads). replace("_VEC4S_PER_QUAD_", ""+vec4sPerQuad()); }
@Override public void flush() { super.flush(); if (quadCounter == 0) return; uData.bind(data, quadCounter * vec4sPerQuad()); elements.drawElements(GL20.GL_TRIANGLES, ELEMENTS_PER_QUAD*quadCounter); quadCounter = 0; }
public QuadCore(String vertShader, String fragShader) { super(vertShader, fragShader); // compile the shader and get our uniform and attribute uScreenSize = prog.getUniform2f("u_ScreenSize"); uData = prog.getUniform4fv("u_Data"); aVertex = prog.getAttrib("a_Vertex", VERTEX_SIZE, GL20.GL_SHORT); // create our stock supply of unit quads and stuff them into our buffers vertices = ctx.createShortBuffer(maxQuads*VERTICES_PER_QUAD*VERTEX_SIZE); elements = ctx.createShortBuffer(maxQuads*ELEMENTS_PER_QUAD); for (int ii = 0; ii < maxQuads; ii++) { vertices.add(0, 0).add(ii); vertices.add(1, 0).add(ii); vertices.add(0, 1).add(ii); vertices.add(1, 1).add(ii); int base = ii * VERTICES_PER_QUAD; elements.add(base+0).add(base+1).add(base+2); elements.add(base+1).add(base+3).add(base+2); } // create the buffer that will hold quad data, and the float array that we'll use to avoid // making too many calls to FloatBuffer.put() which has crap performance on Android data = ctx.createFloatBuffer(maxQuads*vec4sPerQuad()*4); vertices.bind(GL20.GL_ARRAY_BUFFER); vertices.send(GL20.GL_ARRAY_BUFFER, GL20.GL_STATIC_DRAW); elements.bind(GL20.GL_ELEMENT_ARRAY_BUFFER); elements.send(GL20.GL_ELEMENT_ARRAY_BUFFER, GL20.GL_STATIC_DRAW); }