【问题标题】:Text and shaders文本和着色器
【发布时间】:2016-08-28 15:45:02
【问题描述】:

使用 SFML 2.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 不打算这样使用?

【问题讨论】:

    标签: c++ glsl sfml


    【解决方案1】:

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

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

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

    【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 这会产生奇怪的结果。我仍然有红色方块,但它们“出现故障”。在每一帧上,方块的某些部分变黑,并且每一帧都会改变。
    • @qxz 发布了一个新答案,我认为他是对的。需要对纹理进行采样。请查看此 SO 帖子:stackoverflow.com/a/35217489/5803074
    • 是的,只是在分配任何东西之前乘以 gl_FragColor 似乎可能会导致未定义的行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 2018-10-12
    • 2018-05-28
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 2012-04-26
    相关资源
    最近更新 更多