public
Bitmap renderBitmap(Bitmap bitmap) {
synchronized
(
this
) {
int
width = bitmap.getWidth();
int
height = bitmap.getHeight();
int
[] textureName =
new
int
[
1
];
GLES20.glGenTextures(textureName.length, textureName,
0
);
GLES20.glActiveTexture(GLES20.GL_TEXTURE1);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureName[
0
]);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D,
0
, bitmap,
0
);
int
[] renderBuffer =
new
int
[
3
];
GLES20.glGenRenderbuffers(renderBuffer.length, renderBuffer,
0
);
GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, renderBuffer[
0
]);
GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, GLES20.GL_RGBA, width, height);
int
[] frameBuffer =
new
int
[
1
];
GLES20.glGenFramebuffers(frameBuffer.length, frameBuffer,
0
);
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, frameBuffer[
0
]);
GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, textureName[
0
],
0
);
GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_RENDERBUFFER, renderBuffer[
0
]);
GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER, GLES20.GL_DEPTH_ATTACHMENT, GLES20.GL_RENDERBUFFER, renderBuffer[
1
]);
GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER, GLES20.GL_STENCIL_ATTACHMENT, GLES20.GL_RENDERBUFFER, renderBuffer[
2
]);
GLES20.glUseProgram(mProgramImage);
int
positionHandle = GLES20.glGetAttribLocation(mProgramImage,
"vPosition"
);
GLES20.glEnableVertexAttribArray(positionHandle);
GLES20.glVertexAttribPointer(positionHandle,
3
, GLES20.GL_FLOAT,
false
,
0
, mVertexBuffer);
int
texCoordHandle = GLES20.glGetAttribLocation(mProgramImage,
"vTexCoord"
);
GLES20.glEnableVertexAttribArray(texCoordHandle);
GLES20.glVertexAttribPointer(texCoordHandle,
2
, GLES20.GL_FLOAT,
false
,
0
, mTexCoordBuffer);
int
bright = GLES20.glGetUniformLocation(mProgramImage,
"brightness"
);
int
contr = GLES20.glGetUniformLocation(mProgramImage,
"contrast"
);
int
satur = GLES20.glGetUniformLocation(mProgramImage,
"saturation"
);
int
tintr = GLES20.glGetUniformLocation(mProgramImage,
"tintR"
);
int
tintg = GLES20.glGetUniformLocation(mProgramImage,
"tintG"
);
int
tintb = GLES20.glGetUniformLocation(mProgramImage,
"tintB"
);
GLES20.glUniform1f(bright, mCameraParams.mBrightness /
200
.0f);
GLES20.glUniform1f(contr, mCameraParams.mContrast /
200
.0f);
GLES20.glUniform1f(satur, (mCameraParams.mSaturation +
100
) /
100
.0f);
GLES20.glUniform1f(tintr, mCameraParams.mTintR /
200
.0f);
GLES20.glUniform1f(tintg, mCameraParams.mTintG /
200
.0f);
GLES20.glUniform1f(tintb, mCameraParams.mTintB /
200
.0f);
GLES20.glActiveTexture(GLES20.GL_TEXTURE1);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureName[
0
]);
GLES20.glDrawElements(GLES20.GL_TRIANGLES, mDrawOrder.length, GLES20.GL_UNSIGNED_SHORT, mDrawListBuffer);
GLES20.glDisableVertexAttribArray(positionHandle);
GLES20.glDisableVertexAttribArray(texCoordHandle);
Log.i(
"CheckLog"
,
"Status of Framebuffer : "
+ GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER));
IntBuffer intBuffer = IntBuffer.allocate(width * height);
GLES20.glReadPixels(
0
,
0
, width, height, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, intBuffer);
int
[] intArrayO = intBuffer.array();
int
[] intArrayR =
new
int
[width * height];
for
(
int
i =
0
; i < height; i++) {
for
(
int
j =
0
; j < width; j++) {
intArrayR[(height - i -
1
) * width + j] = intArrayO[i * width + j];
}
}
Bitmap pBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
pBitmap.copyPixelsFromBuffer(intBuffer.wrap(intArrayR));
return
pBitmap;
}
}