2

我已经让我的基本 L 系统正常工作,我决定尝试优化应用程序的渲染。以前我用开关盒和绘图循环遍历 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;
        };

}

我删除了所有这些,因为我实际上是在每一帧解析树,我更改了这个循环,以便它将所有顶点保存在一个标准向量中。

    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 时,我会得到额外的伪影。

第一个图像是未优化的原始渲染,然后第二个是运行更快的新渲染,第三个是龙曲线的渲染,它不使用推送和弹出,就像前两个使用的一样(我很漂亮确保推送和弹出是问题出现的地方)。

我在这里存储顶点的逻辑有问题,还是因为我使用的是线带?我只会使用线条,但它根本不起作用,它最终看起来更像是线条。

也很抱歉这篇文章的长度。

替代文字 http://img197.imageshack.us/img197/8030/bettera.jpg 替代文字 http://img23.imageshack.us/img23/3924/buggyrender.jpg 替代文字 http://img8.imageshack.us/ img8/627/dragoncurve.jpg

4

1 回答 1

3

因为您使用的是 LINE_STRIP,所以您得到了这些额外的行。

在您的“F”情况下,将线的两个端点都推入向量中(就像您最初所做的那样)。

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

并且当您绘制时,请改用 LINE_LIST。

于 2009-06-22T00:22:46.380 回答