【问题标题】:Java OpenGL Vertex Buffer Objects not workingJava OpenGL顶点缓冲区对象不起作用
【发布时间】:2010-01-17 11:16:19
【问题描述】:

我第一次尝试实现 Open GLs Vertex Buffer Objects,结果只是黑屏。

我尝试使用 glOrtho 而不是 glPerspective,但效果不佳。

感谢您的帮助

这是我的代码:

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);
    }
}

【问题讨论】:

    标签: java opengl buffer vertex


    【解决方案1】:

    您启用了深度测试,但您没有使用 glClear(在您的 render 方法的开头)每帧清除一次 z 缓冲区。清除颜色缓冲区也是如此。

    编辑:另外,initGl() 似乎从未被调用过?

    【讨论】:

    • 这有点令人困惑,为什么我从不调用 initGL()... glClear 帮助了我。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    相关资源
    最近更新 更多