1

正方形にテクスチャをレンダリングできないようです。空白の正方形を色付きでレンダリングするプログラムを取得しました。どんな助けでも大歓迎です。

コードを次のように再設計しましたが、頂点座標とテクスチャ座標の設定方法に問題があると考えています。また、glDrawArrays 関数で libc Fatal シグナル 11 を受け取ります。

頂点とテクスチャの座標は次のとおりです。

private final FloatBuffer vertexBuffer;
private final FloatBuffer textureBuffer;

static final int COORDS_PER_VERTEX = 3;
static float positionCoords[] = { // in counterclockwise order:
    -1.0f, 1.0f, 1.0f,              
    -1.0f, -1.0f, 1.0f,
    1.0f, 1.0f, 1.0f, 
    -1.0f, -1.0f, 1.0f,                 
    1.0f, -1.0f, 1.0f,
    1.0f, 1.0f, 1.0f,
};

static final int COORDS_PER_TEXTURE = 2;
static float textureCoords[] = {
    0.0f, 0.0f,                 
    0.0f, 1.0f,
    1.0f, 0.0f,
    0.0f, 1.0f,
    1.0f, 1.0f,
    1.0f, 0.0f,
};

私の正方形クラスの描画関数は次のとおりです。

public void draw(float[] mvpMatrix) 
{
    int MVPMatrixHandle = GLES20.glGetUniformLocation(shader.getProgram(), "u_MVPMatrix");
    int textureHandler = GLES20.glGetUniformLocation(shader.getProgram(), "u_s_texture");
    int positionHandler = GLES20.glGetAttribLocation(shader.getProgram(), "a_position");
    int texCoordHandler = GLES20.glGetAttribLocation(shader.getProgram(), "a_texCoord");

        Log.d(TAG, "Setting up GLProgram Handlers");
        GlRenderer.checkGlError("Setup GLProgram Handlers");

    GLES20.glEnableVertexAttribArray(positionHandler);
    GLES20.glEnableVertexAttribArray(texCoordHandler);

        GlRenderer.checkGlError("EnableVertexAttribArrays");

    GLES20.glVertexAttribPointer(positionHandler, COORDS_PER_VERTEX,
                                GLES20.GL_FLOAT, false,
                                vertexStride, vertexBuffer);        

    GLES20.glVertexAttribPointer(textureHandler, COORDS_PER_TEXTURE,
                                GLES20.GL_FLOAT, false, 
                                textureStride, textureBuffer);

        GlRenderer.checkGlError("VertexAttribPointers (Position, Texture)");


    GLES20.glUniformMatrix4fv(MVPMatrixHandle, 1, false, mvpMatrix, 0);

    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureID);

    GLES20.glUniform1i(textureHandler, 0);

        GlRenderer.checkGlError("Binding Texture");

    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);

        GlRenderer.checkGlError("Draw Arrays");

    GLES20.glDisableVertexAttribArray(positionHandler);
    GLES20.glDisableVertexAttribArray(texCoordHandler);

        GlRenderer.checkGlError("DisableVertexAttribArrays");
}
4

2 に答える 2

0

上記のコードの主な問題は、 のtextureHandle代わりにを使用していたことですtexCoordHandlerglVertexAttribPointer //Texture

コードは次のようになります。

GLES20.glVertexAttribPointer(texCoordHandler, COORDS_PER_TEXTURE,
                            GLES20.GL_FLOAT, false, 
                            textureStride, textureBuffer);

この問題が発生したため、コードをもう一度書き直しました。インデックス (draworder) を追加し、Vertex 配列と Texture 配列を組み合わせて Vertices 配列にし、a を参照するだけです//aと a のvertexBuffer代わりに位置座標とテクスチャ座標の両方を含みますtextureBuffervertexBuffer

また、次のように変更しGLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);ました。

GLES20.glDrawElements(GLES20.GL_TRIANGLES, indices.length, 
                      GLES20.GL_UNSIGNED_SHORT, indexBuffer);
于 2012-08-05T23:26:54.557 に答える
0

あなたのSetupGLPositionHandle機能は私には間違っているようです。関数の最後で PositionHandle 属性を無効にするのはなぜですか?

この属性は、glDrawArrays が呼び出されるときに有効にする必要があります。

于 2012-08-03T23:30:00.397 に答える