Масштабирование заданного идентификатора текстуры с использованием opengl es - PullRequest
0 голосов
/ 16 марта 2020

Я получаю идентификатор текстуры с разрешением 1080 X 720, но я хочу масштабировать его, я изменю его на разрешение 768 X 432, я пробую этот код, но не получилось. Кто-нибудь сталкивался с такой же проблемой?

  1. Сначала я создаю новый идентификатор текстуры и кадровый буфер и выделяю память
  2. Привязываем данный идентификатор текстуры и рисуем его на новом идентификаторе текстуры
  3. нужна новая текстура

Вот код:

 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;
            }
...