我上传图片作为纹理加载到GLSurfaceView。 生成的纹理在某些设备上看起来非常精细,而在其他设备上看起来完全失真。
这就是三星Galaxy Nexus(屏幕密度2.0)的样子:
摩托罗拉上的相同图像(屏幕密度为1.5):
这是我的加载代码:
FutureTask<Integer> futureTask = new FutureTask<Integer>(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
// Generate Texture
int[] texturenames = new int[1];
GLES20.glGenTextures(1, texturenames, 0);
// Bind texture to texturename
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texturenames[0]);
// Set filtering
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,
GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER,
GLES20.GL_LINEAR);
// Set wrapping mode
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
// Correct the bitmap if its not a power of two
Bitmap potTextureBitmap = textureBitmap;
int potWidth = nextPOT(textureBitmap.getWidth());
int potHeight = nextPOT(textureBitmap.getHeight());
if ((textureBitmap.getWidth() != potWidth) || (textureBitmap.getHeight() != potHeight)) {
potTextureBitmap = Bitmap.createScaledBitmap(textureBitmap, potWidth, potHeight, false);
}
// Load the bitmap into the bound texture.
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, potTextureBitmap, 0);
GLES20.glFlush();
return Integer.valueOf( texturenames[0]);
}
});
this.mSurfaceView.queueEvent(futureTask);
我做错了什么?
答案 0 :(得分:0)
我终于找到了这个问题的原因。 它非常具体,但无论如何我都会分享细节:
我的颜色计算结果出现错误。我需要将Hex颜色转换为规范化的rgba(在我的情况下将白色#ffffffff
转换为{1.0, 1.0, 1.0, 1.0}
),但实际上我将非规范化值输入到我的着色器中(例如:{255, 255, 255, 255}
)。
当与我的纹理颜色相乘时,产生的颜色会爆炸。
这取决于图形卡,这会造成伪影。
因此,假设对屏幕分辨率的依赖纯属巧合!