текстуры с прозрачными на OpenGL - PullRequest
0 голосов
/ 12 марта 2019

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

Я использую этот способ:

1

gldisable(gl_blend);
gldisable(gl_texture_2d);

2.

Нарисуйте четырехцветный фон

3

glenable(gl_blend);
glblendfunc(gl_src_alpha,gl_one_minus_src_alpha);
glenable(gl_texture_2d);
glbindtexture(gl_texture_2d,txtr);

4

рисовать текстуру

5

gldisable(gl_texture_2d);
glblendfunc(gl_dst_alpha,gl_dst_alpha);

6.

рисует передний цвет

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

Что можно сделать, чтобы шрифт мог использовать передний цвет и цвет фона?

Ответы [ 2 ]

1 голос
/ 12 марта 2019

В этом ответе предполагается, что вы используете устаревший OpenGL:

Вы можете установить текстуру для рисования непосредственно в цвете переднего плана, например:

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

{
    glDisable(GL_TEXTURE_2D);
    glColor3d(bgR,bgG,bgB); // Set background color

    /* Draw background quad here */

    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, yourFontTexture);
    glColor3d(fgR,fgG,fgB); // Set foreground color

    /* Draw texture quads here*/
}

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

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

0 голосов
/ 12 марта 2019

Каково намерение сначала нарисовать квад с цветом фона?Я думаю, что вам действительно нужно использовать режим текстурной среды GL_DECAL, если вы настаиваете на использовании устаревшего конвейера с фиксированными функциями.Или, если вы используете современный OpenGL (рекомендуется) , напишите соответствующий шейдер, который учитывает цвет фона.

Рекомендуемый фрагментный шейдер:

uniform sampler2D u_font_tex;
uniform vec4 u_bkgd_color;
in vec2 v_tex_coord;
out vec4 output_color;

main()
{
     vec4 t = texture(u_font_tex, v_tex_coord);
     output_color = mix(u_bkgd_color, t, t.a);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...