代码之家  ›  专栏  ›  技术社区  ›  Simiil

JavaOpenGL顶点缓冲对象不工作

  •  2
  • Simiil  · 技术社区  · 15 年前

    我第一次尝试实现开放的GLS顶点缓冲对象,得到的只是一个黑屏。

    我试着用格洛斯托而不是格尔透视,但效果不太好。

    谢谢你的帮助

    我的代码:

    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);
        }
    }
    
    1 回复  |  直到 15 年前
        1
  •  1
  •   Alexander Gessler    15 年前

    您启用了深度测试,但在每帧使用 glClear (在您的 render 方法)。同样用于清除颜色缓冲区。

    编辑: initGl() 好像从来没打过电话?