1

stl ファイルを読み取り、OpenGL ES 2.0 で表示するアプリケーションを作成しています。ハードコーディングされ、 onSurfaceCreated() メソッドで三角形リストに追加された三角形を表示することに成功しました。私が抱えている問題は、stl ファイルから三角形オブジェクトのリストを作成して描画しようとするときです。私が知る限り、頂点の座標はすべて有効で、適切な形式になっています。私はいつも件名のエラーを受け取ります。この問題のデバッグに問題があり、どうすればよいかわかりません。以下は、問題が発生する三角形クラスのコードのセクションです。具体的には、エラーはコード行にあります

mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
MyRenderer.checkGlError("glGetUniformLocation");


public void draw(float[] mvpMatrix) {
    // Add program to OpenGL environment
    GLES20.glUseProgram(mProgram);

    // get handle to vertex shader's vPosition member
    mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");

    // Enable a handle to the facet vertices
    GLES20.glEnableVertexAttribArray(mPositionHandle);

    // Prepare the triangle coordinate data
    GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX,
                                 GLES20.GL_FLOAT, false,
                                 vertexStride, vertexBuffer);

    // get handle to fragment shader's vColor member
    mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");

    // Set color for drawing the facet
    GLES20.glUniform4fv(mColorHandle, 1, color, 0);

    // get handle to shape's transformation matrix
    mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
    MyRenderer.checkGlError("glGetUniformLocation");

    // Apply the projection and view transformation
    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);
    MyRenderer.checkGlError("glUniformMatrix4fv");

    // Draw the facet
    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
    //If edge mode
    //GLES20.glUniform4fv(mColorHandle, 1, edgeColor, 0);
    //GLES20.glLineWidth(2.0f);
    //GLES20.glDrawArrays(GLES20.GL_LINE_STRIP, 0, vertexCount);

    // Disable vertex array
    GLES20.glDisableVertexAttribArray(mPositionHandle);
}

このような状況をデバッグする方法についてのアイデアはありますか? また、プログラムの実行中に描画されるオブジェクトを追加/削除する最良の方法については、やや不明確です。オブジェクトのリストを保持し、onDraw でそれらをループするという私の考えは大丈夫ですか?

4

3 に答える 3

2

stlファイルの表示でまったく同じ問題が発生していました。新しい三角形を作成しようとしているときに間違ったスレッドにいるという、私と同じ問題を抱えていると思います。OpenGL メソッドへの呼び出しが正しいスレッド上にあることを確認する必要があります。私自身、このようなことにはかなり慣れていません。基本的に、追加する必要がある STL をキューに入れるようにプログラムを変更し、onDraw メソッド内で新しいものをインスタンス化しました。

于 2013-02-13T02:53:37.337 に答える
0

私の場合、シェーダーを初期化するのを忘れていました。頂点シェーダーとフラグメント シェーダーをロードすると、問題が解決しました。

int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode);
int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode);

と:

public static int loadShader(int type, String shaderCode){
    // create a vertex shader type (GLES20.GL_VERTEX_SHADER)
    // or a fragment shader type (GLES20.GL_FRAGMENT_SHADER)
    int shader = GLES20.glCreateShader(type);

    // add the source code to the shader and compile it
    GLES20.glShaderSource(shader, shaderCode);
    GLES20.glCompileShader(shader);
    return shader;
}
于 2014-03-11T01:12:01.233 に答える