Я получаю идентификатор текстуры с разрешением 1080 X 720, но я хочу масштабировать его, я изменю его на разрешение 768 X 432, я пробую этот код, но не получилось. Кто-нибудь сталкивался с такой же проблемой?
- Сначала я создаю новый идентификатор текстуры и кадровый буфер и выделяю память
- Привязываем данный идентификатор текстуры и рисуем его на новом идентификаторе текстуры
- нужна новая текстура
Вот код:
public void initCameraFrameBuffer(int width, int height) {
//iput width is 432, input height is 768
if(mFrameBuffers != null && (mFrameWidth != width || mFrameHeight != height))
destroyFramebuffers();
if (mFrameBuffers == null) {
mFrameWidth = width;
mFrameHeight = height;
mFrameBuffers = new int[1];
mFrameBufferTextures = new int[1];
//Get the frame buffer
GLES20.glGenFramebuffers(1, mFrameBuffers, 0);
//Get the gexture
GLES20.glGenTextures(1, mFrameBufferTextures, 0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mFrameBufferTextures[0]);
//Allocate memory of the frame
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width, height, 0,
GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null);
//Set the Mag and Min , the scale aglorithm
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
//Bind texture and buffer
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, mFrameBuffers[0]);
GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0,
GLES20.GL_TEXTURE_2D, mFrameBufferTextures[0], 0);
//Reset context
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
}
}
//Input param is the textureId, and I want to scale it to a small frame.
public int onDrawFrame(int textureId) {
//Here are the opengl es code
GLES20.glUseProgram(mGLProgId);
if(!isInitialized()) {
return OpenGlUtils.NOT_INIT;
}
//point init
mGLCubeBuffer.position(0);
GLES20.glVertexAttribPointer(mGLAttribPosition, 2, GLES20.GL_FLOAT, false, 0, mGLCubeBuffer);
GLES20.glEnableVertexAttribArray(mGLAttribPosition);
mGLTextureBuffer.position(0);
// fragment init
GLES20.glVertexAttribPointer(mGLAttribTextureCoordinate, 4, GLES20.GL_FLOAT, false, 0, mGLTextureBuffer);
GLES20.glEnableVertexAttribArray(mGLAttribTextureCoordinate);
GLES20.glUniformMatrix4fv(mTextureTransformMatrixLocation, 1, false, mTextureTransformMatrix, 0);
//Null texture check and init
if(textureId != OpenGlUtils.NO_TEXTURE){
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textureId);
GLES20.glUniform1i(mGLUniformTexture, 0);
}
//Draw the texture
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
GLES20.glDisableVertexAttribArray(mGLAttribPosition);`enter code here`
GLES20.glDisableVertexAttribArray(mGLAttribTextureCoordinate);
GLES20.glBindTexture(GLES11Ext.TEXTURE_2D, 0);
return OpenGlUtils.ON_DRAWN;
}