Прозрачность текстур OpenGL не работает - PullRequest
19 голосов
/ 05 марта 2011

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

Моя проблема: моя текстура - изображение 128х128 пикселей. Я только заполняю около 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);

Ответы [ 3 ]

32 голосов
/ 05 марта 2011

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

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

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

РЕДАКТИРОВАТЬ: Поскольку вы опубликовали свой код, я могу заметить серьезную ошибку:

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

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

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

1 голос
/ 07 августа 2012

Кроме того, если вы выполняете рендеринг в буфер кадров и копируете результат в текстуру, убедитесь, что в буфере кадров включена альфа.Например, при использовании 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)

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

1 голос
/ 05 марта 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...