Bonjour/Bonsoir, J'utilise depuis un moment la SFML (2.1 actuellement) et je m'interesse tout juste aux Shaders.
Je ne connais pas vraiment comment fonctionne OpenGl, et je m'en remet a la SFML pour ca, pour le moment. J'ai parcouru le tuto d'OpenClassrooms sur le GLSL, et celui de la SFML et j'ai parcouru le forum mais je ne comprend toujours pas où est mon erreur...
Voici mon code:
#include <SFML/Graphics/RenderWindow.hpp>
#include <SFML/Graphics/Text.hpp>
#include <SFML/Window/Event.hpp>
#include <SFML/Graphics/Shader.hpp>
#include <iostream>
#include "VertexTab/VertexTab.hpp" //reprise de sf::VertexArray avec quelques methodes persos.
int main()
{
srand (time(NULL));
//sf::RenderWindow fenetre(sf::VideoMode::getDesktopMode(), "fenetre", sf::Style::Fullscreen);
sf::RenderWindow fenetre(sf::VideoMode(1024,512), "fenetre", sf::Style::Default);
fenetre.setPosition(sf::Vector2i((1920-fenetre.getSize().x)/2,(1080-fenetre.getSize().y)/2));
fenetre.setVerticalSyncEnabled(true);
sf::Texture texture1, texture2;
if (!texture1.loadFromFile("Ressources/pierres_sable.png"))
return EXIT_FAILURE;
if (!texture2.loadFromFile("Ressources/pierres_grises.png"))
return EXIT_FAILURE;
va::VertexTab rect(sf::Triangles,6);
//positionnement des vertexs.
rect[0].position=sf::Vector2f(100.f,100.f);
rect[1].position=sf::Vector2f(100.f,164.f);
rect[2].position=sf::Vector2f(164.f,164.f);
rect[3].position=sf::Vector2f(100.f,100.f);
rect[4].position=sf::Vector2f(164.f,164.f);
rect[5].position=sf::Vector2f(164.f,100.f);
rect[0].texCoords=sf::Vector2f(0.f,0.f);
rect[1].texCoords=sf::Vector2f(0.f,64.f);
rect[2].texCoords=sf::Vector2f(64.f,64.f);
rect[3].texCoords=sf::Vector2f(0.f,0.f);
rect[4].texCoords=sf::Vector2f(64.f,64.f);
rect[5].texCoords=sf::Vector2f(64.f,0.f);
sf::Shader shad1;
if(!shad1.loadFromFile("Shaders/Shad1.vert","Shaders/Shad1.frag"))
return EXIT_FAILURE;
sf::RenderStates etat;
etat.shader=&shad1;
shad1.setParameter("texture",texture1);
while(fenetre.isOpen())
{
sf::Event evenements;
while(fenetre.pollEvent(evenements))
{
switch (evenements.type)
{
case sf::Event::Closed:
fenetre.close();
break;
case sf::Event::KeyPressed:
if(evenements.key.code == sf::Keyboard::Escape)
{ fenetre.close(); }
if(evenements.key.code == sf::Keyboard::F2)
{
fenetre.capture().saveToFile("capture.png");
}
break;
default:
break;
}
}
fenetre.clear(sf::Color::Transparent);
fenetre.draw(rect,etat);
fenetre.display();
}
return EXIT_SUCCESS;
}
et mes shaders, Vertex Shader:
void main()
{
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
gl_FrontColor = gl_Color;
}
copie de l'exemple SFML pour le Fragment Shader:
uniform sampler2D texture;
void main()
{
// lookup the pixel in the texture
vec4 pixel = texture2D(texture, gl_TexCoord[0].xy);
// multiply it by the color
gl_FragColor = gl_Color * pixel;
}
et le resultat:
http://imgur.com/xTtlq9Nau lieu de:
http://imgur.com/G5N8jfmJe suppose que j'oublie quelque chose mais j'ai beau chercher, je ne trouve pas de solution autre que celle que j'applique actuellement...
je précise que je ne souhaite pas fournir ma texture au sf::RenderState, sinon ca marche très bien, je souhaite comprendre comment fonctionne les Shader pour par la suite me faire un système qui permet d'utiliser plusieurs texture dans un seul appel a "Draw".
au cas où, je suis sous ubuntu 14.04 mais je doute que ce soit un problème système.
Merci d'avance pour vos réponses et je vous souhaite une agréable soirée/journée dépendant de l'heure a laquelle vous me lirez ^^.
EDIT: comment faire pour afficher des images? je les ai upload sur imgur, mais l'option "inserer image" ne fonctionne pas comme je pensais...