Pregunta

I've got this class which I'm developing which I hope to eventually use to draw a terrain map. The code currently looks like this:

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

Now I'm wondering if I can bind my data in the initilize function, instead of the Draw function, in order to move the declarations:

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

into the initilize function, or at the very least after the terrain functions so I can control their lengths via a draw distance function.

UPDATE: I change my code based on the answer given (thank you btw) to this:

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


} 

This executes but fails to draw anything, I do not have FACE_CULL enabled either.

¿Fue útil?

Solución

You need to bind the buffers before drawing (except you are always drawing the same buffers) but you can move the glBufferData calls to your initialize function.

Something like this should work:

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);
   ...
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top