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

Auteur Sujet: GLSL avec sfml  (Lu 1319 fois)

0 Membres et 1 Invité sur ce sujet

Allcatraz

  • Newbie
  • *
  • Messages: 1
    • Voir le profil
GLSL avec sfml
« le: Novembre 22, 2016, 02:54:05 am »
Bonjour,

J'ai commencé le développement d'un jeu en alternance avec mes études, mais j'ai rencontré un problème avec les shader SFML. Je n'ai aucune expérience dans ce domaine et mes profs n'en n'ont pas plus donc je suis obligé de poser ma question ici.

Premièrement, est t-il possible d'utiliser les version plus récentes de GLSL avec sfml? Puisque les globales comme gl_TexCoord,  gl_ModelViewProjectionMatrix, gl_Vertex, etc, n'existent plus au dessus de la version 120 je ne trouve pas trop comment faire. Si oui serais t-il possible de me donner un exemple de vertex et fragment shader basique(assez pour afficher une texture et changer la couleur des fragment selon la texture) svp. Ou bien me donner une source à consulter si vous en avez une.

Deuxièmement, j'ai réussis à faire un shader simple pour gérer la lumière, mais j'ai des performances horribles avec. Je passe de 1600-2000 fps à 40-60 fps  :-\.
Voici le code que j'utilise, bien sur il n'est pas complet, mais j'ai mis toutes les parties qui utilisent le shader :
// .h
float maxDistance = 300.0f;
float ambient = 0.1f;
const char * vertexShader =
"void main()\n"
"{\n"
        "gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
        "gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;\n"
"}\n";

const char * fragmentShader =
//"#version 150\n"
"uniform sampler2D texture;\n"
"uniform float lighting;\n"

"void main()\n"
"{\n"
        "gl_FragColor = lighting * texture2D(texture, gl_TexCoord[0].xy);\n"
"}\n";

//.cpp
//Activation du shader
// grassTextureState et dirtTextureState sont des RenderStates
if (activateShader)
        {
                shader = new Shader();
                shader->loadFromMemory(vertexShader, fragmentShader);
                shader->setUniform("texture", sf::Shader::CurrentTexture);
                grassTextureState.shader = shader;
                dirtTextureState.shader = shader;
        }
        else
        {
                dirtTextureState.shader = NULL;
                grassTextureState.shader = NULL;
        }

// Le Draw pour une tuile (Tile est une classe contenant un tableau de vertex)
// environ 2500 Tiles sont déssinées à chaque itérations
if (activateShader)
{
        float distance = Utility::DistanceEntreDeuxPoints(allBlocks[y][x].vertexArray[0].position, player.getPosition());
        float lighting = 0;
        if (distance > maxDistance)
        {
                lighting = ambient;
        }
        else
        {
                lighting = std::max(1.0f - (distance / maxDistance), ambient);
        }
                shader->setUniform("lighting", lighting);
        }

        // Vérifie si le block au dessus est du background
        if (y - 1 > -1 && allBlocks[y - 1][x].vertexArray[0].position != allBlocks[y - 1][x].vertexArray[1].position)
        {
                window.draw(allBlocks[y][x].vertexArray, 4, PrimitiveType::Quads, dirtTextureState);
        }
        else
        {
                window.draw(allBlocks[y][x].vertexArray, 4, PrimitiveType::Quads, grassTextureState);
        }

 

Tout ça donne quelque chose du genre (je suis pas trop sur que l'insertion d'image ai fonctionné donc au cas ou : https://gyazo.com/74e9b3b82cb27be088dc3d30eff76fb7) :
J'ai l'effet désiré, mais comme j'ai dis ce sont les performances qui me tracasse.

Je vous remercie d'avance pour vos réponses.

 

anything