OpenGL L-System Rendering - PullRequest
       35

OpenGL L-System Rendering

3 голосов
/ 22 июня 2009

Привет, ребята, у меня работает базовая L-система, и я решил попробовать оптимизировать рендеринг приложения. Раньше я перебирал всю строку L-системы с помощью переключателя и рисовал ... еще лучше я покажу вам, что я делал.

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;
        };

}

Я удалил все это, потому что буквально разрешал дерево в каждом отдельном кадре, я изменил этот цикл так, чтобы он сохранял все вершины в стандартном векторе.

    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;
        };
}

Теперь я изменил свой цикл рендеринга, поэтому я просто читаю прямо из массива векторов.

    DesignPatterns::Facades::OpenGLFacade _graphics = DesignPatterns::Facades::openGLFacade::Instance();

_graphics.Begin(OGLFlags::LINE_STRIP);
    for(unsigned int i = 0; i < _vertexVector.size(); i++)
    {
        _graphics.Vertex3f(_vertexVector.at(i).X(), _vertexVector.at(i).Y(), _vertexVector.at(i).Z());
    }
_graphics.End();

Теперь моя проблема в том, что когда я использую векторный массив и использую Line Stip, я получаю дополнительный артефакт. Первое изображение - это исходный рендер, который неоптимизирован, затем второе - более новый рендер, который работает быстрее, а третьи - это рендеринг кривой дракона, которая не использует толчков и всплывающих окон, как первые два (я довольно уверен, что толчок и популярность - то, где проблемы прибывают). Проблема в моей логике хранения вершин или потому, что я использую линейную полосу? Я бы просто использовал строки, но на самом деле это вообще не работает, в конечном итоге это выглядит как line_stipple. Также извините за длину этого поста.

альтернативный текст http://img197.imageshack.us/img197/8030/bettera.jpg альтернативный текст http://img23.imageshack.us/img23/3924/buggyrender.jpg альтернативный текст http://img8.imageshack.us/img8/627/dragoncurve.jpg

1 Ответ

3 голосов
/ 22 июня 2009

Вы получаете эти дополнительные строки, потому что используете LINE_STRIP.

В вашем случае 'F' вставьте обе конечные точки вашей линии в вектор (как вы делали изначально).

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

А когда вы рисуете, используйте вместо этого LINE_LIST.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...