位图在opengl es android曲面中不必要缩放

问题描述

我正在尝试在glsurfaceview上显示位图图像,并且能够做到这一点。 我正在从文件读取的位图及其需要放置的位置。

我的屏幕是2324x1080 我正在尝试在中心绘制一个90x60的小位图,但它比原本应该的要大得多。

对此没有任何解释,我也不愿意将其缩放,因为实际上我不知道什么是缩放的位图。

这是我的代码: GLSL:

    public static final String VERTEX_SHADER_CODE =
            "uniform mat4 " + MVPMATRIX_ParaM + ";" +
                    "attribute vec4 " + POSITION_ParaM + ";" +
                    "attribute vec2 " + TEXTURE_COORDINATE_ParaM + ";" +
                    "varying vec2 vTexCoordinate;" +
                    "void main() {" +
                    "  gl_Position = " + MVPMATRIX_ParaM + " * " + POSITION_ParaM + ";" +
                    "  vTexCoordinate = " + TEXTURE_COORDINATE_ParaM + ";" +
                    "}";
    public static final String FRAGMENT_SHADER_CODE =
            "precision mediump float;" +
                    "uniform sampler2D uTexture;" +
                    "varying vec2 vTexCoordinate;" +
                    "void main() {" +
                    "  gl_FragColor = texture2D(uTexture,vTexCoordinate); " +
                    "}";

Init GL


    public static void initGL() {
        // initialize vertex byte buffer for shape coordinates
        ByteBuffer bb = ByteBuffer.allocateDirect(SQUARE_COORDINATES.length * 4);
        bb.order(ByteOrder.nativeOrder());
        _vertexBuffer = bb.asFloatBuffer();
        _vertexBuffer.put(SQUARE_COORDINATES);
        _vertexBuffer.position(0);

        // initialize texture byte buffer for texture coordinates
        bb = ByteBuffer.allocateDirect(TEXTURE_COORDINATES.length * 4);
        bb.order(ByteOrder.nativeOrder());
        _textureBuffer = bb.asFloatBuffer();
        _textureBuffer.put(TEXTURE_COORDINATES);
        _textureBuffer.position(0);

        // initialize byte buffer for the draw list
        ByteBuffer dlb = ByteBuffer.allocateDirect(DRAW_ORDER.length * 2);
        dlb.order(ByteOrder.nativeOrder());
        _drawListBuffer = dlb.asShortBuffer();
        _drawListBuffer.put(DRAW_ORDER);
        _drawListBuffer.position(0);

        int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER,VERTEX_SHADER_CODE);
        int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER,FRAGMENT_SHADER_CODE);
        _programHandle = GLES20.glCreateProgram();             // create empty OpenGL Program
        GLES20.glAttachShader(_programHandle,vertexShader);   // add the vertex shader to program
        GLES20.glAttachShader(_programHandle,fragmentShader); // add the fragment shader to program

        GLES20.glBindAttribLocation(_programHandle,TEXTURE_COORDINATE_ParaM);
        GLES20.glLinkProgram(_programHandle);

        positionHandle = GLES20.glGetAttribLocation(_programHandle,POSITION_ParaM);
        textureCoordinateHandle = GLES20.glGetAttribLocation(_programHandle,TEXTURE_COORDINATE_ParaM);
        mvpMatrixHandle = GLES20.glGetUniformlocation(_programHandle,MVPMATRIX_ParaM);

绘图功能(loadGLTexture方法获得90x60尺寸的位图)


    protected int loadGLTexture(Bitmap bitmap)
    {
        Integer cachedTextureId = bitmapToTextureMap.get(bitmap.hashCode());
        if (cachedTextureId != null)
        {
            return cachedTextureId;
        }

        imageRatio = bitmap.getWidth() / ((float) bitmap.getHeight());

        // generate one texture pointer and bind it to our handle
        int[] textureHandle = new int[1];
        GLES20.glGenTextures(1,textureHandle,0);
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,textureHandle[0]);

        // create nearest filtered texture
        GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_MIN_FILTER,GLES20.GL_NEAREST);
        GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_MAG_FILTER,GLES20.GL_LINEAR);

        // Use Android glutils to specify a two-dimensional texture image from our bitmap
        glutils.texImage2D(GLES20.GL_TEXTURE_2D,GLES20.GL_RGBA,bitmap,0);

        bitmapToTextureMap.put(bitmap.hashCode(),textureHandle[0]);
        bitmap.recycle();

        return textureHandle[0];
}


    public void draw (Point viewPos)
    {
//        float[] curPos = pos.plus(viewPos).plus(origin).toglratio();
//        float[] curPos = pos.plus(origin).toglratio();
        float[] curPos = origin.toglratio();
        float[] scratchmatrix = new float[16];;
        System.arraycopy(GLState._MVPMatrix,scratchmatrix,16);

        // Add program to OpenGL environment
        GLES20.gluseProgram(GLState._programHandle);

        // Enable a handle to the vertices
        GLES20.glEnabLevertexAttribArray(GLState.positionHandle);

        // Prepare the coordinate data
        GLES20.glVertexAttribPointer(GLState.positionHandle,GLState.COORDS_PER_VERTEX,GLES20.GL_FLOAT,false,GLState.VERTEX_STRIDE,GLState._vertexBuffer);

        GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,_textureDataHandle);

        GLState._textureBuffer.position(0);
        GLES20.glEnabLevertexAttribArray(GLState.textureCoordinateHandle);
        GLES20.glVertexAttribPointer(GLState.textureCoordinateHandle,2,GLState._textureBuffer);

        // translate the sprite to it's current position
//        Matrix.translateM(scratchmatrix,curPos.x,curPos.y,0.1f);
        Matrix.translateM(scratchmatrix,curPos[0],curPos[1],1f);

        // rotate the sprite
        Matrix.rotateM(scratchmatrix,_rotationZ,1.0f);
        // scale the sprite
        Matrix.scaleM(scratchmatrix,scale[0],scale[1],1);

        // Apply the projection and view transformation
        GLES20.gluniformMatrix4fv(GLState.mvpMatrixHandle,1,0);

        // Draw the sprite
        GLES20.glDrawElements(GLES20.GL_TRIANGLES,GLState.DRAW_ORDER.length,GLES20.GL_UNSIGNED_SHORT,GLState._drawListBuffer);

        // disable vertex array
        GLES20.gldisabLevertexAttribArray(GLState.positionHandle);
        GLES20.gldisabLevertexAttribArray(GLState.textureCoordinateHandle);
    }

任何帮助将不胜感激,我正在看书,但它也在其中的示例中发生,并且找不到解决该问题的问题。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)