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

本文分享了在BlueStack模拟器与真实设备上运行OpenGL ES程序时遇到的问题及解决方案,包括浮点数精度问题、纹理加载失败及gl_PointSize属性无效的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

情况一:同样代码,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).


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值