我已经让我的基本 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