我目前正在尝试让多个纹理在android上工作(使用一个碎片着色器)。它在我的Nexus4上运行良好,但在我测试过的所有三星设备上,它根本不显示矩形。问题似乎是texture2d在片段着色器代码中被调用了两次:
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);
}在此着色器中,我使用法线贴图(refractTexture)扭曲纹理(uTexture)。我试过使用正确的(而不是计算出来的) 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;
}发布于 2013-02-15 04:59:14
我建议我在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;
}https://stackoverflow.com/questions/14724356
复制相似问题