glDrawElements未能绘制
问题描述:
我正在研究什么最终会成为地形抽屉,但目前我只是试图获得一对基本的三角形来绘制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天。
答
你设置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(...)'。 –
我敢肯定你不应该产生新的维也纳组织每次绘制时间。如果您希望他们使用您在'initialize(...)'中生成的数据,请不要使用它。我会认真考虑将调用移动到'glGenBuffersARB(...)'到'initialize(...)'中。那就是说,你为什么使用ARB扩展来存储缓冲区对象?自从OpenGL 1.5以来它们一直是核心。 –
我已经解决了,一旦8小时过去了,我会发布解决方案。 – Peter
在这两种情况下,您的缓冲区数据跨度应为零。 –