Я работаю в Android, используя Open GL ES. Я пытался переместить наш пользовательский интерфейс из представлений Android в 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 );
//и....
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() );