0

我正在尝试切换到 VBO,暂时没有索引。但我得到的只是一个空白屏幕。有人能指出为什么它是空白的吗?如果我注释掉特定于 vbo 的代码并将 glVertexAttribPointer 中的 0(offset) 替换为 mFVertexBuffer,则相同的代码可以正常工作,即不使用 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;
}
4

2 回答 2

0

你还需要生成一个元素数组并调用这样的东西来渲染你的“对象”:

// Bind the vertex buffer 
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, _bufferIds.get(2));
GLES20.glVertexAttribPointer(4, 4, GLES20.GL_FLOAT, false, 4*4, 0);
// Bind the elements buffer and draw it
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, _bufferIds.get(1));
GLES20.glDrawElements(GLES20.GL_TRIANGLES, _numElements, GLES20.GL_UNSIGNED_SHORT, 0);

希望有帮助。

于 2013-02-12T05:11:04.347 回答
0

我通过重写上传顶点数据的方式解决了这个问题。我正在修改它,所以我需要再次调用 glBindBufferData 才能上传它。而且我能够在不使用 glDrawElements 和索引的情况下使用 VBO,而且效果很好。

于 2013-03-27T04:11:33.270 回答