Я пытаюсь создать несколько графических интерфейсов для моей игры в OpenGL. Я использую pangocairo для рендеринга текста, но в окнах (см. Ниже) я не могу получить прозрачный фон поверхности, что приводит к тому, что текст отображается в белом прямоугольнике, тогда как при использовании того же кода в linux он работает нормально:
Ожидаемый результат (на Linux):
Проблема (на окнах):
Вот код, который я использую для загрузки текста:
struct Text
{
glm::mat3 transform;
glm::vec3 color;
GLuint texture;
glm::vec2 size;
};
Text createText(const char * string, int font_size, const char* font, glm::vec3 color, glm::vec2 pos)
{
Text text;
text.color = color;
glGenTextures(1, &text.texture);
//Create PangoContext and PangoLayout
cairo_surface_t* surf = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 0, 0);
cairo_t* cr = cairo_create(surf);
PangoFontMap* font_map = pango_cairo_font_map_new_for_font_type(CAIRO_FONT_TYPE_FT);
PangoContext* m_context = pango_cairo_create_context(cr);
pango_context_set_font_map(m_context, font_map);
PangoLayout* m_layout = pango_layout_new(m_context);
cairo_surface_finish(surf);
cairo_destroy(cr);
g_object_unref(font_map);
//Now load the font
PangoFontDescription* desc = pango_font_description_from_string(font);
pango_font_description_set_size(desc, font_size*PANGO_SCALE);
pango_layout_set_font_description(m_layout, desc);
pango_layout_set_text(m_layout, string, std::strlen(string));
int w, h;//size
pango_layout_get_size(m_layout, &w, &h);
w/=PANGO_SCALE;
h/=PANGO_SCALE;
//Now we create the cairo surface
cairo_surface_t * surf = cairo_image_surface_create_for_data(data, CAIRO_FORMAT_ARGB32, w, h, w*4);
cairo_t* cairo_context = cairo_create(surf);
cairo_set_source_rgba (cairo_context, color.r, color.g, color.b, 1);
pango_cairo_update_layout(cairo_context, m_layout);
pango_cairo_show_layout(cairo_context, m_layout);
cairo_surface_flush(surf);
//We fill in the GL texture
glBindTexture(GL_TEXTURE_2D, text.texture);
GLubyte* data = new GLubyte[w*h*4];
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, cairo_image_surface_get_data(surf));
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glBindTexture(GL_TEXTURE_2D, 0);
//And finally we destroy all the resources
cairo_destroy(cairo_context);
cairo_surface_finish(surf);
text.size = glm::vec2((float)w, (float)h);
text.transform = glm::scale(glm::translate(glm::mat3(1.0f), pos), glm::vec2(w/(float)guiConfig.screen_width, h/(float)guiConfig.screen_height));
delete[] data;
return text;
}
Проблема не является в коде рендеринга gl: я проверил содержимое поверхности cairo с помощью cairo_surface_write_to_png, и оказалось, что в linux все пиксели фона полностью прозрачны, тогда как в окнах они прозрачны только частично (205 альфа).
Итак, мой вопрос: Есть ли способ изменить это поведение?
Задача ещё не решена.
Других решений пока нет …