2009-06-21 8 views
3

Hé les gars, j'ai fait fonctionner mon L-System de base et j'ai décidé d'essayer d'optimiser le rendu de l'application. Auparavant, je bouclais toute la chaîne du L-System avec un boîtier de commutateur et de dessin ... mieux encore, je vais vous montrer ce que je faisais.Rendu OpenGL L-System

for(unsigned int stringLoop = 0; stringLoop < _buildString.length(); stringLoop++) 
{ 

     switch(_buildString.at(stringLoop)) 
     { 
     case'X': 
      //Do Nothing 
      //X is there just to facilitate the Curve of the plant 
      break; 
     case'F': 

      _prevState = _currState; 
      _currState.position += _currState.direction * stdBranchLength; 
      //Set the previous state to the current state 
      _graphics.SetColour3f(0.0f, 1.0f, 0.0f); 

      _graphics.Begin(OGLFlags::LINE_STRIP); 
       _graphics.Vertex3f(_prevState.position.X(), _prevState.position.Y(), _prevState.position.Z()); 
       _graphics.Vertex3f(_currState.position.X(), _currState.position.Y(), _currState.position.Z()); 
      _graphics.End(); 

      break; 
     case'[': 
      _prevStack.push(_currState); 
      break; 
     case']': 
      _prevState = _currState; 
      _currState = _prevStack.top(); 
      _prevStack.pop();    
      break; 
     case'-': 

      _currState.direction = _currState.direction.RotatedAboutZ(-(ROTATION) * Math::DegreesToRadians); 

      break; 
     case'+': 
      _currState.direction = _currState.direction.RotatedAboutZ(ROTATION * Math::DegreesToRadians); 

      break; 
     }; 

} 

j'ai enlevé tout cela parce que je suis littéralement résoudre l'arbre chaque cadre, je l'ai changé cette boucle afin qu'il sauverait tous les vertices dans un vecteur std.

for(unsigned int stringLoop = 0; stringLoop < _buildString.length(); stringLoop++) 
{ 

     switch(_buildString.at(stringLoop)) 
     { 
     case'X': 
      break; 
     case'F': 

      //_prevState = _currState; 
      _currState.position += _currState.direction * stdBranchLength; 
      _vertexVector.push_back(_currState.position); 

      break; 
     case'[': 
      _prevStack.push(_currState); 
      break; 
     case']': 
      _currState = _prevStack.top(); 
      _prevStack.pop();    
      break; 
     case'-':    
      _currState.direction = _currState.direction.RotatedAboutZ(-(ROTATION) * Math::DegreesToRadians); 
      break; 
     case'+': 
      _currState.direction = _currState.direction.RotatedAboutZ(ROTATION * Math::DegreesToRadians); 
      break; 
     }; 
} 

Maintenant, j'ai changé ma boucle de rendu, donc je viens de lire directement à partir du tableau de vecteurs. Maintenant, mon problème est que lorsque j'utilise un tableau vectoriel et que j'utilise Line Stip, j'obtiens un artefact supplémentaire. La première image est le rendu original qui est le non optimisé, puis le second est le nouveau rendu qui s'exécute plus rapidement, et les troisièmes sont un rendu d'une courbe de dragon qui n'utilise aucune poussée et pop comme les deux premiers utilisent (je suis assez sûr que la poussée et la pop sont où les problèmes arrivent). Est-ce que le problème avec ma logique ici est de stocker des verticies, ou est-ce parce que j'utilise une ligne linéaire? J'utiliserais simplement des lignes, mais ça ne marche pas du tout, ça finit par ressembler plus à un line_stipple. Désolé également de la longueur de ce poste.

alt text http://img197.imageshack.us/img197/8030/bettera.jpg alt text http://img23.imageshack.us/img23/3924/buggyrender.jpg alt text http://img8.imageshack.us/img8/627/dragoncurve.jpg

+0

Le problème est-il que votre arbre rouge est plus "écrasé" dans X? –

Répondre

3

vous obtenez ces lignes supplémentaires parce que vous utilisez un LINE_STRIP.

Dans votre cas F, poussez les deux extrémités de votre ligne dans le vecteur (comme vous le faisiez à l'origine).

_vertexVector.push_back(_prevState.position); 
_vertexVector.push_back(_currState.position); 

Et lorsque vous dessinez, utilisez plutôt LINE_LIST.

+0

Merci beaucoup, c'est pourquoi j'aime Stack-Overflow – Craig