2

2D 背景画像を動かそうとしています。将来的には、自動移動として実装される予定です (カメラがオブジェクトを追跡しているように見えます)。典型的な例 - 怒っている鳥のゲーム。カメラは攻撃中の鳥を追跡します。

現在、setLookAtM() の値を変更するだけです。コードは次のとおりです。

public void onSurfaceCreated(GL10 unused, EGLConfig config) {
    GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);

    GLES20.glDisable(GLES20.GL_DEPTH_TEST); 
    GLES20.glEnable(GLES20.GL_BLEND);
    GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA,GLES20.GL_ONE_MINUS_SRC_ALPHA);

    // background
   bg = new BackGround(mActivityContext);

}

public void onDrawFrame(GL10 unused) {
    // Redraw background color
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);

    Matrix.setLookAtM(mVMatrix, 0, -1f, 0f, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
    Matrix.setIdentityM(mTrMatrix, 0);

    bg.draw(mMVPMatrix);
}

public void onSurfaceChanged(GL10 unused, int width, int height) {
    GLES20.glViewport(0, 0, width , height );

    float ratio = (float) width / height;
    Matrix.orthoM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7);
}


class BackGround {

    private FloatBuffer vertexBuffer;
    private ShortBuffer drawListBuffer;

    static final int COORDS_PER_VERTEX = 3;
    static float squareCoords[] = { -15.5f,  15.5f, 0.0f,   // top left
    -15.5f, -15.5f, 0.0f,   // bottom left
    15.5f, -15.5f, 0.0f,   // bottom right
    15.5f,  15.5f, 0.0f }; // top right

    int mProgram;
    int mPositionHandle;

    private short drawOrder[] = { 0, 1, 2, 0, 2, 3 }; // order to draw vertices
    private final String vertexShaderCode = "attribute vec2 a_TexCoordinate;" +
    "varying vec2 v_TexCoordinate;" +
    "uniform mat4 uMVPMatrix;" +
    "attribute vec4 vPosition;" +
    "void main() {" +
    "  gl_Position = uMVPMatrix * vPosition;" +
    "v_TexCoordinate = a_TexCoordinate;" +
    "}";

    private final String fragmentShaderCode =
    "precision mediump float;" +
    "uniform vec4 vColor;" +
    "uniform sampler2D u_Texture;" +
    "varying vec2 v_TexCoordinate;" +
    "void main() {" +
    "gl_FragColor = ( texture2D(u_Texture, v_TexCoordinate));" +
    "}";

    public BackGround(final Context context) {
        // initialize vertex byte buffer for shape coordinates
        ByteBuffer bb = ByteBuffer.allocateDirect(squareCoords.length * 4);
        bb.order(ByteOrder.nativeOrder());
        vertexBuffer = bb.asFloatBuffer();
        vertexBuffer.put(squareCoords);
        vertexBuffer.position(0);

        mActivityContext = context;

        // initialize byte buffer for the draw list
        ByteBuffer dlb = ByteBuffer.allocateDirect(drawOrder.length * 2);
        dlb.order(ByteOrder.nativeOrder());
        drawListBuffer = dlb.asShortBuffer();
        drawListBuffer.put(drawOrder);
        drawListBuffer.position(0);

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

        final float[] cubeTextureCoordinateData = {
            -15.5f,  15.5f,
            -15.5f, -15.5f,
            15.5f, -15.5f,
            15.5f,  15.5f
        };

        mCubeTextureCoordinates =   
        ByteBuffer.allocateDirect(cubeTextureCoordinateData.length *  
        4).order(ByteOrder.nativeOrder()).asFloatBuffer();
        mCubeTextureCoordinates.put(cubeTextureCoordinateData).position(0);

        mProgram = GLES20.glCreateProgram();             
        GLES20.glAttachShader(mProgram, vertexShader);   
        GLES20.glAttachShader(mProgram, fragmentShader); 
        GLES20.glBindAttribLocation(mProgram, 0, "a_TexCoordinate");
        GLES20.glLinkProgram(mProgram);   

        // load background bitmap 256x256px              
        mTextureDataHandle = loadTexture(mActivityContext, R.drawable.mud);
    }

    public void draw(float[] mvpMatrix) {

        GLES20.glUseProgram(mProgram);
        mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");

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

        mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");
        GLES20.glUniform4fv(mColorHandle, 1, color, 0);

        mTextureUniformHandle = GLES20.glGetAttribLocation(mProgram, "u_Texture");
        mTextureCoordinateHandle = GLES20.glGetAttribLocation(mProgram, "a_TexCoordinate");

        GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureDataHandle);
        GLES20.glUniform1i(mTextureUniformHandle, 0);

        mCubeTextureCoordinates.position(0);
        GLES20.glVertexAttribPointer(mTextureCoordinateHandle, mTextureCoordinateDataSize,
        GLES20.GL_FLOAT, false, 0, mCubeTextureCoordinates);
        GLES20.glEnableVertexAttribArray(mTextureCoordinateHandle);

        mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
        GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);
        GLES20.glDrawElements(GLES20.GL_TRIANGLES, drawOrder.length,
        GLES20.GL_UNSIGNED_SHORT, drawListBuffer);
        GLES20.glDisableVertexAttribArray(mPositionHandle);
    }
}

問題は、背景 (256x256) を大きな領域 (画面サイズに制限されない) に広げる方法がわからないことです。現在、テクスチャは画面の端でのみ繰り返されます。そして、(SetLookAtm()を使用して)移動しようとすると、問題なく移動しますが、空のストライプが残ります:

初期背景画像 (bmp 反転):

ab
cd

画面の背景画像:

--------
|ababab|
|cdcdcd|
|ababab|
|cdcdcd|
|ababab|
|cdcdcd|
--------

移動後の背景画像(右→)

--------
|  abab|
|  cdcd|
|  abab|
|  cdcd| 
|  abab|
|  cdcd|
--------

方向(左、右、上、下)は関係ありません。サイドストライプが表示される側にのみ効果があります

4

1 に答える 1

0

また:

A)画面の端を超えて延びるように背景の長方形を定義します(そして、その位置をアニメーション化して背景を「スクロール」します)

--------
|ababab|ababab
|cdcdcd|cdcdcd
|ababab|ababab
|cdcdcd|cdcdcd
|ababab|ababab
|cdcdcd|cdcdcd
--------

また:

B)前と同じように、画面全体に表示されるbg長方形を定義しますが、テクスチャ座標をアニメーション化してスクロールさせます。例:texcoordsが長方形(0.00,0.00)->(1.00,1.00)を形成している場合は、texcoordsをに変更してbgを左にスクロールします(0.05,0.00)->(1.05,1.00)。glTexParameteriを次のように設定していることを確認してください。

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
于 2013-03-17T22:11:16.487 に答える