有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java渲染高度图,GLD元素问题

我正在开发这个课程,我希望最终能用它来绘制地形图。当前代码如下所示:

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函数,或者至少在地形函数之后,我可以通过绘制距离函数来控制它们的长度

更新: 我根据给出的答案(谢谢你)更改代码:

@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) 个答案

  1. # 1 楼答案

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

    像这样的方法应该有用:

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