Проблемы Орто Проекции с OpenGL ES - PullRequest
1 голос
/ 07 марта 2011

Я работаю в Android, используя Open GL ES.Я пытался переместить наш пользовательский интерфейс из Android Views в 3D.Я вижу странное поведение с размещением вершин.

У меня есть два разных квада.Один -0,5, -0,5 -> 0,5,0,5, а другой - 0,0 -> 1,1, но когда я их рендеринг, они оба появляются друг над другом.Как будто они оба были 0,0 -> 1,1 (проекция Орто установлена ​​от 0,0 до 1,1).Они оба отправляются по одному и тому же конвейеру, поэтому я не уверен, как это может произойти.

Еще одна странная и, возможно, связанная с этим проблема.Если дать одному из четырех квадратов перевод 0,5, он перемещается целиком по экрану, а не на полпути, как я ожидал, с проекцией 0,0 -> 1,1.

Вот некоторые фрагменты изJava ...

// Класс с фиксированной точкой public static final int FIXED_POINT = 16;

public static final int ONE = (1 << FIXED_POINT);
public static final int HALF = (ONE >> 1);

// Настройка вершины mNumVerts = 6;

    ByteBuffer vbb = ByteBuffer.allocateDirect( mNumVerts * 2 * 4 );
    vbb.order( ByteOrder.nativeOrder() );
    mVtxBuf = vbb.asIntBuffer();

    vbb = ByteBuffer.allocateDirect( mNumVerts * 2 * 4 );
    vbb.order( ByteOrder.nativeOrder() );
    mTexBuf = vbb.asIntBuffer();

    mVtxBuf.put( -Fixed32.HALF ); mVtxBuf.put( -Fixed32.HALF ); mTexBuf.put( 0 ); mTexBuf.put( Fixed32.ONE );
    mVtxBuf.put(  Fixed32.HALF ); mVtxBuf.put( -Fixed32.HALF ); mTexBuf.put( Fixed32.ONE ); mTexBuf.put( Fixed32.ONE );
    mVtxBuf.put(  Fixed32.HALF ); mVtxBuf.put(  Fixed32.HALF ); mTexBuf.put( Fixed32.ONE ); mTexBuf.put( 0 );

    mVtxBuf.put( -Fixed32.HALF ); mVtxBuf.put( -Fixed32.HALF ); mTexBuf.put( 0 ); mTexBuf.put( Fixed32.ONE );
    mVtxBuf.put(  Fixed32.HALF ); mVtxBuf.put(  Fixed32.HALF ); mTexBuf.put( Fixed32.ONE ); mTexBuf.put( 0 );        
    mVtxBuf.put( -Fixed32.HALF ); mVtxBuf.put(  Fixed32.HALF ); mTexBuf.put( 0 ); mTexBuf.put( 0 );

    mVtxBuf.position( 0 );        
    mTexBuf.position( 0 );

//and....

    mVtxBuf.put( 0 ); mVtxBuf.put( 0 ); mTexBuf.put( 0 ); mTexBuf.put( Fixed32.ONE );
    mVtxBuf.put( Fixed32.ONE ); mVtxBuf.put( 0 ); mTexBuf.put( Fixed32.ONE ); mTexBuf.put( Fixed32.ONE );
    mVtxBuf.put( Fixed32.ONE ); mVtxBuf.put( Fixed32.ONE ); mTexBuf.put( Fixed32.ONE ); mTexBuf.put( 0 );

    mVtxBuf.put( 0 ); mVtxBuf.put( 0 ); mTexBuf.put( 0 ); mTexBuf.put( Fixed32.ONE );
    mVtxBuf.put( Fixed32.ONE ); mVtxBuf.put( Fixed32.ONE ); mTexBuf.put( Fixed32.ONE ); mTexBuf.put( 0 );        
    mVtxBuf.put( 0 ); mVtxBuf.put( Fixed32.ONE ); mTexBuf.put( 0 ); mTexBuf.put( 0 );

    mVtxBuf.position( 0 );        
    mTexBuf.position( 0 );

// Настройка проекции

                gl.glMatrixMode( GL10.GL_PROJECTION );
                gl.glLoadIdentity();
                gl.glOrthox( 0, Fixed32.ONE, 0, Fixed32.ONE, -Fixed32.ONE, Fixed32.ONE );

// Визуализация

                {
                    gl.glDisableClientState( GL10.GL_NORMAL_ARRAY );

                    gl.glScalef( thing.getXScale(), thing.getYScale(), thing.getZScale() );
                    gl.glTranslatef( thing.getX(), thing.getY(), thing.getZ() );

                    gl.glFrontFace( GL10.GL_CW );
                    gl.glVertexPointer( 2, GL10.GL_FIXED, 0, mdl.getVtxBuf() );
                }


                gl.glTexCoordPointer( 2, GL10.GL_FIXED, 0, mdl.getTexBuf() );
                // gl.glColorPointer( 4, GL10.GL_FLOAT, 0, mColorBuffer );
                gl.glDrawArrays( GL10.GL_TRIANGLES, 0, mdl.getVtxCount() );    

1 Ответ

1 голос
/ 07 марта 2011

Как многие из вас, возможно, догадались, я, должно быть, что-то упустил. Вершины редактировались в моем суперклассе объектов для каждого кадра отдельно для решения старой проблемы с соотношением сторон. Таким образом, вершины на самом деле не были -.5, -. 5 - .5, .5, все они были сброшены до 0,0-1,1. Спасибо за время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...