Salut !
Je suis en train de me pencher sur les shaders pour une future application, et je n’arrive pas à faire ce que je veux…
Mon objectif : faire en sorte que quel que soit l’ordre d’affichage, les pixels dont la composante verte est la plus élevée soit au dessus de tout.
J’ai donc créé ces shaders :
vertexShadervoid main(void)
{
vec4 position = gl_ModelViewMatrix * gl_Vertex;
position.z = gl_Color.g;
gl_Position = gl_ProjectionMatrix * position;
gl_FrontColor = gl_Color;
}
fragmentShadervoid main(void)
{
gl_FragDepth = gl_Color.g;
gl_FragColor = gl_Color;
}
Un code minimal de SFML pour tester les shaders :
#include <SFML/Graphics.hpp>
void processEvent(sf::RenderWindow& p_window);
int main()
{
sf::ContextSettings contextSettings(0xFF, 0, 0xFF);
sf::RenderWindow window(sf::VideoMode(800, 600), "SFML window", sf::Style::Default, contextSettings);
sf::VertexArray array1(sf::Triangles, 3);
array1[0].position.x = 0;
array1[0].position.y = 0;
array1[0].color = sf::Color::Green;
array1[1].position.x = 30;
array1[1].position.y = 0;
array1[1].color = sf::Color::Green;
array1[2].position.x = 0;
array1[2].position.y = 100;
array1[2].color = sf::Color::Green;
sf::VertexArray array2(sf::Triangles, 3);
array2[0].position.x = 10;
array2[0].position.y = 20;
array2[0].color = sf::Color::Blue;
array2[1].position.x = 50;
array2[1].position.y = 20;
array2[1].color = sf::Color::Blue;
array2[2].position.x = 20;
array2[2].position.y = 120;
array2[2].color = sf::Color::Blue;
sf::Shader shader;
shader.loadFromFile("vertexShader", "fragmentShader");
while (window.isOpen())
{
processEvent(window);
window.clear();
window.draw(array1, sf::RenderStates(&shader));
window.draw(array2, sf::RenderStates(&shader));
window.display();
}
return EXIT_SUCCESS;
}
void processEvent(sf::RenderWindow& p_window)
{
sf::Event event;
while (p_window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
p_window.close();
}
}
Avec ce shader, je pensais que le triangle vert serait au dessus du bleu, ce qui n’est pas le cas…
Du coup, je veux bien un petit coup de main s’il vous plaît :p
Remarque : en ajoutant le depthBuffer au sf::ContextSettings, je pensais que ça résoudrait le problème, mais apparemment non.
Autre remarque : le code SFML que je donne est un code minimal, il va de soi que dans cet exemple, il suffit de dessiner les objets dans l’autre ordre. Toutefois, dans mon vrai programme, chaque vertexArray comporte des pixels plus ou moins verts.
Merci d’avance