2013-12-13 66 views
-1

我正在研究什么最终会成为地形抽屉,但目前我只是试图获得一对基本的三角形来绘制glDrawElements。代码如下这样: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天。

+0

我敢肯定你不应该产生新的维也纳组织每次绘制时间。如果您希望他们使用您在'initialize(...)'中生成的数据,请不要使用它。我会认真考虑将调用移动到'glGenBuffersARB(...)'到'initialize(...)'中。那就是说,你为什么使用ARB扩展来存储缓冲区对象?自从OpenGL 1.5以来它们一直是核心。 –

+0

我已经解决了,一旦8小时过去了,我会发布解决方案。 – Peter

+0

在这两种情况下,您的缓冲区数据跨度应为零。 –

回答

1

你设置vHandle,cHandle和iHandle 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(); 
+0

这不会解决问题,因为每次调用“draw(...)”时,OP仍然会生成新的缓冲区。最终,GL实现将会耗尽名称,而不是空的缓冲区的名字首先会带来很多好处。部分解决方案是将非空白行2-5从'draw(...)'移动到'initialize(...)'。 –

相关问题