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

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

любые советы, как этого добиться?

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

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);

Спасибо за любую помощь.

Edit:

больше кода:

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);

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

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" фон сплошной черный.

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 в этом положении вместо этого.


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

что насчет

glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND)

или

glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE)?

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


Если вы визуализируете одну текстуру на объект, вам нужно использовать 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-буфер значениями, А поскольку фон находится ниже car, он становится невидимым.

при визуализации полупрозрачных объектов необходимо следовать этим правилам.

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

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

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