情况一:同样代码,BlueStack运行正常,真机运行不正常!
第一点:
我们在写shader时,定义float a=1;此时BlueStack上运行程序完全正常,不报出任何错误。但此时在真机运行,logcat提示加载shader出错,并且真机上不显示相关效果。若是改成float a=1.0,在BlueStack和真机上运行都正确,出现相关效果,不报错误。(妈的,我是一行一行删,才找出这个原因的,累死我了)
情况二:同样代码,BlueStack运行不正常,真机运行正常!
第一点:
加载图片方法最好用我在http://blog.csdn.net/sh15285118586/article/details/44773863中的方法。不到万不得已不要用下面方法:
public static int initTexture(Resources r,int drawableId)
{
int[] textures = new int[1];
GLES20.glGenTextures
(
1, //产生的纹理id的数量
textures, //纹理id的数组
0 //偏移量
);
int textureId=textures[0];
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId);
GLES20.glTexParameteri ( GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR_MIPMAP_LINEAR);
GLES20.glTexParameteri ( GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR_MIPMAP_NEAREST);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S,GLES20.GL_REPEAT);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,GLES20.GL_REPEAT);
InputStream is = r.openRawResource(drawableId);
Bitmap bitmapTmp;
try
{
bitmapTmp = BitmapFactory.decodeStream(is);
}
finally
{
try
{
is.close();
}
catch(IOException e)
{
e.printStackTrace();
}
}
GLUtils.texImage2D
(
GLES20.GL_TEXTURE_2D, //纹理类型
0,
GLUtils.getInternalFormat(bitmapTmp),
bitmapTmp, //纹理图像
GLUtils.getType(bitmapTmp),
0 //纹理边框尺寸
);
//自动生成Mipmap纹理
GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D);
bitmapTmp.recycle(); //纹理加载成功后释放图片
return textureId;
}
因为使用此方法在加载图片时,在raw文件下的图片加载不了。R.drawable.mytexture可以正常使用,R.raw.mytexture就报错,说类型错误。
第二点:
在做粒子系统时,gl_PointSize在bluestack上不起作用,而在真机上起作用。
解决方案一:用DuOS模拟器,也是Android系统的(此方法我试过,可以的)。
解决方案二:GLES20.glEnable(0x8642);就能起作用(此方法真正解决问题)。
当然要感谢这里https://www.khronos.org/message_boards/showthread.php/5984-gl_PointSize-problem
第三点:
在bluestack上运行logcat出现GLES20.glEnableVertexAttribArray(got index=4294967295);而在真机上运行不出现错误;
方法:http://stackoverflow.com/questions/29170900/glgetattriblocation-returns-large-and-unusable-value
我用到的是:2、The attribute with the given name was optimized away because it is not used.原因是我的shader中aColor没用到,而却给了数据。
precision mediump float;
uniform sampler2D sTexture;
varying vec3 vColor;
varying float vElapsedTime;
void main()
{
//float xDistance=0.5-gl_PointCoord.x;
// float yDistance=0.5-gl_PointCoord.y;
//float distanceFromCenter=sqrt(xDistance*xDistance+yDistance*yDistance);
// if(distanceFromCenter>0.5){
// discard;
//}else{
//}
// gl_FragColor=vec4(vColor/vElapsedTime,1.0);
gl_FragColor=texture2D(sTexture,gl_PointCoord);
}
结论:不用的注释掉或删掉,就解决了。
以上所有问题我解决了一个星期。真正起作用的就最后一天。(要看外国网站,老外还是NB).