Я пытался создать себе небольшой игровой фреймворк, чтобы поиграть с написанием некоторых базовых игр для 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