1
Graphique / Re: Shader de flou gaussien
« le: Octobre 22, 2018, 11:34:41 am »
Bonjour,
en effet le seul problème est le shader. Je n'ai pas trouvé de tutoriels prorpre sur le sujet, j'avais donc copié le code que j'avais trouvé. J'ai regardé l'exemple "blur" de la SFML mais l'effet n'était pas assez important (même en changeant le radius) : pour obtenir l'effet souhaité, je devait appliquer le shader 4/5 fois ? la suite, beaucoup moins performant que la petite fonction que j'avais créée :
Du coup je ne pense pas passer par des shaders. Merci beaucoup quand même
en effet le seul problème est le shader. Je n'ai pas trouvé de tutoriels prorpre sur le sujet, j'avais donc copié le code que j'avais trouvé. J'ai regardé l'exemple "blur" de la SFML mais l'effet n'était pas assez important (même en changeant le radius) : pour obtenir l'effet souhaité, je devait appliquer le shader 4/5 fois ? la suite, beaucoup moins performant que la petite fonction que j'avais créée :
void createblur(sf::RenderTexture &renderTexture, int boxSize, int iterations = 1)
{
for (int n = 0; n < iterations; ++n)
{
sf::Image img = renderTexture.getTexture().copyToImage();
sf::Image _new;
_new.create(img.getSize().x, img.getSize().y);
for (int i = 0; i < img.getSize().x; ++i)
{
for (int j = 0; j < img.getSize().y; ++j)
{
int sum = 0, r = 0, g = 0, b = 0, a = 0;
for (int ii = -boxSize / 2; ii < boxSize / 2; ++ii)
{
for (int jj = -boxSize / 2; jj < boxSize / 2; ++jj)
{
if (sf::IntRect(0, 0, img.getSize().x, img.getSize().y).contains(sf::Vector2i(ii + i, jj + j)))
{
sum += 1;
sf::Color color = img.getPixel(i + ii, j + jj);
r += color.r;
b += color.b;
g += color.g;
a += color.a;
}
}
}
if (sum == 0)
_new.setPixel(i, j, sf::Color(0, 0, 0, 0));
else
_new.setPixel(i, j, sf::Color(round(r / sum), round(g / sum), round(b / sum), round(a / sum)));
}
}
renderTexture.clear();
sf::Texture texture;
texture.loadFromImage(_new);
sf::Sprite sprite(texture);
renderTexture.draw(sprite);
renderTexture.display();
}
}
{
for (int n = 0; n < iterations; ++n)
{
sf::Image img = renderTexture.getTexture().copyToImage();
sf::Image _new;
_new.create(img.getSize().x, img.getSize().y);
for (int i = 0; i < img.getSize().x; ++i)
{
for (int j = 0; j < img.getSize().y; ++j)
{
int sum = 0, r = 0, g = 0, b = 0, a = 0;
for (int ii = -boxSize / 2; ii < boxSize / 2; ++ii)
{
for (int jj = -boxSize / 2; jj < boxSize / 2; ++jj)
{
if (sf::IntRect(0, 0, img.getSize().x, img.getSize().y).contains(sf::Vector2i(ii + i, jj + j)))
{
sum += 1;
sf::Color color = img.getPixel(i + ii, j + jj);
r += color.r;
b += color.b;
g += color.g;
a += color.a;
}
}
}
if (sum == 0)
_new.setPixel(i, j, sf::Color(0, 0, 0, 0));
else
_new.setPixel(i, j, sf::Color(round(r / sum), round(g / sum), round(b / sum), round(a / sum)));
}
}
renderTexture.clear();
sf::Texture texture;
texture.loadFromImage(_new);
sf::Sprite sprite(texture);
renderTexture.draw(sprite);
renderTexture.display();
}
}
Du coup je ne pense pas passer par des shaders. Merci beaucoup quand même