Подтвердить что ты не робот

Прозрачность прозрачности OpenGL не работает

У меня есть текстура OpenGL, привязанная к простому квадрату.

Моя проблема: у меня текстура размером 128x128 пикселей. Я только заполняю около 100x60 пикселей на этом изображении, другие пиксели прозрачны. Я сохранил его в файле .png. Когда я рисую, прозрачная часть привязанной текстуры белая.

Скажем, у меня есть фон. Когда я рисую этот новый квадратик на этом фоне, я не вижу прозрачную часть моей текстуры.

Любые предложения?

код:

// Init code...
gl.glEnable(gl.GL_TEXTURE_2D);
gl.glDisable(gl.GL_DITHER);
gl.glDisable(gl.GL_LIGHTING);   
gl.glDisable(gl.GL_DEPTH_TEST);

gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_MODULATE); 

// Drawing code...
gl.glBegin(gl.GL_QUADS);
gl.glTexCoord2d(0.0, 0.0);
gl.glVertex3f(0.0f, 0.0f, 0.0f);
gl.glTexCoord2d(1.0, 0.0);
gl.glVertex3f(1.0f, 0.0f, 0.0f);
gl.glTexCoord2d(1.0, 1.0);
gl.glVertex3f(1.0f, 1.0f, 0.0f);
gl.glTexCoord2d(0.0, 1.0);
gl.glVertex3f(0.0f, 1.0f, 0.0f);
gl.glEnd();

Я пробовал почти все, от включения смешивания, чтобы перейти на GL_REPLACE, но я не могу заставить его работать.

Edit:

// Texture. Have tested both gl.GL_RGBA and gl.GL_RGB8.
gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, (int)gl.GL_RGBA, imgWidth, imgHeight,
            0, gl.GL_BGR_EXT, gl.GL_UNSIGNED_BYTE, bitmapdata.Scan0);
4b9b3361

Ответ 1

Убедитесь, что ваша текстура имеет формат RGBA и разрешает смешивание и устанавливает функцию смешивания:

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

И нарисуйте текстуру. Если ваша текстура не RGBA, тогда нет альфы, и смешение ничего не сделает.

EDIT: Поскольку вы отправили свой код, я могу заметить серьезную ошибку:

glTexImage2D(gl.GL_TEXTURE_2D, 0, (int)gl.GL_RGBA, imgWidth, imgHeight,  0, gl.GL_BGR_EXT, gl.GL_UNSIGNED_BYTE, bitmapdata.Scan0);

Вы говорите GL, что текстура имеет innerFormat RGBA, но растровые данные имеют формат BGR, поэтому альфа-альфа от ваших данных текстуры. Это предполагает альфа = 1,0.

Чтобы исправить это, загрузите свой PNG в формате RGBA и используйте GL_RGBA как internalFormat и параметры формата для glTexImage2D.

Ответ 2

When I'm drawing, the transparent part of the binded texture is white.

Это означает, что ваш PNG-парсер преобразует прозрачные области в значение белого. Если вы хотите визуализировать прозрачные слои с помощью OpenGL, вы обычно не зависите от текстурных файлов, чтобы сохранить прозрачность, но вместо этого используйте GLBlendFunc(). Дополнительная информация здесь:

http://www.opengl.org/resources/faq/technical/transparency.htm

Ответ 3

Кроме того, следует ли визуализировать буфер кадра и копировать результат в текстуру, проверьте, включен ли альфа-буфер. Например, при использовании osgViewer это может быть достигнуто (сделайте это перед вызовом setUpViewInWindow):

osg::DisplaySettings *pSet = myviewer.getDisplaySettings();
if(pSet == NULL)
   pSet = new osg::DisplaySettings();
pSet->setMinimumNumAlphaBits(8);
myviewer.setDisplaySettings(pSet);

и под qt он должен работать с (от http://forum.openscenegraph.org/viewtopic.php?t=6411):

QGLFormat f;
f.setAlpha( true ); //enables alpha channel for this format
QGLFormat::setDefaultFormat( f ); //set it as default before instantiations
setupUi(this); //instantiates QGLWidget (ViewerQT)

Обычно лучше визуализировать непосредственно в буфере кадров, но я придумал это при подготовке некоторого устаревшего кода, и в начале было очень сложно найти это.