1

私は現在、Androidで複数のテクスチャを動作させようとしています(1つのフラグメントシェーダーを使用)。私のNexus 4では問題なく動作しますが、テストしたすべてのSamsungデバイスでは、長方形がまったく表示されません. 問題は、texture2d がフラグメント シェーダー コード内で 2 回呼び出されることです。

precision mediump float;                
uniform sampler2D uTexture;
uniform sampler2D refractTexture;       
varying vec2 vTexCoordinate;
varying vec2 vRefTexCoordinate;

void main() {
    vec2 scaleVec = vec2(0.05, 0.05);
    vec4 bumpTex = 2.0 * texture2D(refractTexture, vRefTexCoordinate) - 1.0;
    vec2 refCoords = vTexCoordinate.xy + bumpTex.xy * scaleVec;

    gl_FragColor = texture2D(uTexture, refCoords);
}

このシェーダーuTextureでは、法線マップ ( ) を使用してテクスチャ ( )を歪めrefractTextureます。正しい(計算されたものではない)座標を使用してみましたが、gl_FragColor削除するとすぐにvec4 bumpTex = 2.0 * texture2D(refractTexture, vRefTexCoordinate) - 1.0;デバイスに表示されます。

どんなヒントでも役に立ちます。

ここで要求されているのは、テクスチャのセットアップに使用する Java コードです。

    mTextureUniformHandle = GLES20.glGetUniformLocation(mProgram,
            "uTexture");

    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);

    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureDataHandle);

    GLES20.glUniform1i(mTextureUniformHandle, 0);

    if (refractNormal && textureRefBuffer != null) {
        mTextureRefUniHandle = GLES20.glGetUniformLocation(mProgram,
                "refractTexture");

        GLES20.glActiveTexture(GLES20.GL_TEXTURE1);

        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureRefDataHandle);

        GLES20.glUniform1i(mTextureRefUniHandle, 1);

        mTextureRefCoordinateHandle = GLES20.glGetAttribLocation(mProgram,
                "aRefTexCoordinate");

        GLES20.glVertexAttribPointer(mTextureRefCoordinateHandle,
                mTextureCoordinateDataSize, GLES20.GL_FLOAT, false, 0,
                textureRefBuffer);
        GLES20.glEnableVertexAttribArray(mTextureRefCoordinateHandle);

    }

    mTextureCoordinateHandle = GLES20.glGetAttribLocation(mProgram,
            "aTexCoordinate");
    GLES20.glVertexAttribPointer(mTextureCoordinateHandle,
            mTextureCoordinateDataSize, GLES20.GL_FLOAT, false, 0,
            textureBuffer);
    GLES20.glEnableVertexAttribArray(mTextureCoordinateHandle);

頂点シェーダーの C コード:

        uniform mat4 uMVPMatrix;
        attribute vec4 vPosition;
        attribute vec2 aTexCoordinate;
        attribute vec2 aRefTexCoordinate;
        varying vec2 vTexCoordinate;
        varying vec2 vRefTexCoordinate;

        void main() {         
            vTexCoordinate = aTexCoordinate;
            vRefTexCoordinate = aRefTexCoordinate;
            gl_Position =   uMVPMatrix*vPosition;
        }
4

1 に答える 1

0

私が ARM フォーラムで助けを求めることを示唆したように、そこで誰かが私にサンプル プロジェクトを求めました。私は持っていたものを大幅に取り除いてテストしました。驚いたことに、S3 で問題なく動作したので、テストしました。元のプロジェクトからコードをコピーして問題を見つけようとしましたが、最終的に小さなプロジェクトから元のプロジェクトにシェーダーをコピーすることになり、何とかうまくいきました。正確な原因はわかりませんが、私のために働いたシェーダーコードは次のとおりです。

        precision mediump float;
        uniform vec4 vColor;
        uniform sampler2D uTexture;
        uniform sampler2D refractTexture;   
        varying vec2 vTexCoordinate;
        varying vec2 vRefTexCoordinate;                     

        void main() {   

            vec2 scaleVec = vec2(0.05, 0.05);
            vec4 bumpTex = 2.0 * texture2D(refractTexture, vRefTexCoordinate) - 1.0;
            vec2 refCoords = vTexCoordinate.xy + bumpTex.xy * scaleVec;     
            gl_FragColor = texture2D(uTexture, refCoords);

        }

そして頂点シェーダー:

        uniform mat4 uMVPMatrix;
        attribute vec4 vPosition;
        attribute vec2 aTexCoordinate;
        attribute vec2 aRefTexCoordinate;
        varying vec2 vTexCoordinate;
        varying vec2 vRefTexCoordinate;

        void main() {         
            vTexCoordinate = aTexCoordinate;
            vRefTexCoordinate = aRefTexCoordinate;
            gl_Position =   uMVPMatrix*vPosition;

        }
于 2013-02-14T20:59:13.940 に答える