Странная проблема OpenGL: размер экрана на устройстве 480x854, обрезанное изображение с разницей в 1 пиксель, что случилось? - PullRequest
0 голосов
/ 23 октября 2011

Я работаю над своей игрой на Android, использую развивающую 2D-игру OpenGL, работающую на устройстве 320x480, работало. (Нет поломок)

К сожалению, проблема с моей защитой Motorola (480x854), похоже на настройку UVточечный объект с разницей в 1 пиксель (отклонение на 1 пиксель вверх или вниз).

SurfaceChanged, ширина возврата 320, высота 569 AndroidManifest anyDensity устанавливает значение false

Ниже двух изображений имеют два прямоугольника, слеваодин - исходное изображение (w = 36, h = 35), без кадрирования;средний - клип по uv, рисование от px1 и обрезка только шириной 34px, высотой 33px, правый один очень длинный прямоугольник, рисование сверху вниз от px0 до px480 шириной 34px, высота 1px, извините за виртуальный код, но вы знаете, что я имею в виду,

Моя предыдущая игра написана в SurfaceView, работала с размерами 320x480, 480x800, 480x854 и 1024x768.

Картинка выглядит как работа, ширина заполнена, но снизу больше всего пусто.

Если я вставлю ш = 320;ч = 480;до GLUgluOrtho2D в SurfaceChanged, некоторые объекты работают (которые не используют кадрирование УФ)

image1 http://i1105.photobucket.com/albums/h355/ch_mac/device_str5.png

Результат, который я хотел бы:

wantedresult http://i1105.photobucket.com/albums/h355/ch_mac/device_str6.png

Мой метод рисования текстуры:

public void draw(int from_x,int from_y,int w,int h,int pos_x,int pos_y)
{

          bind();
          float texW=(float)mPow2Width;  
          float texH=(float)mPow2Height;

          float minU= from_x/texW;
          float maxU = (from_x+w)/texW;        
          float minV= from_y/texH;        
          float maxV = (from_y+h)/texH;
           float verticleBuffer[] = {
               x,  y,
             x+w,  y,
               x, y+h,
             x+w, y+h,
           };
           float coordBuffer[] = {
            minU, minV,
            maxU, minV,
            minU, maxV,
            maxU, maxV, 
    };

FloatBuffer     m_vertexBuffer;
    FloatBuffer     m_textureBuffer;
    ByteBuffer l_byteBuf;
    l_byteBuf = ByteBuffer.allocateDirect( verticleBuffer.length * 4 );
    l_byteBuf.order( ByteOrder.nativeOrder() );
    m_vertexBuffer = l_byteBuf.asFloatBuffer();
    m_vertexBuffer.put( verticleBuffer );
    m_vertexBuffer.position( 0 );

    l_byteBuf = ByteBuffer.allocateDirect( coordBuffer.length * 4 );
    l_byteBuf.clear();
    l_byteBuf.order( ByteOrder.nativeOrder() );
    m_textureBuffer = l_byteBuf.asFloatBuffer();
    m_textureBuffer.put( coordBuffer );
    m_textureBuffer.position( 0 );

           gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, m_textureBuffer);
           gl.glVertexPointer(2, GL10.GL_FLOAT, 0, m_vertexBuffer);     
           gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,4);

}

SurfaceChanged:

public void onSurfaceChanged(GL10 gl, int w, int h) 
{
    gl.glViewport(0, 0, w, h);
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    float aspect_w=(float)h/(float)w;
    float aspect_h=(float)w/(float)h;       
    //w=320;
    //h=480;
    GLU.gluOrtho2D(gl, 0, w, h, 0);

gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
}

1 Ответ

0 голосов
/ 23 октября 2011

Поместите область просмотра и настройки проекции в обработчик чертежа. Это единственное место, где они на самом деле имеют смысл (как и большинство других операций OpenGL). Делать эти вещи где-то еще - кошмар для бухгалтерии, и он не приносит результатов.


РЕДАКТИРОВАТЬ: Другая проблема:

float verticleBuffer[] = {
           x,  y,
         x+w,  y,
           x, y+h,
         x+w, y+h,
       };
float coordBuffer[] = {
        minU, minV,
        maxU, minV,
        minU, maxV,
        maxU, maxV, 
}

Вы уверены, что ordBuffer правильно? Мне кажется, что последние две строки поменялись местами, то есть одна из них имела больше смысла:

float coordBuffer[] = {
        minU, minV,
        maxU, minV,
        maxU, maxV,
        minU, maxV, 
}
...