Android проблема рисования растрового изображения с OpenGLES - PullRequest
1 голос
/ 21 июля 2011

Я использую https://github.com/markfguerra/GLWallpaperService/, чтобы сделать живые обои для Android.Я пытаюсь загрузить png-файл в качестве полноэкранного фона, но в настоящее время все, что я получаю, это черный экран.

Я искал несколько дней, но все еще не обнаружил проблему.Я делаю следующее:

public void onSurfaceCreated(GL10 gl, EGLConfig config)
{
        gl.glEnable(GL10.GL_TEXTURE_2D);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
}

и каждый кадр:

public void onDrawFrame(GL10 gl)
{
        Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.target00074);
        int[] textures = new int[1];
        gl.glGenTextures(1, textures, 0);
        gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); 
}

Ответы [ 4 ]

3 голосов
/ 21 июля 2011

Я бы действительно рекомендовал погрузиться в основы OpenGL, так как вы, похоже, не знаете, что делаете.Экран черный, потому что вы просто загружаете текстуру (что-то, что вы должны делать при инициализации, а не каждый кадр), а на самом деле ничего не рисуете.Для начала вам нужно будет определить несколько массивов, определяющих положение вершин и текстур.См. http://blog.jayway.com/2009/12/04/opengl-es-tutorial-for-android-%E2%80%93-part-ii-building-a-polygon/

Что касается полноэкранного фона, вы бы создали один многоугольник с вашей текстурой

2 голосов
/ 24 июля 2011
0 голосов
/ 21 июля 2011

Я понимаю, что этот ответ на самом деле не касается рассматриваемого вопроса.Проголосуй, если надо.

Если все, что вам нужно, это нарисовать полноэкранное фоновое изображение, вам не нужен OpenGL.Вы не работаете в 3D, и статическое фоновое изображение не нужно обновлять очень часто (особенно не 30-60 раз в секунду!), Поэтому использование OpenGL приведет к потере батареи.Лучшее решение - взглянуть на соответствующие примеры кода и документацию , где вы увидите, что все, что вам действительно нужно, это скопировать и вставитьПример CubeWallpaper, но измените drawFrame (), чтобы он выглядел следующим образом:

    void drawFrame() {
        final SurfaceHolder holder = getSurfaceHolder();

        Canvas c = null;
        try {
            c = holder.lockCanvas();
            if (c != null) {
                // draw something
                c.drawBitmap(myBitmap, myMatrix, myPaint);
            }
        } finally {
            if (c != null) holder.unlockCanvasAndPost(c);
        }

        // Reschedule the next redraw
        mHandler.removeCallbacks(mDrawCube);
        if (mVisible) {
            mHandler.postDelayed(mDrawCube, 1000 / 25);
        }
    }

, где myBitmap, myMatrix и myPaint Битовая карта , Matrix и Раскрасить объекты, которые были инициализированы ранее.

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

Надеюсь, это поможет

0 голосов
/ 21 июля 2011

Две основные ошибки, когда текстуры не работают:

  • Ширина / высота текстуры должна быть степенью двойки, если только устройство не поддерживает расширение, которое смягчает это требование.
  • Установите для TEXTURE_MIN_FILTER что-то вроде NEAREST или LINEAR, по умолчанию используется mipmapped, и это приводит к неполным текстурам, если вы не предоставите mipmaps.

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

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