2017-12-08 7 views
2

Neu in der Spieleentwicklung mit SFML und wirklich gefällt es.Nur das Sprite zum Zeichnen verwenden

Bis jetzt versuche ich, einen Kreis auf einem Sprite zu rendern, aber irgendwie bekomme ich nur ein Viertel des Kreises, was bedeutet, dass das Fenster als Oberfläche beim Zeichnen statt als Sprite genommen wird. Wenn ich die sprie Größe wie die Fenster zu machen, werde ich den Kreis sehen ..

Hier ist mein Code:

#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(); 
    } 
} 

Jede Hilfe zu schätzen wissen würde. Was ich erreichen möchte, ist, den gesamten Kreis im Sprite-Bereich darzustellen. Vielen Dank!

+0

Mögliche Duplikate von [SFML/GLSL - Making Shader nimmt VertexArray als Leinwand anstelle des Fensters] (https://stackoverflow.com/questions/47702694/sfml-glsl-making-shader-takes-vertexarray-as-canvas -inst-of-the-window) – Mario

+0

Ist das eine Art von Unterrichtsaufgabe oder wiederholen Sie die fast exakt gleiche Frage unter verschiedenen Benutzernamen? – Mario

+0

Ich habe das gesehen, aber scheinen ein wenig veraltet..und ja, es ist eine Aufgabe ... – sfmldev

Antwort

0

Sie nehmen ein Viertel des Bildschirms, weil Sie tex.create(800/2, 600 /2); tun und Ihre Fenstergröße ist sf::RenderWindow window(sf::VideoMode(800, 600) ...);. So teilt es sich durch die Breite und die Höhe. Erstellen Sie eine Textur mit der gleichen Größe wie Ihr Fenster und ich denke, Sie werden gut (tex.create(800, 600);).

+0

Ja, ich weiß, aber ich möchte den Shader für das Sprite anwenden, nicht für das ganze Fenster. Aka, schließlich sollte der Kreis in einem Teil des Fensters, nicht auf dem ganzen Fenster gerendert werden. – sfmldev

+1

Okay, also ändern Sie Ihre 'shader.setUniform (" u_resolution ", sf :: Vector2f (800, 600));' in 'shader.setUniform (" u_resolution ", sf :: Vector2f (tex.getSize()));' –

+0

Scheint etwas anderes zu sein, ich bekomme den Kreis im linken unteren Viertel des Bildschirms scheint es, ich Ich werde sehen, ob ich die Werte irgendwie ändern kann, um es dahin zu bringen, wo ich will –

Verwandte Themen