OpenGL 2D: glColor4 не имеет никакого эффекта - что я пропустил? - PullRequest
2 голосов
/ 27 июля 2011

Я портирую игру с WP7 XNA на Android; все работало с использованием Canvas, но это было слишком медленно, поэтому я перешел на OpenGL ES, следуя примерам Replica Island и SpriteMethodTest.

Моя проблема в том, что мои текстуры не окрашиваются и не делаются прозрачными, когда я устанавливаю glColor непосредственно перед рисованием текстуры - она ​​полностью игнорируется, и текстура отображается в том состоянии, в котором она была загружена. Вся информация о цвете и прозрачности, присущая самой текстуре, применяется правильно. Я также генерирую некоторые растровые изображения программно, используя setPixels, и у меня там точно такая же проблема.

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

glColor4 четко работает на острове реплики, когда я запускаю его в одном и том же эмуляторе, весь текст постепенно исчезает при изменении прозрачности, как и должно быть. Но это не работает в моем коде: - (

Вот мой код инициализации GL:

surfaceCreated:

    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
    gl.glShadeModel(GL10.GL_FLAT);
    gl.glDisable(GL10.GL_DEPTH_TEST);
    gl.glEnable(GL10.GL_TEXTURE_2D);
    // gl.glDisable(GL10.GL_DITHER);
    // gl.glDisable(GL10.GL_LIGHTING);
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glEnable(GL10.GL_BLEND);
    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

sizeChanged:

    gl.glViewport(0, 0, width, height);
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    gl.glOrthof(0.0f, width, 0.0f, height, 0.0f, 1.0f);
    gl.glDisable(GL10.GL_DEPTH_TEST);
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glShadeModel(GL10.GL_FLAT);
    gl.glEnable(GL10.GL_BLEND);
    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
    gl.glEnable(GL10.GL_TEXTURE_2D);

Я прокомментировал отключение Dither and Lighting в случае, если это было ... но нет. Это не имеет значения.

Растровые изображения загружаются из ресурсов таким образом:

    gl.glGenTextures(1, mTextureNameWorkspace, 0);
    textureName = mTextureNameWorkspace[0];
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureName);
    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);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);
    gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE);
    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, srcBitmap, 0);

И, наконец, мой код розыгрыша:

    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureName);
    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
    ((GL11) gl).glTexParameteriv(GL10.GL_TEXTURE_2D, GL11Ext.GL_TEXTURE_CROP_RECT_OES, crop(src), 0);
    gl.glColor4f(tint.R(), tint.G(), tint.B(), tint.A());
    ((GL11Ext) gl).glDrawTexfOES(dst.left, screenHeight - dst.bottom, 0.0f, dst.width(), dst.height());

Диапазон элементов оттенка должен быть 0.0..1.0, как и должно быть. Если я установил недопустимую текстуру:

    gl.glBindTexture(GL10.GL_TEXTURE_2D, -1);

... тогда OpenGL обязательно рисует прямоугольники правильного оттенка и непрозрачности в нужном месте.

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

Все, что я пытаюсь сделать, это эквивалент:

    PorterDuff.Mode mode = PorterDuff.Mode.MULTIPLY;
    if (tint.A() < 1.0f && tint.R() == 1.0 && tint.G() == 1.0
            && tint.B() == 1.0)
        mode = PorterDuff.Mode.DST_IN;
    Paint paint = new Paint();
    PorterDuffColorFilter cf = new PorterDuffColorFilter(tint, mode);
    paint.setColorFilter(cf);
    canvas.drawBitmap(texture.bitmap, srcRect, dstRect, Paint(tint));

1 Ответ

2 голосов
/ 27 июля 2011

Вместо использования GL_REPLACE измените третий аргумент вашей функции glTexEnvf() на GL_MODULATE.

Я буду ссылаться на мой более ранний ответ с сегодняшнего дня.

...