0

今のところ、インデックスなしでVBOに切り替えようとしています。しかし、私が得るのはただの空白の画面だけです。なぜ空白なのか誰かが指摘できますか?vbo固有のコードをコメントアウトし、glVertexAttribPointerの0(オフセット)を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 に答える