我试图使用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);
任何建议都会受到欢迎。