2010-07-02 2 views
7

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

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

После 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 - это «средний» фон, сплошной черный.

+0

Скриншоты с пояснениями будут приятными. – SigTerm

ответ

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

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

+1

Я знал, что это было что-то глупое. Большое спасибо, что спас мой день :) – drahnr

4

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

насчет либо

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND)

или

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE)?

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

+0

Это не сработало. Я попробовал glEnable (GL_ALPHA_TEST); glAlphaFunc (GL_GREATER, 0,1f); но никаких изменений. GL_MODULATE ничего не изменил, GL_BLEND изменил цвет, но «ящик» вокруг моего объекта все еще был там – drahnr

+1

Это было действительно полезно для меня. Используя BB, когда я включил альфа-тест и использовал GL_GREATER, он работал как шарм. – bobobobo

3

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

Обновленные данные на основе your screenshot.

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

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

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

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

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

+0

Это показывает основные текстуры? Пока это работает и для меня, но моя проблема в том, что я хочу увидеть другой объект текстуры _beyond_ тот, который я рисую. Но atm вместо этого получаю фоновый цвет (черный). Скриншот: http://img824.imageshack.us/img824/1912/blackbox.png – drahnr

+0

@ soxs060389: Я обновил свой ответ. Вы должны ПЕРВЫМ ПОЛУЧИТЬ землю, а ПОСЛЕ ЭТО сделать машину. Это не сработает, если вы сделаете это в обратном порядке. – SigTerm

+0

Я делал это с тех пор час zer0. Автомобиль есть и всегда был последним предметом. – drahnr

 Смежные вопросы

  • Нет связанных вопросов^_^