多个纹理不适用于其他设备?

时间:2011-12-27 12:32:44

标签: android opengl-es-2.0 textures

我已经实现了多种纹理的可能性,但是现在......但昨天我发现他们在其他设备上没有像预期的那样工作......不是我的......:/ 在我的设备(Experia Mini Pro)上,它完美无缺:

首先是一些用于加载纹理的代码片段:

int[] textureID = new int[1];        
GLES20.glDeleteTextures(1,textureID,0);
GLES20.glGenTextures(1,textureID,0);
this.unit = textureID[0];
GLES20.glActiveTexture(GLES20.GL_TEXTURE0+this.unit);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,this.unit);     
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_MIN_FILTER,GLES20.GL_LINEAR);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_MAG_FILTER,GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_WRAP_S,GLES20.GL_REPEAT);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_WRAP_T,GLES20.GL_REPEAT);

...
... bitmap loading functions
...

GLUtils.texImage2D(GLES20.GL_TEXTURE_2D,0,bitmapTexture,0);      
bitmapTexture.recycle();

这里是绘制三角形的部分:

GLES20.glUniform1i(LLShader.location[20],gfx.imagetexture.unit);
GLES20.glActiveTexture(GLES20.GL_TEXTURE0+gfx.imagetexture.unit);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,gfx.imagetexture.unit);
GLES20.glDrawArrays(GLES20.GL_TRIANGLES,0,gfx._vertexBuffer.capacity()/3);

在ym设备上,一切都非常完美:有4个四边形,每个都有自己的纹理,一个接一个地绘制。

然后我把apk给了我的朋友和他的设备(三星Galaxy S1)似乎,它只加载一个纹理并且只显示其中的第一个两个...... 不知道在哪里找......到目前为止我还没找到这个虫子。

PS:发生了另一个错误,我不知道要处理。在"重新开放后#34; (从sleepmode开始)当前正在运行的应用程序应该使用alpha-blending的所有图像都是黑色......可能是什么问题?

2 个答案:

答案 0 :(得分:4)

这与我几个小时前工作的另一个案例非常相似。

在OpenGL ES 2.0中,如果没有2个纹理,则换行模式只能是GL_CLAMP_TO_EDGE。

这意味着,如果使用与GL_CLAMP_TO_EDGE不同的包装模式,则它期望具有2纹理的幂。 (例如,512X256,1024X1024等)。

这条规则的解释是非常开放的,并且根据设备的不同而有很大变化,例如我的摩托罗拉Defy可以使用它,而Galaxy TAB却没有,这可以证明你正在经历的行为是正确的。

试试这个:

20.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);

我希望它能够发挥魔力。

Maurizio Benedetti

答案 1 :(得分:0)

很抱歉让你先等一下:/

我将每个纹理缩放到pow2大小的纹理,通过查找新的pow2纹理足够大以包含原始位图。 当我将TextureParameterf更改为GL_CLAMP时......它看起来像这样: it seems that one part of the texture-coordinates is not passed right

似乎纹理坐标的一部分未正确传递

我希望你知道为什么现在看起来有点奇怪。

编辑:最后我发现了我的失败。 V坐标计算不正确。现在,因为所有的v坐标都是正的,所以它工作正常,谢谢:)