glDrawElements无法绘制

时间:2013-12-13 13:02:19

标签: opengl drawing game-engine lwjgl

我正在研究最终将成为地形抽屉的东西,但是目前我只是试图用glDrawElements绘制一对基本的三角形。代码如下:

公共类TerrainFlat扩展了AbstractTerrain {

IntBuffer ib = BufferUtils.createIntBuffer(3);

 int vHandle = ib.get(0);
 int cHandle = ib.get(1);
 int iHandle = ib.get(2);

FloatBuffer vBuffer = BufferUtils.createFloatBuffer(19);
FloatBuffer cBuffer = BufferUtils.createFloatBuffer(18);
ShortBuffer iBuffer = BufferUtils.createShortBuffer(6);


@Override
public void initilize(){


    float[] vertexData = {50, 20, 100,      50, -20, 100,      10, -20, 100,             -10, -20, 100,     -50, -20, 100,     -50, 20, 100};
    float[] colorData = {1, 0, 0, 0, 1, 0, 0, 0, 1,  0 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 0 };
    short[] indexData = {0,1,2,3,4,5};

    vBuffer.put(vertexData);
    vBuffer.flip();


    cBuffer.put(colorData);
    cBuffer.flip();


    iBuffer.put(indexData);
    iBuffer.flip();

  glEnableClientState(GL_VERTEX_ARRAY);
  glEnableClientState(GL_COLOR_ARRAY);

  glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, iHandle);
  glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, iBuffer, GL_STATIC_DRAW_ARB);
  glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);

  glBindBufferARB(GL_ARRAY_BUFFER_ARB, vHandle);
  glBufferDataARB(GL_ARRAY_BUFFER_ARB, vBuffer, GL_STATIC_DRAW_ARB);
  glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);


  glBindBufferARB(GL_ARRAY_BUFFER_ARB, cHandle);
  glBufferDataARB(GL_ARRAY_BUFFER_ARB, cBuffer, GL_STATIC_DRAW_ARB);
  glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);






}

@Override
public void setUp(float posX, float posY, float posZ){



}

@Override
public void draw(){

                   glClear(GL_COLOR_BUFFER_BIT);

  glGenBuffersARB(ib);
  vHandle = ib.get(0);
  cHandle = ib.get(1);
  iHandle = ib.get(2);

  glEnableClientState(GL_VERTEX_ARRAY);
  glEnableClientState(GL_COLOR_ARRAY);

  glBindBufferARB(GL_ARRAY_BUFFER_ARB, vHandle);
  glVertexPointer(3, GL_FLOAT,  3 << 2 , 0L);
  glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);

  glBindBufferARB(GL_ARRAY_BUFFER_ARB, cHandle);
  glColorPointer(3, GL_FLOAT,  3 << 2  , 0L);
  glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);

  glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, iHandle);

  glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0L);

  glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
  glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);


}

@Override
public void destroy(){
    ib.put(0, vHandle);
  ib.put(1, cHandle);
  ib.put(2, iHandle);
  glDeleteBuffersARB(ib);
} 



}

这不会画任何东西,屏幕完全是黑色的。 GL_CULL_FACE未启用,并且没有灯光(或缺少灯光)导致此错误。将数据绑定移动到Draw()函数中可以使其工作(如果您希望我可以将该代码添加到此)。然而,这意味着我创建了缓冲区的每个绘制函数(即:坏)。我完全想知道我在这里做错了什么,因为我已经把它移动了,并且愚蠢地拍了4天。

1 个答案:

答案 0 :(得分:1)

您将cHandler,cHandler和Handle设置为0。

无论如何,您永远不需要在第1行创建IntBuffer。取代

 int vHandle = ib.get(0);
 int cHandle = ib.get(1);
 int iHandle = ib.get(2);

 int vHandle = glGenBuffers();
 int cHandle = glGenBuffers();
 int iHandle = glGenBuffers();