3

いくつかの異なる方法で単純なクワッドをレンダリングしようとしています。

すべてが1つのクラスに格納されている場合、これを非常に簡単に行うことができます。しかし、画面上に複数のオブジェクトをレンダリングできるようにしたいので、コードを分解して、さまざまな機能を別々のクラスに配置し始めています。問題は、レンダリング機能をEntityクラスに入れると、エラーが発生し始めることです。

これは、VertexArrayObjectクラスである関数です。

public void render(){
    glBindVertexArray(vaoID);
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboiID);

    this.exitOnGLError("Before render");
    glDrawElements(GL_TRIANGLES, indicesCount, GL_UNSIGNED_BYTE, 0);
    this.exitOnGLError("After render");

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
    glDisableVertexAttribArray(0);
    glDisableVertexAttribArray(1);
    glBindVertexArray(0);

    this.exitOnGLError("error rendering vao");
}

繰り返しますが、私が行ったのは、これをメインクラスからVAOを管理し、理論的にレンダリングするクラスに移動することだけです。

エラー値1285が表示され、エラーが発生するエラー呼び出しは「レンダリング後」というラベルの付いたものです。(exitOnGLError()はエラーチェックメソッドです)。

エラー1285は、明らかに「メモリ不足」を意味します。これは、1メガバイトの画像ファイルを使用しているため明らかにばかげています...4つの頂点のフロートバッファがすべてのVRAMをいっぱいにしているとは想像できません。

他に何がこのエラーを引き起こしている可能性がありますか?

4

4 に答える 4

2

参考までに、これと同じエラーが発生しました。これは、実際に opengl に「データを送信する」場所である glBufferData への呼び出しを追加できなかったことが原因でした。

glBufferData(GL_ARRAY_BUFFER, sizeof(GLSL_XYZNDUV_Item)*p->iNum_verts,p->pVerts,GL_STATIC_DRAW);

glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLushort)*p->iNum_tris*2,p->pIndices, GL_STATIC_DRAW);
于 2014-12-02T17:21:45.123 に答える
2

Google からここに来る人のために、考えられる答えを共有します。

glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, indexBuffer );
glBufferData( GL_ARRAY_BUFFER , sizeof( インデックス ), &indices[0], GL_STATIC_DRAW );

太字のコピーペースト エラーに注意してください。これにより、エラー 1285 が発生し、かなり長い間頭を悩ませていました。

于 2014-09-26T09:47:18.690 に答える
-1

Android 11 で OpenGL を使用してファイルをレンダリングすると、同じエラーが発生しました.obj(Android 9 では正常に動作します)。OpenGL にはバグがあり、.objファイル内のソース頂点がテクスチャ座標インデックス形式のない頂点法線インデックスで定義されている場合は常にメモリ不足エラーをスローするようです ( f 113//113 76//76 77//77)。このエラーを回避するには、単一のテクスチャ座標をファイルに追加し (例: vt 0.500 1)、すべての面でそれを参照します (にf 113//113 76//76 77//77変換しますf 113/1/113 76/1/76 77/1/77) 。

于 2021-09-20T11:32:26.113 に答える