我想切换到VBO,现在没有索引。但我得到的只是一个空白的屏幕。有人能指出为什么它是空白的吗?如果我注释掉特定于vbo的代码并用mFVertexBuffer替换glVertexAttribPointer中的0(偏移量),即不使用VBO,那么相同的代码工作正常。OpenGL ES 2.0 VBO问题
这是我的onDraw方法
GLES20.glClearColor(0.50f, 0.50f, 0.50f, 1.0f);
GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
// Bind default FBO
// GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
GLES20.glUseProgram(mProgram);
checkGlError("glUseProgram");
GLES20.glEnable(GLES20.GL_BLEND);
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, id);
int vertexCount = mCarVerticesData.length/3;
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, buffers[0]);
checkGlError("1");
GLES20.glVertexAttribPointer(positionHandle, 3, GLES20.GL_FLOAT,false, 0, 0);
checkGlError("2");
GLES20.glEnableVertexAttribArray(positionHandle);
checkGlError("3 ");
transferTexturePoints(getTextureHandle());
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
checkGlError("glDrawArrays");
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
GLES20.glDisableVertexAttribArray(positionHandle);
GLES20.glDisable(GLES20.GL_BLEND);
这是我的VBO设置:
// Allocate and handle vertex buffer
ByteBuffer vbb2 = ByteBuffer.allocateDirect(mCarVerticesData.length
* FLOAT_SIZE_BYTES);
vbb2.order(ByteOrder.nativeOrder());
mFVertexBuffer = vbb2.asFloatBuffer();
mFVertexBuffer.put(mCarVerticesData);
mFVertexBuffer.position(0);
// Allocate and handle vertex buffer
this.buffers = new int[1];
GLES20.glGenBuffers(1, buffers, 0);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, buffers[0]);
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, mFVertexBuffer.capacity()
* FLOAT_SIZE_BYTES, mFVertexBuffer, GLES20.GL_STATIC_DRAW);
链接我的程序之前:
GLES20.glBindAttribLocation(program, 0, "aPosition");
checkGlError("bindAttribLoc");
我的顶点着色器是:
uniform mat4 uMVPMatrix;
attribute vec4 aPosition;
attribute vec2 aTextureCoordinate;
varying vec2 v_TextureCoordinate;
void main()
{
gl_Position = uMVPMatrix * aPosition;
v_TextureCoordinate = aTextureCoordinate;
gl_PointSize= 10.0;
}
感谢您的评论。但是,这不仅仅适用于带索引的glDrawElements吗? 编辑:我想绘制很多点,我可能会改变每一帧。在这样的设置中,指数是不必要的(如果我错了,请纠正我)!现在,我试图使用VBO来查看它如何与“流”输入行为。 – BatCoder 2013-02-12 08:21:27
你是不正确的,你需要指示。指数是,opengl用来解决哪些点应该绘制(在你的情况很容易,只是一个从0开始到max_points-1结束的线性数组索引)。如果没有索引,屏幕上不会显示任何内容。 – Trax 2013-02-12 08:37:15
我试过在我的代码中包含索引,但仍然无法使其正常工作。 getGLError返回0,所以没有错误。如果我尝试在没有VBO的情况下包含一些代码,它会很好地显示非VBO对象。 此外,谷歌搜索确实告诉我索引只需要索引渲染,我不需要,因为我没有多个共享顶点的对象。我的应用程序主要显示点精灵。 – BatCoder 2013-02-14 03:51:23