0

我正在尝试通过将 OpenGL 代码引入 OpenGL 2.0 来稍微现代化我的 OpenGL 代码,但我得到的只是一个黑屏......也许有人在我的代码中发现了一个错误(代码不多)。

这是我的旧的、完全工作的代码的相关部分的片段。

// Send color data into GPU memory
glEnableClientState(GL_COLOR_ARRAY);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, colorsHandle);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, colors, GL15.GL_DYNAMIC_DRAW);
glColorPointer(4, GL_FLOAT, 0, 0);

// Send vertex data into GPU memory
glEnableClientState(GL_VERTEX_ARRAY);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, verticesHandle);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, GL15.GL_DYNAMIC_DRAW);
glVertexPointer(3, GL_FLOAT, 0, 0);

// Send texcoords data into GPU memory
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, texcoordsHandle);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, GL15.GL_DYNAMIC_DRAW);
glTexCoordPointer(2, GL_FLOAT, 0, 0);

for (Batch batch : batches) batch.render();

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);

...批量调用glDrawArrays(在进行一些opengl状态更改时)...

glDrawArrays(GL_QUADS, spriteOffset * 4, spriteCount * 4);

这是新代码:

// Send color data into GPU memory
GL20.glEnableVertexAttribArray(0);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, colorsHandle);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, colors, GL15.GL_DYNAMIC_DRAW);
GL20.glVertexAttribPointer(0, 4, GL_FLOAT, false, 0, 0);

// Send vertex data into GPU memory
GL20.glEnableVertexAttribArray(1);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, verticesHandle);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, vertices, GL15.GL_DYNAMIC_DRAW);
GL20.glVertexAttribPointer(1, 3, GL_FLOAT, false, 0, 0);

// Send texcoords data into GPU memory
GL20.glEnableVertexAttribArray(2);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, texcoordsHandle);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, texcoords,GL15.GL_DYNAMIC_DRAW);
GL20.glVertexAttribPointer(2, 2, GL_FLOAT, false, 0, 0);

for (Batch batch : batches) batch.render();

GL20.glDisableVertexAttribArray(0);
GL20.glDisableVertexAttribArray(1);
GL20.glDisableVertexAttribArray(2);

就像我说的第一个代码完美地工作,但第二个根本没有绘制任何东西。这些是我在渲染器中更改的唯一代码行,它们对我来说看起来是正确的。但显然某处存在问题......可能导致没有渲染的原因是什么?

4

1 回答 1

1

如果这些确实是您更改的唯一行,那么我猜您还没有实现任何着色器?

在 OpenGLES 2.0 中没有固定的函数管道,所以你需要编写顶点/片段着色器,编译它们,链接程序对象等。

如果您搜索,我相信您可以找到很多教程。

于 2012-06-25T22:58:36.433 回答