Рисование альфа-канала правильно в OpenGl - PullRequest
3 голосов
/ 24 июня 2010

После загрузки изображения у меня есть отдельные байты для каждого канала, загруженные в массив символов без знака. Он передается функции, которая проецирует ее как текстуру на квад. Кажется, что все работает правильно, кроме альфа-канала, который отображается как цвет фона. Я использую OpenGL, чтобы нарисовать изображение. Буду ли я выиграть, добавив механизм многоуровневой настройки? Кроме того, как мне добиться желаемого эффекта прозрачности?

Примечание. Код, который, по моему мнению, должен быть изменен:

void SetUpView()
{
    // Set color and depth clear value
    glClearDepth(1.f);
    glClearColor(1.f, 0.f, 0.f, 0.f);

    // Enable Z-buffer read and write
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_TEXTURE_2D);
    glDepthMask(GL_TRUE);

    glEnable (GL_BLEND); 
    glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

    // Setup a perspective projection
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(90.f, 1.f, 1.f, 500.f);
};

Также вот код для рендеринга четырехугольника.

void DrawTexturedRect(RectBounds *Verts, Image *Texture)
{
    glBindTexture(GL_TEXTURE_2D, GetTextureID(Texture));

    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glPixelZoom(1, -1);

    glBegin(GL_QUADS);
    glTexCoord2f(0.0, 1.0);
    glVertex3f(Verts->corners[0].x, Verts->corners[0].y, Verts->corners[0].z);

    glTexCoord2f(1.0, 1.0);
    glVertex3f(Verts->corners[1].x, Verts->corners[1].y, Verts->corners[1].z);

    glTexCoord2f(1.0, 0.0);
    glVertex3f(Verts->corners[2].x, Verts->corners[2].y, Verts->corners[2].z);

    glTexCoord2f(0.0, 0.0);
    glVertex3f(Verts->corners[3].x, Verts->corners[3].y, Verts->corners[3].z);
    glEnd();
};

Класс Image содержит массив символов без знака, полученных с использованием OpenIL.

Соответствующий код:

loaded = ilLoadImage(filename.c_str());
ilConvertImage(IL_RGBA, IL_UNSIGNED_BYTE);

unsigned char *bytes = ilGetData();

//NewImage is an instance of an Image. This is returned and passed to the above function.
NewImage->data = bytes;

Задача http://img375.imageshack.us/img375/9585/j120192.png

Спасибо

Ответы [ 3 ]

2 голосов
/ 16 марта 2011

Перед тем, как нарисовать что-нибудь прозрачное, вы должны позвонить:

glDepthMask(false);

И затем после:

glDepthMask(true);

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

0 голосов
/ 24 июня 2010

Попробуйте:

glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Редактировать: Я знаю, как это выглядит. Похоже, вы рисуете синий квадрат (который имеет позицию Z-порядка, помещая его за курсором) ПОСЛЕ курсора. Вы должны рисовать вещи в правильном обратном Z-порядке при альфа-смешении, или вы видите ошибки, которые видите.

0 голосов
/ 24 июня 2010

glClearColor (1.f, 0.f, 0.f, 0.f);

Я бы предположил, что это по умолчанию RGBA, а вы устанавливаете красный на 1.0.

Как насчет лучшего объяснения того, что вы пытаетесь достичь?

...