Я пытаюсь сделать программу, показывающую красный вращающийся куб на заднем плане, наложенный на текстурированный квад.
Текстура представляет собой простое 24-битное растровое изображение со словами «Hello World» черного цвета на белом фоне. Я хочу, чтобы белый фон был прозрачным, чтобы за оверлеем можно было видеть куб. Загрузчик изображений проверяет значение каждого пикселя и добавляет соответствующее альфа-значение для преобразования изображения в 32-битное растровое изображение.
На данный момент моя программа отображает наложение с черным текстом, но красным фоном, того же цвета, что и куб. Ниже приведен код, используемый для первоначальной настройки текстуры:
if (bitmap->Load("test.bmp")) {
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, 3, bitmap->GetWidth(), bitmap->GetHeight(),
0, GL_RGBA, GL_UNSIGNED_BYTE, bitmap->GetPixelData());
}
И это вся моя функция отображения, на случай, если что-то мешает чему-либо еще.
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(40, 1, 0.1, 27.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1.0, 0.0, 0.0);
glTranslatef(0.0, 0.0, -1.1);
glRotatef(angle, 1.0, 1.0, 0.0);
glutSolidCube(0.1);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, 640, 480, 0.0, -1.0, 10.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glDisable(GL_CULL_FACE);
glClear(GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBindTexture(GL_TEXTURE_2D, texture);
glBegin(GL_QUADS);
glTexCoord2d(0.0, 0.0); glVertex2f(0.0, 0.0);
glTexCoord2d(1.0, 0.0); glVertex2f(320.0, 0.0);
glTexCoord2d(1.0, 1.0); glVertex2f(320.0, 240.0);
glTexCoord2d(0.0, 1.0); glVertex2f(0.0, 240.0);
glEnd();
glDisable(GL_BLEND);
glDisable(GL_TEXTURE_2D);
glFlush();
glutSwapBuffers();
Среда текстур по умолчанию GL_MODULATE
который смешивается в текущем цвете (красный от вашего куба) со значением входящего текселя.
Переключиться на GL_DECAL
или сделать glColor3ub(255,255,255)
прежде чем вы сделаете свой текст.
Других решений пока нет …