【问题标题】:SFML loading shader errorSFML 加载着色器错误
【发布时间】:2014-04-30 02:25:18
【问题描述】:

所以我正在使用 SFML 开发我的游戏项目,并尝试实现模糊着色器。我不知道为什么,但是这段代码让程序显示一个白屏然后关闭。我什至没有使用着色器来绘制任何东西,只是我试图加载它的事实给出了意想不到的结果:( .

void button::setText(std::string _text)
{
    text.setString(_text);
    text.setFont(font);
    text.setCharacterSize(80);
    text.move(0,-(text.getLocalBounds().top));
    text.setColor(sf::Color(255,255,255,255));
    width=text.getLocalBounds().width+text.getLocalBounds().left;
    height=text.getLocalBounds().height+text.getLocalBounds().top;
    rndtexture.create(width, height);
    rndtexture.setSmooth(true);
    rndtexture.clear(sf::Color::Transparent);
    rndtexture.draw(text);
    rndtexture.display();
    rTexture=rndtexture.getTexture();
    spriteR.setTexture(rTexture);

    rndtexture.clear(sf::Color::Transparent);
    text.setColor(sf::Color(0,0,0,100));
    rndtexture.draw(text);
    rndtexture.display();
    pTexture=rndtexture.getTexture();
    spriteP.setTexture(pTexture);

    //commenting this out will make it work just fine
    if (!shader.loadFromFile("shader.frag", sf::Shader::Type::Fragment))
    {
        std::cout<<"lol";
    }
    //

    shader.setParameter("texture", sf::Shader::CurrentTexture);
    shader.setParameter("blur_radius", 5.0);
}

这是我的着色器文件:

uniform sampler2D texture;
uniform float blur_radius;

void main()
{
    vec2 offx = vec2(blur_radius, 0.0);
    vec2 offy = vec2(0.0, blur_radius);

    vec4 pixel = texture2D(texture, gl_TexCoord[0].xy) * 4.0 +
                 texture2D(texture, gl_TexCoord[0].xy - offx) * 2.0 +
                 texture2D(texture, gl_TexCoord[0].xy + offx) * 2.0 +
                 texture2D(texture, gl_TexCoord[0].xy - offy) * 2.0 +
                 texture2D(texture, gl_TexCoord[0].xy + offy) * 2.0 +
                 texture2D(texture, gl_TexCoord[0].xy - offx - offy) * 1.0 +
                 texture2D(texture, gl_TexCoord[0].xy - offx + offy) * 1.0 +
                 texture2D(texture, gl_TexCoord[0].xy + offx - offy) * 1.0 +
                 texture2D(texture, gl_TexCoord[0].xy + offx + offy) * 1.0;

    gl_FragColor = gl_Color * (pixel / 16.0);
}

这有什么问题..?

【问题讨论】:

  • 为什么哦,你为什么在你的绘图功能之外绘图?永远不要那样做。设置一个更新、绘制和轮询事件的主循环。所有这些都需要分开。之后,返回绘制和更新函数。
  • 我正在绘制到 sf::RenderTexture 以便我可以使用该纹理使用着色器绘制实际按钮。无论如何,我没有在屏幕上绘制任何东西。我不认为这就是问题所在。
  • 大概就是这样。说真的,先建立一个标准循环。
  • 说真的,伙计,我对 SFML 和/或 c++ 并不陌生。算了吧。

标签: c++ shader sfml


【解决方案1】:

调用时返回值是多少:

sf::Shader::isAvailable()

确保在调用着色器程序之前可以使用它。此外,着色器不能使程序崩溃,所以它绝对不是你的着色器。如果您的着色器有问题,它将无法编译。如果您的着色器未编译,则 SFML 会自动切换到内置着色器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多