Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Shader, texture & vertexarray  (Lu 1278 fois)

0 Membres et 1 Invité sur ce sujet

nico69

  • Newbie
  • *
  • Messages: 22
    • Voir le profil
Shader, texture & vertexarray
« le: Mai 13, 2017, 09:41:58 pm »
Bonjour,

Je débute actuellement dans le domaine des shader, et j'essaye de les faire fonctionner avec la sfml.

J'ai réalisé un shader en me basant sur un sprite, qui fonctionne.
Maintenant, je veut l'utiliser sur des vertexarray, et le rendu n'est pas le même.

Sans Shader (droite vertexarray, gauche sprite):
https://www.hostingpics.net/viewer.php?id=579046sans.png
Avec shader
https://www.hostingpics.net/viewer.php?id=779144avec.png

J'ai l'impression, lors de l'utilisation d'un shader, les coordonnées de texture ne sont pas normalisés sur un vertexarray, mais le sont correctement sur un sprite (si je change la couleur en bas a droite de la texture, tout le redu change de couleur du coté du vertexarray avec shader).

Voici mon code :
#include <SFML/Graphics.hpp>
#include <SFML/Graphics/Glsl.hpp>
#include "ressource.h"
#include <iostream>
#include <random>

sf::VertexArray quad(sf::FloatRect rect, sf::Vector2f offset)
{
    sf::VertexArray array(sf::Quads, 4);
    array[0] = sf::Vertex(sf::Vector2f(0, 0) + offset, sf::Vector2f(rect.left, rect.top));
    array[1] = sf::Vertex(sf::Vector2f(rect.width*2, 0) + offset, sf::Vector2f(rect.left + rect.width, rect.top));
    array[2] = sf::Vertex(sf::Vector2f(rect.width*2, rect.height*2) + offset, sf::Vector2f(rect.left + rect.width, rect.top + rect.height));
    array[3] = sf::Vertex(sf::Vector2f(0, rect.height*2) + offset, sf::Vector2f(rect.left, rect.top + rect.height));
    return array;
}

int main()
{
    sf::RenderWindow window(sf::VideoMode(1000, 600), "SFML works!");
    window.setFramerateLimit(60);

    sf::View v(window.getView());
    v.setCenter(sf::Vector2f(0, 0));
    window.setView(v);

    Texture img("Res/img.png");
    sf::Shader shader;
    shader.loadFromFile("Src/basicshader.vert", "Src/basicshader.frag");
    shader.setUniform("texture", *img);

    sf::Sprite s(*img);
    s.setScale(2.0f, 2.0f);
    s.setPosition(-sf::Vector2f(img->getSize()) - sf::Vector2f(250, 0));

    sf::VertexArray array(quad(sf::FloatRect(0, 0, img->getSize().x, img->getSize().y), sf::Vector2f(0, -(float)img->getSize().y)));

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        window.clear();
        window.draw(s, &shader);
        window.draw(array, &shader);
        //window.draw(s, img());
        //window.draw(array, img());
        window.display();
    }

    return 0;
}

Et les shaders (très simple pour l'exemple)
//vertex
void main()
{
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
    gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
    gl_FrontColor = gl_Color;
}

//fragment
uniform sampler2D texture;

void main()
{

    vec4 pixel = texture2D(texture, gl_TexCoord[0].xy);
    gl_FragColor = gl_Color * pixel;
}
 

Est ce un bug de la sfml, ou ai-je loupé une étape dans mon rendu ?
Je n'ai pas envie de normaliser au cas par cas (avec/sans shader).
Si c'est un bug, quel moyen ai-je pour le contourner ?

ps : j'utilise sfml 2.4.2

Merci pour votre aide
« Modifié: Mai 13, 2017, 09:51:17 pm par nico69 »