OpenGL ES 2.0 Richtiges pixelgenaues 2D



  • Hi, ich schaffe es einfach nicht Opengl ES 2.0 so zu initialisieren, dass ich pixelgenau z.B. Texturen rendern kann. Ich möchte das Display dabei mit (0,0) links oben und (1280,720) rechts unten ansprechen können. Eine Transformation um "1.0f" sollte die Textur also um 1nen Pixel verschieben. Mit Matrix.frustumM geht es aber sobald ich Matrix.orthoM nehme ist der screen schwarz. Mein Code sieht bislang so aus:

    private void InitOpenGLES20() {
            GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
            //GLES20.glShadeModel(GL_SMOOTH);
            GLES20.glEnable(GLES20.GL_DEPTH_TEST);
            GLES20.glDepthFunc(GLES20.GL_LEQUAL);
            //GLES20.glHint(GLES20.GL_PERSPECTIVE_CORRECTION_HINT, GLES20.GL_NICEST);
            GLES20.glEnable(GLES20.GL_TEXTURE_2D);
            //GLES20.glEnable(GL_LIGHTING);
            //GLES20.glEnable(GL_COLOR_MATERIAL);
            GLES20.glEnable(GLES20.GL_CULL_FACE);
            GLES20.glCullFace(GLES20.GL_BACK);
            GLES20.glFrontFace(GLES20.GL_CCW);
            GLES20.glEnable(GLES20.GL_BLEND);
            GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);
            //GLES20.glEnable(GLES20.GL_ALPHA_TEST);
            //GLES20.glAlphaFunc(GL_ALWAYS, 0.1f);
        }
    
    public void onSurfaceChanged(GL10 unused, int width, int height) {
            GLES20.glViewport(0, 0, (int) width, (int) height);
            float ratio = (float) (width / height);
            Matrix.orthoM(_projectionMatrix, 0, -ratio, ratio, -1, 1,
                    0.1f, 100.0f);
            /*Matrix.frustumM(_projectionMatrix, 0, -ratio, ratio, -1, 1,
                    0.1f, 100.0f);*/
            Matrix.setLookAtM(_viewMatrix, 0, 0, 0, -40.0, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
        }
    
    private Texture t1;
        private float[] _mvpMatrix = new float[16];
        private float[] _projectionMatrix = new float[16];
        private float[] _viewMatrix = new float[16];
        private float[] _rotationMatrix = new float[16];
    
        @Override
        public void onDrawFrame(GL10 unused) {
            GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
            Matrix.multiplyMM(_mvpMatrix, 0, _projectionMatrix, 0, _viewMatrix, 0);
            if (_level != null) {
                _level.Draw(mvpMatrix);
            }
            if (t1 != null) {
                t1.Draw(_mvpMatrix);
            }
            else {
                Bitmap bitmap = BitmapFactory.decodeResource(MyApplication.getContext().getResources(), R.raw.ic_launcher);
                t1 = new Texture(bitmap);
            }
        }
    


  • Achso und die Shader:

    public static final String vs_Image =
                "uniform mat4 uMVPMatrix;" +
                "attribute vec4 vPosition;" +
                "attribute vec2 a_texCoord;" +
                "varying vec2 v_texCoord;" +
                "void main() {" +
                "  gl_Position = uMVPMatrix * vPosition;" +
                "  v_texCoord = a_texCoord;" +
                "}";
    
        public static final String fs_Image =
                "precision mediump float;" +
                "varying vec2 v_texCoord;" +
                "uniform sampler2D s_texture;" +
                "void main() {" +
                "  gl_FragColor = texture2D( s_texture, v_texCoord );" +
                "}";
    

Anmelden zum Antworten