OpenGL L系统渲染

时间:2009-06-21 23:59:21

标签: opengl rendering l-systems

嘿伙计们,我已经使我的基本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;
        };

}

我删除了所有这些,因为我确实每个帧都解析了树,我改变了这个循环,这样它就可以保存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;
        };
}

现在我改变了渲染循环,所以我只是直接从矢量数组中读取。

    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。 对这篇文章的篇幅感到抱歉。

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

1 个答案:

答案 0 :(得分:3)

由于您使用的是LINE_STRIP,因此您获得了额外的行。

在你的'F'情况下,将你的线的两个端点推入矢量(就像你原来做的那样)。

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

当你画画时,请使用LINE_LIST。