Выпуск OpenGL на Galaxy S - PullRequest
       38

Выпуск OpenGL на Galaxy S

1 голос
/ 21 марта 2012

Я пытался создать себе небольшой игровой фреймворк, чтобы поиграть с написанием некоторых базовых игр для Android. Я тестировал на Sony Arc и Galaxy SII без каких-либо проблем, но недавно у меня был кто-то с Galaxy S, который проводил некоторые тесты для меня, и результаты были плохими.

Первый запуск Я не установил размеры изображений в степени 2 или квадрат, поэтому большая часть графического интерфейса представляла собой просто большие белые квадраты. Поэтому я изменил размеры всех своих изображений до степени 2 и квадрата, чтобы избавиться от каких-либо проблем там, и это исправило это для некоторых изображений, но я обнаружил, что некоторые объекты все еще отображаются в виде белой текстуры. Я могу сказать, что он рисует в соответствующем месте, потому что я вижу, как белая коробка вращается и движется, как и должно быть в игре.

Я подумал, что это может быть проблема с 32-битными изображениями, поэтому я взял все свои изображения и уменьшил их до 8 бит, и результаты остались прежними, кажется, что работает только около половины текстур. Я также видел где-то, где упоминалась папка drawable-nodpi, поэтому я переместил все свои изображения из других папок и поместил их туда, чтобы попробовать это (те же результаты)

Я смотрел этот учебник, и это было то, что я использовал, чтобы основывать свой код рисования на этом http://obviam.net/index.php/texture-mapping-opengl-android-displaying-images-using-opengl-and-squares/

Но что-то, что я добавил или изменил, должно быть испортило, я включил свой код ниже, что-нибудь выскакивает у кого-то, кого я пропустил или сделал неправильно?

Здесь создается мой рендерер

public void onSurfaceCreated(GL10 gl, EGLConfig config) 
{        
    gl.glEnable(GL10.GL_TEXTURE_2D);            //Enable Texture Mapping
    gl.glShadeModel(GL10.GL_SMOOTH);            //Enable Smooth Shading
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);    //Black Background
    gl.glClearDepthf(1.0f);                     //Depth Buffer Setup
    gl.glEnable(GL10.GL_DEPTH_TEST);            //Enables Depth Testing
    gl.glDepthFunc(GL10.GL_LEQUAL);             //The Type Of Depth Testing To Do
    //Really Nice Perspective Calculations
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); 
    // for transparency     
    gl.glEnable(GL10.GL_BLEND); 
    gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA); 
}

Вот где я загружаю текстуру

public void loadGLTexture(GL10 gl, Context context, int resourceId) 
{
    // loading texture
    Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),    resourceId);

    mImageWidth = bitmap.getWidth();
    mImageHeight = bitmap.getHeight();

    // generate one texture pointer
    gl.glGenTextures(1, textures, 0);
    // ...and bind it to our array
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);

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

    //Different possible texture parameters, e.g. GL10.GL_CLAMP_TO_EDGE
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);//i added
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);//i added


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

    // Clean up
    bitmap.recycle();
}

И здесь я делаю свою ничью

public void draw(GL10 gl, float x, float y, float z, float angle, float percentageScale) {
    gl.glPushMatrix();              
    gl.glLoadIdentity();

    gl.glTranslatef(x,y,z);                            

    gl.glScalef(mXScale*percentageScale, mYScale*percentageScale, 1);

    gl.glRotatef(angle, 0, 0, 1);

    // bind the previously generated texture
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);

    // Point to our buffers
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

    // Set the face rotation
    gl.glFrontFace(GL10.GL_CW);

    // Point to our vertex buffer
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);

    // Draw the vertices as triangle strip
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length / 3);

    //Disable the client state before leaving
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

    gl.glPopMatrix();
}

У меня есть базовый класс (называемый текстурами), который рисует для всех моих спрайтов, но по какой-то причине некоторые из них просто не рисуются на Galaxy S, и я в итоге получаю для них белые коробки.

Есть идеи?

PS Советы о лучших способах сделать это, безусловно, приветствуются, я буду первым, кто признает, что я новичок в OpenGL

...