OpenGL: почему альфа-канал установлен на 255 при копировании текстуры? - PullRequest
0 голосов
/ 14 февраля 2012

Я хочу переместить и повернуть прозрачное изображение BGRA (наложение текста) с помощью OpenGL.Вот фрагмент кода, который я использую:

glViewport(0, 0, iWidth, iHeight); // Reset The Current Viewport
glEnable(GL_TEXTURE_2D);

glGenTextures(1, &arTex[0].iName);
glBindTexture(GL_TEXTURE_2D, arTex[0].iName);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glTexImage2D(GL_TEXTURE_2D, 0, 4, imf.iWidth, imf.iHeight, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, ib.GetData());

glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // Note: Transparent alpha value
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

glOrtho(-dAspectCanvas / 2.0, dAspectCanvas / 2.0, -0.5, 0.5, -1.0, 1.0); // Note: Using (-1.0; 1.0) for Z-planes
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glScaled(Motion.Scale.GetValue(dPosition), Motion.Scale.GetValue(dPosition), 1.0);
glTranslated(Motion.OffsetX.GetValue(dPosition) * dAspectCanvas, Motion.OffsetY.GetValue(dPosition), 0.0);
glRotated(Motion.Rotation.GetValue(dPosition), 0.0, 0.0, 1.0);
glTranslated(Motion.PositionX.GetValue(dPosition) * dAspectCanvas, Motion.PositionY.GetValue(dPosition), 1.0);

// Rotating and moving

glBindTexture(GL_TEXTURE_2D, arTex[iTexIndex].iName); // has to be called outside glBegin/glEnd scope

glBegin(GL_TRIANGLE_STRIP); // "Many OpenGL applications avoid quads altogether because of their inherent rasterization problems"

glTexCoord2d(rcTextureIntersection.left, rcTextureIntersection.top);
glVertex2d(rcVertexIntersection.left, rcVertexIntersection.top);
glTexCoord2d(rcTextureIntersection.right, rcTextureIntersection.top);
glVertex2d(rcVertexIntersection.right, rcVertexIntersection.top);
glTexCoord2d(rcTextureIntersection.left, rcTextureIntersection.bottom);
glVertex2d(rcVertexIntersection.left, rcVertexIntersection.bottom);
glTexCoord2d(rcTextureIntersection.right, rcTextureIntersection.bottom);
glVertex2d(rcVertexIntersection.right, rcVertexIntersection.bottom);
glEnd();

glDisable(GL_TEXTURE_2D);
glFlush();   
glReadBuffer(GL_BACK);
glReadPixels(0, 0, imf.iWidth, imf.iHeight, GL_BGRA_EXT, GL_UNSIGNED_BYTE, ibOut.GetData());

Но что бы я ни старался в glTexImage2D, мое прозрачное черное изображение становится полностью непрозрачным черным изображением.Входное изображение BGRA содержит байты: 0, 0, 0, 0, 0 .... После поворота выходное изображение содержит 0, 0, 0, 255, 0, 0, 0, 255, 0 .... Aустановлен на 255 все время, и я не могу понять, почему.

Ответы [ 4 ]

0 голосов
/ 09 января 2013

Установите для glClearColor правильный альфа-цвет.

0 голосов
/ 14 февраля 2012

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

Другая проблема - и более важная для вас - это ваш кадровый буфер (гдевы рисуете текстуру в), вероятно, не имеет альфа-канала и, таким образом, будет иметь максимальное значение по умолчанию.Вам не нужно включать смешивание, чтобы текстура влияла на альфа-значение кадрового буфера (оно просто заменит его).Но вам нужен кадровый буфер с альфа-каналом, чтобы это работало.Обратите внимание, что получение альфа-буфера на экранном кадровом буфере возможно (и я даже рекомендую это).Но для работы с изображениями фреймбуфер как раз не туда.Вам нужна безопасная среда для этого: A Framebuffer Object .

0 голосов
/ 15 февраля 2012

Нет необходимости смешивать что-либо, но буфер кадров должен быть установлен с использованием альфа-битов. Это была проблема, я полностью забыл о wglCreateContext.

Спасибо за помощь!

0 голосов
/ 14 февраля 2012

Альфа не означает «прозрачный». Альфа сама по себе не означает ничего . Он приобретает смысл только тогда, когда вы используете это значение, чтобы что-то сделать.

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

...