Почему текстура OpenGL отрисовывается нормально при работе с отладчиком в Eclipse, но отображается белым при запуске приложения самостоятельно? - PullRequest
1 голос
/ 23 февраля 2012

У меня есть класс sprite и другой класс, который расширяет класс sprite, используя представление OpenGLSurvace для визуализации. Это выглядит примерно так

public class Invader extends Sprite {

    static int mTextureId = -1;

    Invader(Context context, float x, float y, float angle)
    {
        super(context, x, y, angle);
        super.setSize(width, height);
//      super.setPos(x, y);
//      super.setAngle(angle);

        // Check to see if the texture is loaded already.  If it is a valid texture
        // id, don't bother loading it again
        if (mTextureId < 0)
        {
            super.loadBitmap(context.getResources(), R.drawable.piano_key_white);
        }
        else
        {
            super.setTexture(mTextureId);
        }
    }

    @Override
    protected int getTexture()
    {
        return mTextureId;
    }

    @Override
    protected void setTexture(int textureId)
    {
        mTextureId = textureId; 
    }

}

Как видите, он использует статический указатель на текстуру, которая загружается функцией loadBitmap, которая вызывает функцию decodeResource для создания текстуры OpenGL. Когда я запускаю приложение из отладчика через Eclipse с плагином SDK, все выглядит отлично. Когда я обычно запускаю приложение на телефоне, все отображается нормально, кроме этого класса, который отображает Invader в виде белого квадрата (который является цветом объекта).

Из того, что я обнаружил, текстура, вероятно, загружается неправильно, поэтому рисуется простой белый квадрат. Я не могу понять, почему это работает в Debug, а не во время нормального выполнения. Есть идеи? Что отличается, если программа не запускается с удаленной отладкой?

Ответы [ 5 ]

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

Вот что вам нужно сделать:

  1. Поместите текстуру в папку "res / drawable"
  2. Отключить масштабирование текстуры во время загрузки, код для вас:

Распределение массива текстур (duh;))

// Texture and geometry data
private int [] m_textureID = new int[1];

и загрузка:

        // Load the texture from resource
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inScaled = false;
    Bitmap bitmap = BitmapFactory.decodeResource(m_resources, R.drawable.tex, options);

    gl.glGenTextures(1, m_textureID, 0);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, m_textureID[0]);
    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);
    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);

    // Free resources
    bitmap.recycle();

    // Do some error checking
    if(m_textureID[0] == 0)
        throw new RuntimeException("Error loading texture!");
1 голос
/ 08 марта 2012

Я понял это;и я думаю, что это хороший урок для изучения.Мой класс выглядел примерно так:

public class Sprite {
    private static int mTextureID = -1;
    private static boolean mShouldLoadTexture = true;
...
    onReder(GL10 gl) {
         if (mShouldLoadTexture) {
               mTextureID = loadTexture(gl, someBitmap);
               mShouldLoadTexture = false;
         }
    }
}

Другой статический класс содержал список спрайтов

public static class SpriteList {
    private static Vector<Sprite> mSprites;
    ...
}

Разница между тем, когда я запускал его как отладочный, а не просто запускал его из модуля запускана телефоне то, что в пакете все классы static сброшены, тогда как на телефоне запуска не сбрасываются классы static , обязательно.

Итак,когда я впервые запустил его как debug , класс увидит, что ему нужно загрузить текстуру, затем выделит указатель текстуры в объекте GL10 и присвоит его static mTextureID,В этот момент mTextureID содержит действительный указатель текстуры GL.

Теперь я бы завершил отладку, отключился от затмения и запустил модуль запуска на моем телефоне.Поскольку контейнер класса Sprite не был сброшен, mTextureID все еще имел некоторое значение, указывающее на несуществующий идентификатор текстуры GL.Кроме того, mShouldLoadTexture будет оставаться «ложным», что означает, что класс не будет пытаться перезагрузить текстуру из растрового изображения.Таким образом, onRender () попытается использовать указатель на недопустимый идентификатор текстуры и вместо этого отобразит белое поле.

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

0 голосов
/ 25 июля 2016

У меня была похожая проблема, проблема была в том, что запуск при подключении к adb изобрел некоторые задержки.Из-за этой задержки мое приложение работало только в очень специфических условиях и вообще не работало без этих задержек.Я надеюсь, что это может кому-то помочь.

0 голосов
/ 27 марта 2013

У меня была такая же проблема. Для меня мои текстуры будут загружаться при первом запуске приложения в режиме отладки, но если я выйду из приложения и снова открою его, все мои текстуры исчезнут. Я не смог загрузить текстуры, пока не запустил приложение снова из моей IDE.

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

Я до сих пор точно не понимаю, почему наличие статических полей вызывает это.

И для записи ДА мои текстуры имели размеры степеней 2, и я поместил их в папку drawable-nodpi.

0 голосов
/ 23 февраля 2012

Убедитесь, что размеры текстур имеют степень 2. Различные устройства не будут корректно загружать текстуры, если они не соответствуют этим параметрам.

IE

1x2 2x2 512x256 128x128 и т. Д.

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