渲染高度图,glDrawElements问题

时间:2013-12-09 13:29:12

标签: java opengl lwjgl vbo terrain

我正在开发这个我正在开发的课程,我希望最终用它来绘制地形图。代码目前看起来像这样:

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


TerrainFlat(float x,float y,float z, float[] input /* here is where I want to put my draw distance stuff*/){

    this.Map = input;

    this.x=x;
    this.y=y;
    this.z=z;


}

@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();


}



@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);
  glBufferDataARB(GL_ARRAY_BUFFER_ARB, vBuffer, GL_STATIC_DRAW_ARB);
  glVertexPointer(3, GL_FLOAT, /* stride */3 << 2, 0L);

  glBindBufferARB(GL_ARRAY_BUFFER_ARB, cHandle);
  glBufferDataARB(GL_ARRAY_BUFFER_ARB, cBuffer, GL_STATIC_DRAW_ARB);
  glColorPointer(3, GL_FLOAT, /* stride */3 << 2, 0L);

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

  glDrawElements(GL_TRIANGLES, /* elements */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);
} 

现在我想知道我是否可以在initilize函数中绑定我的数据,而不是Draw函数,以便移动声明:

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

进入initilize函数,或者至少在terrain函数之后,我可以通过绘图距离函数控制它们的长度。

更新: 我根据给出的答案(谢谢顺便说一句)改变我的代码:

@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();

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


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


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



}

@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, /* stride */3 << 2, 0L);

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

  glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, iHandle);

  glDrawElements(GL_TRIANGLES, /* elements */6, GL_UNSIGNED_SHORT, 0L);

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


} 

这会执行但无法绘制任何内容,我也没有启用FACE_CULL。

1 个答案:

答案 0 :(得分:0)

您需要在绘制之前绑定缓冲区(除了您总是绘制相同的缓冲区),但您可以将glBufferData调用移动到初始化函数。

这样的事情应该有效:

public void initilize() {
   ...
   // set data for vHandle
   glBindBufferARB(GL_ARRAY_BUFFER_ARB, vHandle);
   glBufferDataARB(GL_ARRAY_BUFFER_ARB, vBuffer, GL_STATIC_DRAW_ARB);
   glVertexPointer(3, GL_FLOAT, /* stride */3 << 2, 0L);

   // ... setup other handles
   ...
}


public void draw() {
   ...
   glBindBufferARB(GL_ARRAY_BUFFER_ARB, vHandle);

   // ... bind other buffers

   glDrawElements(GL_TRIANGLES, /* elements */6, GL_UNSIGNED_SHORT, 0L);
   ...
}