C++ 文本和着色器

C++ 文本和着色器,c++,glsl,sfml,C++,Glsl,Sfml,使用SFML2.4,我想在屏幕上绘制一个文本,并使用片段着色器对其应用效果。但是当我尝试时,文本是用正方形而不是字符绘制的 片段着色器: void main() { gl_FragColor= vec4(1,0,0,1); } SFML文本代码: sf::Text t; t.setFont(myFont); t.setCharacterSize(10); t.setColor(sf::Color::White); t.setString("this is a test"); //myWind

使用SFML2.4,我想在屏幕上绘制一个文本,并使用片段着色器对其应用效果。但是当我尝试时,文本是用正方形而不是字符绘制的

片段着色器:

void main() { gl_FragColor= vec4(1,0,0,1); }
SFML文本代码:

sf::Text t;
t.setFont(myFont);
t.setCharacterSize(10);
t.setColor(sf::Color::White);
t.setString("this is a test");

//myWindow.draw(t); // This displays a white "this is a test"
//myWindow.draw(t, myShader); // This displays red squares instead of characters
我希望我的着色器以红色显示该文本。但我得到的是红色方块。每个方块都是角色的边界框的大小。
我是不是漏掉了什么明显的东西?还是sf::Text不打算这样使用?

着色器将整个片段设置为红色,从而在文本上着色

尝试乘以片段的颜色,而不是设置它,如下所示:

void main() { gl_FragColor *= vec4(1,0,0,1); }

我不熟悉SFML文本渲染的工作原理,但我高度怀疑它会将文本放入纹理中。在这种情况下,片段着色器必须对纹理进行采样,以确定给定片段的颜色。只需将片段颜色设置为红色即可:将每个渲染片段设置为红色。试试这个:

uniform sampler2D texture;

void main() {
    gl_FragColor = texture2D(texture, gl_TexCoord[0].st) * vec4(1,0,0,1);    
}

这将在从顶点着色器传入的纹理坐标处对当前绑定的纹理进行采样,并将其着色为红色。

这会产生奇怪的结果。我还有红色的方块,但它们“有缺陷”。在每一帧上,方块的某些部分变黑,每一帧都会改变。@qxz发布了一个新的答案,我认为他是对的。需要对纹理进行采样。查看这篇文章:是的,在分配任何内容之前,只需乘以
gl\u FragColor
,似乎可能会导致未定义的行为。我认为你是对的。我刚刚偶然发现了这个答案,因此对纹理进行了采样: