出于各种原因,我正在实现一个类似于Android中的Bitmap的类,保存像素数据,以便在传递到OpenGL之前需要调整实际的Bitmap(2大小的功能)
我使用int []来保存像素数据,所以基本上,我的代码就像:
width2 = nearestPowerOf2(width);
height2 = nearestPowerOf2(height);
int[] pixels = new int[width2 * height2];
bitmap.getPixels(pixels, 0, width2, 0, 0, bitmap.getWidth(), bitmap.getHeight());
现在,退一步,如果我创建一个画布并使用canvas.draw()将较小的位图放到一个更大的,尺寸合适的图像上,然后将它绑定在OpenGL中,它就会完美地绘制。
但是,如果我拍摄像素数据(包裹在IntBuffer中)并绑定它,那么alpha值是错误的。为了完整起见,这就是我的约束力:
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width2, height2, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, pixelsBuffer);
我不明白为什么会这样。
我检查了位图的格式,它们都是ARGB_8888。而且,再次,如果我直接绘制位图,或使用Bitmap.createBitmap(),它可以工作,但使用getPixels不行?
(之所以我不能使用Bitmap和Canvas,正如人们通常会使用的那样,如果我这样做,我们在某些设备上的本机用完了,显然,这对于释放本机内存非常懒惰是的,我正在使用Bitmap.recycle(),我将位图设置为null,我确保画布也设置为null。只有少数设备有问题,但足够我需要解决。)
答案 0 :(得分:1)
为什么你认为alpha不正确?我认为只交换红色和蓝色组件。这是因为android Bitmap以RGBA顺序存储像素,但OpenGL ES期望它们在BGRA中。见这里:http://developer.android.com/reference/android/graphics/Color.html
组件存储如下(α<24)| (红色&lt;&lt; 16)| (绿色&lt;&lt; 8)|蓝色
OpenGL期望颜色为(alpha <&lt; 24)| (蓝色&lt;&lt; 16)| (绿色&lt;&lt; 8)|红色。 所以只需交换蓝色和红色组件,你就可以了。
替代方法是使用GL_EXT_texture_format_BGRA888扩展名将纹理格式指定为GL_BGRA_EXT。
答案 1 :(得分:1)
如你所知,来自Android的Bitmap的像素将是ARGB,然后你将它们传递给glTexImage2D,它希望像素在RGBA中。我不确定OpenGL是否支持ARGB类型输入,否则您可以执行以下操作:
GLES20.glTexImage2D( GLES20.GL_TEXTURE_2D,
0,
GLES20.GL_RGBA,
width2,
height2,
0,
GLES20.GL_ARGB, /** THIS ONE **/
GLES20.GL_UNSIGNED_BYTE,
pixelsBuffer );
否则,在将其输入GL之前,您必须重新安排从Bitmap到RGBA的内容。