代码之家  ›  专栏  ›  技术社区  ›  nowox

绘制精灵得到镜像?

  •  0
  • nowox  · 技术社区  · 2 年前

    在下面的示例中,我尝试使用 sf::RenderTexture 。不幸的是,纹理似乎是镜像的。我不明白为什么。

    主程序

    #include <SFML/Graphics.hpp>
    #include <iostream>
    #define WIDTH 800
    int main() {
        sf::RenderWindow window(sf::VideoMode(WIDTH, WIDTH), "Test");
        sf::Shader buffer;
        buffer.loadFromFile("buffer.frag", sf::Shader::Fragment);
        sf::Texture texture;
        texture.create(WIDTH, WIDTH);
        sf::Sprite sprite(texture);
        sf::RenderTexture renderTexture;
        renderTexture.create(WIDTH, WIDTH);
        sf::Vector2f mousePos = sf::Vector2f(-1.f, -1.f);
        buffer.setUniform("iChannel0", texture);
        buffer.setUniform("iResolution", sf::Glsl::Vec2(WIDTH, WIDTH));
        auto time = sf::Clock();
        window.clear();
        while(window.isOpen()) {
            sf::Event currEvent;
            while(window.pollEvent(currEvent))
                if (currEvent.type == sf::Event::Closed) window.close();
            buffer.setUniform("iTime", (float)time.getElapsedTime().asSeconds());
            renderTexture.clear();
            renderTexture.draw(sprite, &buffer);
            renderTexture.display();
            texture.update(renderTexture.getTexture());
    
            window.clear();
            window.draw(sprite);
            window.display();
        }
    }
    

    片段着色器

    #version 140
    out vec4 out_Colour;
    
    uniform sampler2D iChannel0;
    uniform vec2 iResolution;
    uniform float iTime;
    
    void main(void) {
        vec2 spot = vec2(sin(iTime*5)*200+400, cos(iTime*15.0)*70+150);
        vec3 color = vec3(sin(iTime*5), sin(iTime*1), sin(iTime*10)) * 0.5 + 0.5;
        vec2 uv = (gl_FragCoord.xy - spot.xy) / iResolution.xy;
        vec3 blob = 1.0 - vec3(smoothstep(length(uv), 0, .02));
        vec3 stack = texture(iChannel0, gl_FragCoord.xy / iResolution.xy).xyz;
        stack -= vec3(0.003);
        out_Colour = vec4(stack + color * blob* 0.1, 1.0);
    }
    

    我得到了一个奇怪的结果,一半的屏幕都是镜像的:

    enter image description here

    但如果直接渲染缓冲区,则不会得到以下结果:

        window.clear();
        window.draw(sprite, &buffer);
        window.display();
        texture.update(window);
    

    enter image description here

    0 回复  |  直到 2 年前