私は現在、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;
}