仅使用精灵绘制

Using only the sprite to draw

本文关键字:绘制 精灵      更新时间:2023-10-16

使用SFML的游戏开发新颖,非常喜欢。

到目前为止,我正在尝试在精灵上渲染一个圆圈,但是不知何故,我只得到四分之一的圆,这意味着窗口在绘制而不是精灵时被视为表面。如果我将Sprie大小作为窗口,我会看到整个圆圈。

这是我的代码:

#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
const char *glsl = R"(
    #version 330 core
    uniform vec2 u_resolution;
    void main() {
        vec2 pos = gl_FragCoord.xy / u_resolution;
        float radius = 0.4;
        float d = smoothstep(radius + 0.01, radius, distance(pos, vec2(0.5)));
        gl_FragColor = vec4(d*0.0, d*0.5, d*1.0, 1.0);
    }
)";
int main() {
    sf::RenderWindow window(sf::VideoMode(800, 600), "GLSL", sf::Style::Default);
    sf::Texture tex;
    tex.create(800 / 2, 600 /2); // or tex.create(800, 600); for full window surface
    sf::Sprite spr(tex);
    sf::Shader shader;
    shader.loadFromMemory(glsl, sf::Shader::Fragment);
    shader.setUniform("u_resolution", sf::Vector2f(800, 600));
    while (window.isOpen()) {
        sf::Event event;
        while (window.pollEvent(event)) if(event.type == sf::Event::Closed) window.close();
        window.clear(sf::Color(244,244,244));
        window.draw(spr, &shader);
        window.display();
    }
}

任何帮助都会很感激。我希望实现的是在精灵范围内渲染完整的圆圈。谢谢!

您要拿出四分之一的屏幕,因为您要执行tex.create(800 / 2, 600 /2);,并且窗口大小为sf::RenderWindow window(sf::VideoMode(800, 600) ...);。因此,它偏离了宽度和高度。创建一个与窗口相同的质地,我认为您会很好(tex.create(800, 600);)。