1

画面に大量のビルボードを描画していますが、「ランダムに」描画後、または次の描画サイクルを開始する直前に glerror 1285 が表示されますが、わかりません。

データ全体は 1.3M~ で、頂点およびインデックス バッファーとしてビデオカードにアップロードします。20 の頂点バッファーがあり、そのうちの 19 は 19 の異なる時点でのビルボードの位置とサイズを教えてくれ、20 番目は頂点インデックスを教えてくれます (頂点シェーダーでテクスチャ座標を計算できるように)。

秒ごとに、ビルボードの位置とサイズを計算するために使用する 2 つの頂点バッファーを変更します。それらはまったく同じ方法で構築されていますが、しばらくすると、通常は 4 番目のバッファーで glerror 1285 でクラッシュしますが、常にではありません。サイクルごとに処理できる頂点の数はランダムに変化します。

これを引き起こしている可能性があるのは何ですか?

このコードはエラーをチェックします

public static void checkGlError(String glOperation) {
    int error;
    while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) {
        System.out.println("error: " + error);
    }
}

このコードは私の描画サイクルです(またはそれが呼ばれるものは何でも)

MyGLRenderer.checkGlError("");
sBatch.draw(MyGLRenderer.mMVPMatrix);
MyGLRenderer.checkGlError("");

私のクラスの描画コード

public void draw(float[] mvpMatrix) {
    if (isPacked && !uploaded) {
        upload();
    }
    if (!(isPacked && uploaded)) {
        return;
    }
    GLES20.glUseProgram(GlProgram);
    // ////////////////////
    int time = (int) ((System.currentTimeMillis() % ((size) * 1000)) / 1000);
    int off1 = time;
    int off2 = time + 1;
    // ///////////////////////
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, buffers[off1]);
    GLES20.glEnableVertexAttribArray(0);
    GLES20.glVertexAttribPointer(0, 3, GLES20.GL_FLOAT, false, 0, 0);
    // ///////////////////////
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, buffers[off2]);
    GLES20.glEnableVertexAttribArray(1);
    GLES20.glVertexAttribPointer(1, 3, GLES20.GL_FLOAT, false, 0, 0);
    // /////////////
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, buffers[buffers.length - 2]);
    GLES20.glEnableVertexAttribArray(2);
    GLES20.glVertexAttribPointer(2, 1, GLES20.GL_FLOAT, false, 0, 0);
    // ///////////////
    int TimeHandle = GLES20.glGetUniformLocation(GlProgram, "time");
    GLES20.glUniform1f(TimeHandle, (System.currentTimeMillis() % 1000) / 1000f);
    // /////////////
    GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, buffers[buffers.length - 1]);
    GLES20.glDrawElements(GLES20.GL_TRIANGLE_STRIP, totalvertz, GLES20.GL_UNSIGNED_SHORT, 0);
    GLES20.glDisableVertexAttribArray(0);
    GLES20.glDisableVertexAttribArray(1);
    GLES20.glDisableVertexAttribArray(2);
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
    GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);
}

これは、バッファをビデオカードにアップロードする場所です

private void upload() {
    buffers = new int[buffs.length];
    if (buffers[0] != 0) {
        GLES20.glDeleteBuffers(2, buffers, 0);
        buffers[0] = 0;
        buffers[1] = 0;
    }
    // ///////////////////////
    int totalsize = 0;
    GLES20.glGenBuffers(buffers.length, buffers, 0);
    for (int i = 0; i < buffs.length-2; i++) {
        GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, buffers[i]);
        GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, buffs[i].capacity(), buffs[i], GLES20.GL_STATIC_DRAW);
        GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
        totalsize += buffs[i].capacity();
    }
    // ///////////////////////
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, buffers[buffers.length-2]);
    GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, buffs[buffs.length-2].capacity(), buffs[buffs.length-2], GLES20.GL_STATIC_DRAW);
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
    // //////////////
    GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, buffers[buffers.length-1]);
    GLES20.glBufferData(GLES20.GL_ELEMENT_ARRAY_BUFFER, IndexBuffer.capacity(), IndexBuffer, GLES20.GL_STATIC_DRAW);
    GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);
    // VertexBuffer.clear();
    // IndexBuffer.clear();
    totalsize += buffs[buffs.length-2].capacity();
    totalsize += IndexBuffer.capacity();
    System.out.println(totalsize); 
    uploaded = true;
}

私のシェーダー

private final String VertexShaderCode = 
                //"uniform mat4 uMVPMatrix;" + 
                "uniform float time;" + 
                "attribute vec4 aPosition;" + 
                "attribute vec4 bPosition;" + 
                "attribute vec4 a_pos;" + 
                "varying vec4 vColor;" + 
                "varying vec2 vTexCoordinate;" +
                "void main() {" +
                "  highp int mo = int(a_pos.x);" + 
                "  mo = mo - (4 * (mo / 4));" + 
                "  vTexCoordinate = bPosition.xy;" + 
                "  if(mo == 0){" +
                "     vTexCoordinate = vec2(-1, -1);" +
                "  }" + 
                "  if(mo == 1){" +
                "     vTexCoordinate = vec2(-1, 1);" +
                "  }" + 
                "  if(mo == 2){" +
                "     vTexCoordinate = vec2(1, -1);" +
                "  }" + 
                "  if(mo == 3){" +
                "     vTexCoordinate = vec2(1, 1);" +
                "  }" +
                "  vColor = vec4(1,1,1,1);" + 
                "  vec4 mPosition = mix(aPosition, bPosition, time);" +
                "  mPosition.z = -1.0;" + 
                "  gl_Position = mPosition;" + 
                "}";
private final String FragmentShaderCode = 
                "precision mediump float;" + 
                "varying vec4 vColor;" + 
                "varying vec2 vTexCoordinate;" +
                "void main() {" +
                "  const vec2 zo = vec2(0, 1);" +
                "  mediump float thing = vTexCoordinate.x * vTexCoordinate.x + (vTexCoordinate.y * vTexCoordinate.y);" +
                "  if(thing < 0.9)" +
                "     gl_FragColor = zo.yyyy * vColor;" +
                "  else if(thing < 1.0 && thing > 0.9)" +
                "     gl_FragColor = zo.xxxy;" +
                "  else " +
                "     gl_FragColor = zo.xxxx;" +
                "}";

編集/更新: エラーをチェックするコードから「throw new RuntimeException」を削除し、System.out.println に置き換えました。これにより、GL_OUT_OF_MEMORY を引き起こすバッファが常に 6 つあり、コードが変更されるたびに「ランダムに選択」されることがわかりました。これはエラーの原因を特定するのに役立ちませんが、他の誰かが私を助けるのに役立つことを願っています.

4

2 に答える 2

2

バッファ全体をアップロードしていないことがわかりました。

GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, buffers[buffers.length-2]);
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, buffs[buffs.length-2].capacity(), buffs[buffs.length-2], GLES20.GL_STATIC_DRAW);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);

する必要があります

GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, buffers[buffers.length-2]);
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, buffs[buffs.length-2].capacity()*4, buffs[buffs.length-2], GLES20.GL_STATIC_DRAW);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);

例えば

于 2013-09-18T21:18:23.820 に答える
2

私はこの行が心配です:

GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, buffers[buffers.length - 2]);

あなたのupload (...)メソッドでは、バッファ[buffers.length - 2]がタイプであると宣言しましたGL_ELEMENT_ARRAY_BUFFER

GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, buffers[buffers.length-2]);

この種の一貫性のない使用法は、おそらく設計にはるかに大きなエラーがあることを示しています。それよりもわかりやすい名前を使用したい場合がbuffersありbuffsますが、そのような名前はこれらのエラーにつながる可能性があります。

于 2013-09-13T22:58:11.423 に答える