Как использовать шейдер без изменения исходного цвета
У меня есть текстовый класс, который отображает цифры цветным шрифтом. Когда я не использую свой шейдер, часть текста отображается светло-зеленым, а другой текст - белым по цвету. Когда я использую шейдер, весь текст белый. Я уверен, что причина этого в том, что в 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;
}