簡體   English   中英

OpenGL ES 2.0 VBO問題

[英]OpenGL ES 2.0 VBO issue

我現在嘗試切換到沒有索引的VBO。 但是我得到的只是一個空白屏幕。 有人可以指出為什么它空白嗎? 如果我注釋掉特定於vbo的代碼,並用mFVertexBuffer替換glVertexAttribPointer中的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;
}

您還需要生成一個elements數組並調用類似的東西,以渲染“對象”:

// 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);

希望能有所幫助。

我通過重寫上傳頂點數據的方式解決了該問題。 我正在修改它,因此,我需要再次調用glBindBufferData才能將其上傳。 而且我無需使用glDrawElements和索引就可以使用VBO,並且效果很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM