Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用OpenGL在Android中绘制半透明纹理_Android_Opengl Es - Fatal编程技术网

使用OpenGL在Android中绘制半透明纹理

使用OpenGL在Android中绘制半透明纹理,android,opengl-es,Android,Opengl Es,我已经为这个问题挣扎了几个星期,没有结果。我肯定我错过了一些愚蠢的事情,所以我想我会得到外界的意见 我在一个应用程序中绘制了一系列不同的纹理,出于某种原因,其中一些没有显示出来。我试图找出为什么只有某些纹理不会显示,我想我已经将其缩小到具有半透明像素的纹理(包含alpha值不是0或255的像素的纹理)。完全不透明的纹理显示得很好,具有完全打开或完全关闭像素的纹理也显示得很好。问题纹理显示为白色方形。另外,我想我应该补充一点,在emulator中,所有东西都显示得很好,只有在我的测试设备(Sams

我已经为这个问题挣扎了几个星期,没有结果。我肯定我错过了一些愚蠢的事情,所以我想我会得到外界的意见

我在一个应用程序中绘制了一系列不同的纹理,出于某种原因,其中一些没有显示出来。我试图找出为什么只有某些纹理不会显示,我想我已经将其缩小到具有半透明像素的纹理(包含alpha值不是0或255的像素的纹理)。完全不透明的纹理显示得很好,具有完全打开或完全关闭像素的纹理也显示得很好。问题纹理显示为白色方形。另外,我想我应该补充一点,在emulator中,所有东西都显示得很好,只有在我的测试设备(Samsung Captivate)上,纹理才不会显示

下面是我的一些代码片段,它们显示了重要的部分,如往常一样,如果需要更多信息,请告诉我

视图设置(我已经尝试了这两种设置,但是有没有这些行似乎没有什么区别):

渲染器的onSurfaceCreated方法(我也尝试过启用深度测试,但没有效果,我使用的行在这里有注释,当我尝试深度测试时,我确实在每个绘图上清除了深度缓冲):

纹理加载方法(是否与GLUtils.texImage2D有关?)


为了结束这个问题,以防有人无意中发现:


发生此错误的原因是图像以res/drawable格式保存。从那里加载时,Android可以进行一些幕后处理,导致生成的图像大小不能达到2的幂将图像存储在res/raw中以避免这种处理。

你的纹理是哪个维度的?这是一款基于2D瓷砖的游戏。这就是你的意思吗?Njah。哪些维度是无法显示的纹理?32x32、64x64或128x128?啊,好的。纹理有不同的大小,都是二的幂。有些是128x32、256x512、512x64、64x64。没有一种尺码会给我带来麻烦。
gameView.setEGLConfigChooser(8,8,8,8,16,0);
gameView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
gl.glClearColor(0.5f, 0.5f, 0.5f, 1);
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
gl.glShadeModel(GL10.GL_FLAT);
gl.glDisable(GL10.GL_DEPTH_TEST);
//gl.glEnable(GL10.GL_DEPTH_TEST);
//gl.glDepthFunc(GL10.GL_LEQUAL);
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);
gl.glEnable(GL10.GL_TEXTURE_2D);

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
int texId;
gl.glGenTextures(1, mTextureNameWorkspace, 0);

texId = mTextureNameWorkspace[0];
gl.glBindTexture(GL10.GL_TEXTURE_2D, texId);

if (gl instanceof GL11) {
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR_MIPMAP_NEAREST);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL11.GL_GENERATE_MIPMAP, GL11.GL_TRUE);
}
else {
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
}

gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);

gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_MODULATE);

InputStream is = res.openRawResource(resourceId);
Bitmap bitmap = null;
try {
    bitmap = BitmapFactory.decodeStream(is, null, bitmapOptions);

    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);

    if (gl instanceof GL11) {
        mCropWorkspace[0] = 0;
        mCropWorkspace[1] = bitmap.getHeight();
        mCropWorkspace[2] = bitmap.getWidth();
        mCropWorkspace[3] = -bitmap.getHeight();

        ((GL11) gl).glTexParameteriv(GL10.GL_TEXTURE_2D, GL11Ext.GL_TEXTURE_CROP_RECT_OES, mCropWorkspace, 0);
    }

    //Don't poke fun at my archaic error handler
    int error;
    String errorCodes = "";
    while ((error = gl.glGetError()) != GL10.GL_NO_ERROR) {
        errorCodes += error + " ";
    }
    if (errorCodes.length() != 0)
        throw new Exception("OpenGL error while loading texture. Error codes: " + errorCodes.substring(0,errorCodes.length()-1));

    textureWidth  = bitmap.getWidth();
    textureHeight = bitmap.getHeight();
    textureId = texId;

    return texId;
}
finally {
    try { is.close();       } catch (IOException e) { }
    try { bitmap.recycle(); } catch (Exception   e) { }
}