glReadPixels之后为什么相同的纹理不同? (sameAs-> true但等于 - > false)

时间:2015-01-13 09:01:22

标签: android opengl-es bitmap opengl-es-2.0 post-processing

我试图使用opengles 2.0比较2个纹理[希望它们完全相同]。这是为了分析我的后期处理结果。

所以,基本上,我使用了两次下面的片段着色器(一次绑定到帧缓冲区,然后再次渲染到屏幕上)。

precision lowp float;

uniform sampler2D u_Texture0;
uniform vec2 u_sizeVideo;

varying vec3 v_texCoord;

void main()
{
    vec2 vCoord = gl_FragCoord.st/ u_sizeVideo.st;

    gl_FragColor = texture2D(u_Texture0,vCoord);
}

我渲染的图片与GLSurfaceView的大小相同(即:1280 * 720)。然后我使用glReadPixels读取结果并创建相应的位图。然后我再次创建位图,但这次使用原始图片

        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inDensity=320; //i have double checked that this is the same density as from the bmpGPU
        options.inMutable=true; //same here, trying to manually set all options so the 2 bmp are identical
        final int resourceId=R.drawable.mypic;

        final Bitmap bmpCPU = BitmapFactory.decodeResource(mActivityContext.getResources(), resourceId, options);
        ByteBuffer buff1=ByteBuffer.allocateDirect(imgWidth * imgHeight * 4).order(ByteOrder.LITTLE_ENDIAN);;
        bmpCPU.copyPixelsToBuffer(buff1);
        buff1.rewind();

        final Bitmap bmpGPU = Bitmap.createBitmap(imgWidth, imgHeight,Config.ARGB_8888); 
        ByteBuffer buff2=ByteBuffer.allocateDirect(imgWidth * imgHeight * 4).order(ByteOrder.LITTLE_ENDIAN);
        GLES20.glReadPixels(0, 0, imgWidth, imgHeight, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE,buff2);
        buff2.rewind();
        bmpGPU.copyPixelsFromBuffer(flipByteBuffer(buff2));// the flip function works as expected

        storeImage(bmpGPU,"gpu");
        storeImage(bmpCPU,"cpu");

所以值得注意的是,尽管2位图看起来相同,但它们的大小并不相同。原始的是40Kb,而GPU的是45Kb。

顺便说一句,我还将过滤设置为我认为最合适的过滤器:

GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_REPEAT);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_REPEAT);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);

任何建议都会受到欢迎。

0 个答案:

没有答案