Как использовать шейдер без изменения исходного цвета

У меня есть текстовый класс, который отображает цифры цветным шрифтом. Когда я не использую свой шейдер, часть текста отображается светло-зеленым, а другой текст - белым по цвету. Когда я использую шейдер, весь текст белый. Я уверен, что причина этого в том, что в shader.frag у меня есть rgb как vec4(1.0, 1.0, 1.0, непрозрачность); Однако я не знаю, как изменить эти значения для одних типов текста и не изменить для других. То, что я хочу сделать, это сохранить исходный цвет текста и медленно уменьшить непрозрачность. Как этот код можно изменить, чтобы сделать это? Вот мой код, содержащий реализацию этого:

shader.frag:

uniform sampler2D texture;
uniform float opacity;

void main()
{
vec4 pixel = texture2D(texture, gl_TexCoord[0].xy);
gl_FragColor = pixel * vec4(1.0, 1.0, 1.0, opacity);
}

///////////////////////////////////////////////////////////////

shader.vert:

void main()

{

gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;

gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;

gl_FrontColor = gl_Color;

}

////////////////////////////////////////////////// /////////////////

применение шейдера в основной функции:

sf::Shader shader;

if (!shader.loadFromFile("shader.vert", "shader.frag"))

return EXIT_FAILURE;

float opacity = 1.0; //transparency of shader

shader.setParameter("texture", sf::Shader::CurrentTexture); //shader.vert

shader.setParameter("opacity", opacity);                    //shader.frag

///////////////////////////

////////////////////////////

////////////////////////////

// Удалить отображение текста

counter1 = 0;

for (iter8 = textDisplayArray.begin(); iter8 != textDisplayArray.end(); 
iter8++)

{

    if (textDisplayArray[counter1].destroy == true)

    {
        //shader

        opacity -= 0.1;  

        if (opacity <= 0)

        {

            textDisplayArray.erase(iter8);

            opacity = 1;

        }

        shader.setParameter("opacity", opacity);

    }

1 ответ

Решение

Вы можете просто использовать gl_Colorв вашем фрагментном шейдере:

shader.frag:

uniform sampler2D texture;
uniform float opacity;

void main()
{
    vec4 pixel   = texture2D(texture, gl_TexCoord[0].xy);
    gl_FragColor = pixel * vec4( gl_Color.rgb, opacity );
                              // ^        ^^^ RGB-color passed by vertex shader
}

shader.vert:

void main()
{
    gl_Position    = gl_ModelViewProjectionMatrix * gl_Vertex;
    gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
    gl_FrontColor  = gl_Color;
    gl_BackColor   = gl_Color;
}
Другие вопросы по тегам