Bonjour .
J'ai implémenté un effet de lumière, basé sur sf::RenderTexture. SVP pouvez-vous me donner votre avis, si quelque chose ne va pas?
Ca marche, mais c'est assez gourmand, et donne un rendu qui n'est pas forcément souhaité (j'ai comme un légers assombrissement autour de ma lumière générée).
J'ai besoin de génerer un grand nombre de ces lumières, et quand j'arrive au bout d'une centaine, par exemple, ça commence a ralentir (et j'ai un ordi assez puissant ). J'aimerais donc savoir si ma façon de procéder pourrait être optimisé/doit être revue etc...
mon système est ainsi:
Les objets lumineux contiennent un petit objet "Lumiere", qui contiennent une position, une taille, une sf::Color.
class Lumiere
{
public:
Lumiere();
~Lumiere();
void positionne(float x, float y);
void recoitTaille(int taille);
void changeTaille(int change);
void recoitCouleur(int rouge, int vert, int bleu, int alpha);
sf::Vector2f renvoiPosition();
sf::Color renvoiCouleur();
int renvoiTaille();
private:
float m_x, m_y;
sf::Color m_couleur;
int m_taille;
};
Ils envoient aux objets de décor sur lequel ils se trouvent (a l'aide de collision ) l'adresse de leurs lumières.
class DecorModulaire
{
...
private:
vector<Lumiere*> m_LumiereVector;
...
}
void DecorModulaire::recoitLumiere()
{
...
if(collisionne())
{
if(m_demarreLumiere)
{
m_renderTexture = new sf::RenderTexture;
m_renderTexture->create( m_textureLumiere->getSize().x , m_textureLumiere->getSize().y );
m_demarreLumiere = false;
}
...
m_lumiereVector.push_back(m_objetQuiEnvoiLaLumiere->renvoiLumiere());
...//ici avec conditions pour que seul les lumières demandés soient envoyés au moment voulut
}
...
}
Ceux ci vont alors utiliser sf::RenderTexture pour superposer le nombre de lumières qu'ils doivent mettre sur la texture de fond, à l'aide de la texture de lumière du même décor.
//utilisation des donnés de la lumière a imprimer, a un rytme comparable a celui de l'animation(16 frame/s )
for(vector<Lumiere*>::iterator it = m_lumiereVector.begin() ; it != m_lumiereVector.end() ; it ++ )
{
m_x_lumiere = (*it)->renvoiPosition().x - m_x ;
m_y_lumiere = (*it)->renvoiPosition().y - m_y ;
m_tailleLumiere = (*it)->renvoiTaille();
//transformation de ces données en cercle avec dégradé
sf::Vertex vertexCercle[36];
vertexCercle[0] = sf::Vector2f( m_x_lumiere , m_y_lumiere );
vertexCercle[1] = sf::Vector2f( m_x_lumiere , m_y_lumiere - m_tailleLumiere );
vertexCercle[2] = sf::Vector2f( m_x_lumiere + m_tailleLumiere/2 , m_y_lumiere - sqrt ( -( (m_tailleLumiere/2) * (m_tailleLumiere/2) ) + (m_tailleLumiere * m_tailleLumiere) )
);
vertexCercle[..] = ...
...
vertexCercle[0].texCoords = sf::Vector2f( m_x_lumiere , m_y_lumiere );
vertexCercle[1].texCoords = sf::Vector2f( m_x_lumiere , m_y_lumiere - m_tailleLumiere );
vertexCercle[2].texCoords = sf::Vector2f( m_x_lumiere + m_tailleLumiere/2 , m_y_lumiere - sqrt ( -( (m_tailleLumiere/2) * (m_tailleLumiere/2) ) + (m_tailleLumiere * m_tailleLumiere) ) );
vertexCercle[..].texCoords ...
...
vertexCercle[0].color = sf::Color( (*it)->renvoiCouleur() );
vertexCercle[1].color = sf::Color( 0 , 0 , 0 , 0 );
vertexCercle[2].color = sf::Color( 0 , 0 , 0 , 0 );
vertexCercle[..].color ...
...
//et ici la transformation de la texture
EI eiTest; //EI pour EntiteImage
eiTest.recoitTexture(m_textureLumiere);
for(int compteur = 0; compteur < 36 ; compteur ++)
{
eiTest.recoitVertex(vertexCercle[compteur]);
}
m_renderTexture->draw(eiTest);
}
m_renderTexture->display();
m_EI_lumiere.recoitTexture(m_renderTexture->getTexture());
}
et enfin voici, dans mon EI, ce qui se passe quand je lui envoie des vertexs :
...
public:
void recoitVertex(sf::Vertex vertex2)
{
m_vectorVertex.push_back(vertex2);
}
private:
virtual void draw(sf::RenderTarget& cible, sf::RenderStates states) const
{
if (m_actif && m_vectorVertex.empty())
{
states.texture = m_texture;
cible.draw(m_tableauVertex,4,sf::Quads,states);
}
if(!m_vectorVertex.empty())
{
cible.draw(&m_vectorVertex[0], m_vectorVertex.size(), sf::Triangles, m_texture);
}
}
...
vector<sf::Vertex> m_vectorVertex;
Comme je le disais, ca marche mais c'est assez lourd. Si je ne met que quelques dizaines de lumières, ca tourne sans problème, mais dès que j'en génère quelques centaines, en me baladant dans l'environnement, ca commence a ramer....
Donc, svp, si vous pouvez m'aider, j'aimerais savoir si :
a ce stade , c'est normal que ca rame, avec le sf::RenderTexture, pour ce qui est demandé...
si cette facon de programmer vous semble "propre"...
comment faire pour éviter cette zonne sombre autour de la lumière ? utiliser un blend pourrait résoudre le pb? ou cela vient des vertexs?
Merci si vous pouvez m'aider