Bonjour
je travail actuellement sur un shader qui me servirait à masquer des éléments hors cadre (l'idée étant de faire un système de fenêtres, donc de pouvoir masquer les éléments dépassant de la fenêtre.
J'arrive à dire au shader de rendre tel pixel avec un alpha nul suivant tel condition machin bidule ... faire un masque quoi.
Mais je n'arrive pas à afficher (avec un shader) un shape sans texture, avec sa couleur/opacité (RVBA) d'origine (pour pouvoir l'afficher correctement quand il est visible dans la fenêtre).
une version simplifié du code:
le cpp :
#include <SFML/Graphics.hpp>
int main()
{
sf::RenderWindow window(sf::VideoMode(800, 600), "My window");
// le shape sans texture
sf::RectangleShape rect_sansTexture( { 50 , 50 } );
rect_sansTexture.setFillColor(sf::Color( 255,255,0,100));
// le shape avec texture
sf::Texture texture;
texture.loadFromFile( "senseidoigt.gif");
sf::RectangleShape rect_avecTexture( { 50 , 50 } );
rect_avecTexture.setTexture( &texture );
// le shader
sf::Shader shader;
shader.loadFromFile("clippingMask.frag", sf::Shader::Fragment );
while (window.isOpen()){
window.clear(sf::Color(70,70,70));
// la version sans shader
rect_sansTexture.setPosition (20,20);
rect_avecTexture.setPosition (80,20);
window.draw( rect_sansTexture );
window.draw( rect_avecTexture );
// la version avec shader
sf::RenderStates state;
state.shader = &shader;
shader.setParameter("texture", sf::Shader::CurrentTexture);
rect_sansTexture.setPosition (20,120);
rect_avecTexture.setPosition (80,120);
window.draw( rect_sansTexture , state );
window.draw( rect_avecTexture , state );
window.display();
}
return 0;
}
le shader :
uniform sampler2D texture;
void main() {
// la couleur du pixel de la texture
vec4 pixel = texture2D(texture, gl_TexCoord[0].st);
// la couleur du rectangle (FillColor)
vec4 color = gl_Color;
// donc => pixel * texture nous donne noire si pas de texture
gl_FragColor = pixel * color;
}
le resultat :
donc quand on a une texture sur le shape, ça marche nickel (il ne fait rien
, l'image avec ou sans le shader sont identiques ), mais sans texture ... a marche po ! .. le rectangleShape à le bon alpha, mais devient noir, snif.
je crois comprendre le souci mais sans savoir le résoudre :
la couleur du pixel(de la texture) multipliée par la couleur de shape (du fillColor) donne noir quand il n'y a pas de texture, j'imagine.
j'ai essayé pas mal de trucs un peu dans tout les sens, fait tout plein de recherches, mais j'ai pas trouvé grand chose d'éclairant.
merci d'avance