纹理中的GLUtils.texImage2D和Alpha问题

我使用GLUtils.texImage2D成功地生成了我的纹理,但是当我使用生成的纹理时,我遇到了alpha问题:它们比想要的要暗。

在检查了几件事后,我终于得出了问题来自GLUtils.texImage2D(GL10.GL_TEXTURE_2D,level,bmp,0)的结论;

我创建了第二个使用gl.glTexImage2D的函数(GL10.GL_TEXTURE_2D,level,GL10.GL_RGBA,width,height,0,GL10.GL_RGBA,GL10.GL_UNSIGNED_BYTE,pixels2);

但是在处理中创建像素2是一个字节缓冲区,其中我必须在将位图ARGB中的值更改为纹理RGBA时重新复制字节,这在处理中花费很大。

有人注意到了吗? 如果是的话,你是如何解决这个问题的......

贾森


谢谢你的回答,我已经在使用

gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);

我遇到了这个问题

我的问题是由GLUtils生成的alpha不是纹理的那个,它更暗。

差别就像在阳光下和阴影下看着一种颜色(如果这使得任何感觉)。

我已经尝试过gl.gltextimage2d,但创建缓冲区需要很长时间,除非有工具将位图转换为我不知道的字节缓冲区...


alpha通道是大量程序员的可怜的虐待儿童是我所能说的......但是,如果你这样做,上传的效率相当高:

  • 估计你最大的纹理(比如1024x1024),并创建一个你存储在某个静态变量或某处你可以访问的大小(1024 * 1024)的int数组,以便不需要重新创建该数组(分配时间为这里很珍贵)

  • 那么这样做:

    bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
    gl.glTexImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_RGBA, width, height, 
         0, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, IntBuffer.wrap(pixels));
    
  • 我很抱歉没有找到一个不同的解决方案......原来的问题是,GLUtils.texImage2D函数的实现者以某种方式错误地处理了Alpha通道,导致图像显示大于黑色边框时(双线性滤镜计算四个像素之间的颜色以及具有透明alpha的像素的rgb值已被破坏(如设置为黑色)时,结果是,在形成的透明边界上发生某种“颜色渗色”。非常丑陋。也许这样做是为了提高压缩比,因为PSD中alpha透明区域的RGB值包含很多垃圾,当消除时,压缩算法会有很大的改进空间)

    编辑:可悲的是,这种方法只适用于灰色图像,因为红色和蓝色通道在从位图中提取像素时被交换。 至少在MY设备上。 我不确定这是否适用于其他设备,但在我的情况下,这里有个窍门:

    for (int i=0;i<pixels.length;i+=1) {
        int argb = pixels[i];
        pixels[i] = argb&0xff00ff00 | ((argb&0xff)<<16) | ((argb>>16)&0xff);
    }
    

    GLUtils.texImage2D生成预乘alpha-texture。 在这个生成的纹理中,所有像素都乘以alpha值,因此您不需要再次乘以alpha值。 咱们试试吧

    gl.glBlendFunc(GL10.GL_ONE,GL10.GL_ONE_MINUS_SRC_ALPHA);


    解决方案在这里找到。 正如其他人用预乘alpha所述的那样。

    在surfaceView构造函数中

        setEGLConfigChooser(8, 8, 8, 8, 0, 0); 
        getHolder().setFormat(PixelFormat.RGBA_8888); 
    

    在View.Renderer onSurfaceCreated中

        gl.glEnable(GL10.GL_BLEND); 
        gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA); 
    
    链接地址: http://www.djcxy.com/p/33905.html

    上一篇: Issues with GLUtils.texImage2D and Alpha in Textures

    下一篇: GLSL shader render to texture not saving alpha value