您的位置:首页 > 产品设计 > UI/UE

BlueStack与真机的运行相同代码,效果不同的解决

2015-03-30 22:32 288 查看
情况一:同样代码,BlueStack运行正常,真机运行不正常!
第一点:

我们在写shader时,定义float a=1;此时BlueStack上运行程序完全正常,不报出任何错误。但此时在真机运行,logcat提示加载shader出错,并且真机上不显示相关效果。若是改成float a=1.0,在BlueStack和真机上运行都正确,出现相关效果,不报错误。(妈的,我是一行一行删,才找出这个原因的,累死我了)

情况二:同样代码,BlueStack运行不正常,真机运行正常!

第一点:

加载图片方法最好用我在/article/7702328.html中的方法。不到万不得已不要用下面方法:

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).
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐