Java OpenGL Vertex Buffer Objects not working
I tried to implement Open GLs Vertex Buffer Objects the first time, and all i get is a black screen.
I tried it with glOrtho instead of glPerspective, but it didnt work as well.
thanks for helping
Heres my code:
public class VBufferTest {
public static final int WIN_WIDTH = 640;
public static final int WIN_HEIGHT = 480;
public int vBufferId;
public static void main(String args[]){
VBufferTest foo = new VBufferTest();
foo.initLWJGLFrame();
foo.initBuffer();
while (!Display.isCloseRequested()){
foo.render();
}
}
public void initLWJGLFrame(){
try {
DisplayMode[] possible = Display.getAvailableDisplayModes();
DisplayMode chosen = null;
for (int i = 0; i < possible.length; i += 1){
if (possible[i].getWidth() == WIN_WIDTH && possible[i].getHeight() == WIN_HEIGHT){
chosen = possible[i];
break;
}
开发者_如何学编程 }
if (chosen != null){
Display.setDisplayMode(chosen);
Display.setTitle("TestFrame1");
Display.create();
}
else {
throw new LWJGLException("Couldn't find the appropriate display mode.");
}
}
catch (LWJGLException e){
}
}
public void initGL(){
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY);
GL11.glEnableClientState(GL11.GL_TEXTURE_COORD_ARRAY);
GL11.glClearColor(104.f/255.0f, 136.0f/255.0f, 252.0f/255.0f, 1.0f);
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GLU.gluPerspective(50.0f, Display.getDisplayMode().getWidth()/Display.getDisplayMode().getHeight(), 0.5f, 1000.0f);
GL11.glViewport(0, 0, Display.getDisplayMode().getWidth(), Display.getDisplayMode().getHeight());
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glLoadIdentity();
}
public void initBuffer(){
FloatBuffer vertices = BufferUtils.createFloatBuffer(4*3);
vBufferId = genNewId();
vertices.put(new float[]{-1.0f, -1.0f, 0.0f});
vertices.put(new float[]{1.0f, -1.0f, 0.0f});
vertices.put(new float[]{1.0f, 1.0f, 0.0f});
vertices.put(new float[]{-1.0f, 1.0f, 0.0f});
vertices.flip();
bufferData(vBufferId, vertices);
}
public void render(){
GL11.glColor3f(1.0f, 0.0f, 1.0f);
ARBVertexBufferObject.glBindBufferARB(ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, this.vBufferId);
GL11.glVertexPointer(3, GL11.GL_FLOAT, 0, 0);
GL11.glDrawArrays(GL11.GL_QUADS, 0, 4);
Display.update();
}
public static int genNewId(){
IntBuffer buffer = BufferUtils.createIntBuffer(1);
ARBVertexBufferObject.glGenBuffersARB(buffer);
return buffer.get(0);
}
public static void bufferData(int id, FloatBuffer buffer){
ARBVertexBufferObject.glBindBufferARB(ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, id);
ARBVertexBufferObject.glBufferDataARB(ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, buffer, ARBVertexBufferObject.GL_STATIC_DRAW_ARB);
}
}
You have depth-testing enabled, but you don't clear the z-buffer once per frame using glClear
(at the beginning of your render
method). Same for clearing the color buffer.
EDIT: Also, initGl()
seems to be never called?
精彩评论