1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| public class TestModel implements Model { int vertexBufferID; FloatBuffer vertices = BufferUtils.createFloatBuffer(3 * 24).put(new float[] {1,1,1, -1,1,1, -1,-1,1, 1,-1,1, 1,1,1, 1,-1,1, 1,-1,-1, 1,1,-1, 1,1,1, 1,1,-1, -1,1,-1, -1,1,1, -1,1,1, -1,1,-1, -1,-1,-1, -1,-1,1, -1,-1,-1, 1,-1,-1, 1,-1,1, -1,-1,1, 1,-1,-1, -1,-1,-1, -1,1,-1, 1,1,-1}); FloatBuffer normals = BufferUtils.createFloatBuffer(3 * 24).put(new float[] {0,0,1, 0,0,1, 0,0,1, 0,0,1, 1,0,0, 1,0,0, 1,0,0, 1,0,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, -1,0,0, -1,0,0, -1,0,0, -1,0,0, 0,-1,0, 0,-1,0, 0,-1,0, 0,-1,0, 0,0,-1, 0,0,-1, 0,0,-1, 0,0,-1}); FloatBuffer colors = BufferUtils.createFloatBuffer(3 * 24).put(new float[] {1,1,1, 1,1,0, 1,0,0, 1,0,1, 1,1,1, 1,0,1, 0,0,1, 0,1,1, 1,1,1, 0,1,1, 0,1,0, 1,1,0, 1,1,0, 0,1,0, 0,0,0, 1,0,0, 0,0,0, 0,0,1, 1,0,1, 1,0,0, 0,0,1, 0,0,0, 0,1,0, 0,1,1}); public TestModel() { vertexBufferID = createVBOID(); System.out.println("VBO id: " + vertexBufferID); renderToVbo(); } public static int createVBOID() { if (GLContext.getCapabilities().GL_ARB_vertex_buffer_object) { IntBuffer buffer = BufferUtils.createIntBuffer(1); ARBVertexBufferObject.glGenBuffersARB(buffer); return buffer.get(0); } return 0; }
public int sizeof(FloatBuffer fb) { return fb.capacity(); } public void renderToVbo() { ARBVertexBufferObject.glBindBufferARB(ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, vertexBufferID); ARBVertexBufferObject.glBufferDataARB(ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, sizeof(vertices)+sizeof(normals)+sizeof(colors), ARBVertexBufferObject.GL_STATIC_DRAW_ARB); ARBVertexBufferObject.glBufferSubDataARB(ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, 0, vertices); ARBVertexBufferObject.glBufferSubDataARB(ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, sizeof(vertices), normals); ARBVertexBufferObject.glBufferSubDataARB(ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, sizeof(vertices)+sizeof(normals), colors); }
@Override public void render() {
ARBVertexBufferObject.glBindBufferARB(ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, vertexBufferID);
GL11.glEnableClientState(GL11.GL_NORMAL_ARRAY); GL11.glEnableClientState(GL11.GL_COLOR_ARRAY); GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY);
GL11.glNormalPointer(GL11.GL_FLOAT, 0, sizeof(vertices)); GL11.glColorPointer(3, GL11.GL_FLOAT, 0, (sizeof(vertices)+sizeof(normals))); GL11.glVertexPointer(3, GL11.GL_FLOAT, 0, 0);
GL11.glDrawArrays(GL11.GL_QUADS, 0, 24); GL11.glDisableClientState(GL11.GL_VERTEX_ARRAY); GL11.glDisableClientState(GL11.GL_COLOR_ARRAY); GL11.glDisableClientState(GL11.GL_NORMAL_ARRAY);
ARBVertexBufferObject.glBindBufferARB(ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, 0);
}
} |