OpenGL полупрозрачная структура по другой структуре

Я получил 2 png изображения, используясь в качестве структур в QT/C++ 2D приложение OpenGL. Первое используется в качестве некоторой "средней" земли, и второе используется в качестве "объекта", представляемого "ontop" (Примечание: у них всех есть тот же банкомат z-значения, я получаю желаемое поведение представить его в определенном порядке). "Объект" - структура частично полупрозрачна. Структура "middleground" является главным образом основательной. Проблема состоит в том, что, полупрозрачная часть моей "объектной" структуры делает цвет сплошного фона а не структуру "middleground".

Какие-либо подсказки, как достигнуть этого?

Следующие флаги OpenGL используются для моего рендеринга структур

glEnable (GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Спасибо за любую справку.

Править:

Больше кода:

glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);

glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.1f);

glEnable(GL_TEXTURE_2D);
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glBindTexture(GL_TEXTURE_2D, c->_texture);

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

glBegin(GL_QUADS);
{
    glTexCoord2i(0,0);
    glVertex2i(-128,-128);

    glTexCoord2i(0,1);
    glVertex2i(-128,128);

    glTexCoord2i(1,1);
    glVertex2i(128,128);

    glTexCoord2i(1,0);
    glVertex2i(128,-128);

}
glEnd();

glDisable(GL_TEXTURE_2D);

glDisable(GL_ALPHA_TEST);
glDisable(GL_DEPTH_TEST);

Править: Как я загружаю свою структуру и насколько я могу сказать, что она загружает его альфа-каналом

QImage img("./images/dummycar.png","PNG");
QImage t(QGLWidget::convertToGLFormat(img));
glGenTextures(1, &_texture);
glBindTexture(GL_TEXTURE_2D, _texture);
glTexImage2D( GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits() );
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

Снимок экрана: http://img824.imageshack.us/img824/1912/blackbox.png

Skyimage является "middleground", фон является чистым черным.

7
задан drahnr 2 July 2010 в 10:38
поделиться

3 ответа

glTexImage2D( GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits() );

Вы указываете 3 каналов для internalFormat , так что это RGB, а не RGBA. Вместо этого попробуйте использовать GL_RGBA в этой позиции.

7
ответ дан 6 December 2019 в 15:18
поделиться

Вы пробовали возиться с glAlphaFunc ? Вы можете использовать его, чтобы отказаться от рисования полупрозрачных частей текстуры вашего объекта на основе альфа-значения.

Как насчет

glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND)

или

glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE) ?

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

4
ответ дан 6 December 2019 в 15:18
поделиться

Если вы рендерите одну текстуру на объект, то вам нужно использовать glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE).

Если даже после этого текстура все еще имеет "коробку" вокруг себя, значит, она была загружена без альфа-канала.

У меня это работает идеально:

    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glBindTexture(GL_TEXTURE_2D, texture2->tex);
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    glColor4f(0.5f, 1.0f, 0.5f, 0.5f);
    glBegin(GL_TRIANGLE_FAN);
    glTexCoord2f(0, 0);
    glVertex2f(x, y);
    glTexCoord2f(1, 0);
    glVertex2f(x + texture2->width, y);
    glTexCoord2f(1, 1);
    glVertex2f(x + texture2->width, y+ texture2->height);
    glTexCoord2f(0, 1);
    glVertex2f(x, y + texture2->height);
    glEnd();
    glDisable(GL_BLEND);

Полупрозрачная текстура, тонированная последним цветом.

Если "наличие коробки вокруг текстуры" не описывает вашу проблему, то вам нужно выложить скриншоты.

--EDIT--

Обновленные данные на основе вашего скриншота.

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

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

  1. Все непрозрачные объекты должны быть отрисованы раньше полупрозрачных. Всегда.

  2. Все прозрачные объекты должны рендериться в направлении сзади наперед. Самые дальние объекты должны быть отрисованы первыми, самые близкие - вторыми.

  3. Если рендеринг в порядке back-to-front невозможен (несортированные частицы с блендом GL_ADD), запись в буфер глубины должна быть отключена с помощью glDepthMask(GL_FALSE). Если этого не сделать, вы получите уродливые артефакты. (как на вашем скриншоте).

3
ответ дан 6 December 2019 в 15:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: