我有一个小项目,地板设计有小立方体(100X100).
如果我超过这个限制,我的游戏遭遇重大减速和联赛!
这是我如何画地板的:
//Function to draw my ground ( 100 X 100 X 1) public void DrawGround(GameTime gameTime) { // Copy any parent transforms. Matrix[] transforms = new Matrix[this.model.Bones.Count]; this.model.CopyAbsoluteBoneTransformsTo(transforms); //loop 1 cube high for (int a = 0; a < 1; a++) { //loop 100 along cube for (int b = 0; b < 100; b++) { //loop 100 cubic wide for (int c = 0; c < 100; c++) { // Draw the model. A model can have multiple meshes, so loop. foreach (ModelMesh mesh in this.model.Meshes) { // This is where the mesh orientation is set, as well // as our camera and projection. foreach (BasicEffect effect in mesh.Effects) { effect.EnableDefaultLighting(); effect.World = transforms[mesh.ParentBone.Index] * Matrix.CreateTranslation(this.position); effect.View = this.view; effect.Projection = this.projection; } // Draw the mesh, using the effects set above. mesh.Draw(); } } } } }
我认为最好使用[VertexBuffer]“显卡内存”,但我还没有找到我想做的教程……
你能举个例子在我的函数“DrawGround”中使用[VertexBuffer]吗?
非常感谢你!
TL;博士;使用Hardware Instancing绘制立方体. (可选)使用View Frustum Culling以避免绘制不可见的实例.通过阅读Riemer’s Tutorial开始使用顶点和索引缓冲区.
实例化
这个想法是,顶点和索引缓冲区一次绑定到设备,然后在一次绘制调用中多次绘制.实例是一小块数据,仅包含模型实例的唯一信息.此实例数据将写入另一个顶点缓冲区,并与包含实际顶点和索引的缓冲区绑定到设备.
你怎么能利用它?
在您的情况下,您将具有以下设置:
>包含立方体网格索引的IndexBuffer
>包含立方体网格顶点的VertexBuffer
>第二个VertexBuffer,包含要绘制的所有立方体的变换
>一种特殊的输入布局,可以将实例数据考虑在内
由于您的立方体的位置不同,您甚至不必将完整的转换矩阵发送到着色器.只需发送实例位置并将其添加到顶点位置即可.您还可以为每个实例发送颜色等其他数据.
你是如何实现它的?
一个快速的谷歌搜索给了我大量的xna实例的结果,所以这应该让你开始.这里有两个看似有希望的随机结果:
> SO question on XNA instancing
> Hardware instancing for PC in XNA 4, with textures
沮丧剔除
在任何时候,场景中只有一小部分网格实际上是可见的.对象可能被另一个对象遮挡,或者完全位于玩家的视野之外.在绘制之前删除这些不可见网格的过程称为剔除.查看Frustum Culling的第二个案例:
所有与相机音量不相交的音量都是不可见的.
相机的音量是多少?正交投影具有盒子形式的边界体积.透视投影,这个盒子是锥形的,金字塔,由近和远的平面裁剪;因此看到视锥体.
你怎么能利用它?
使用视锥体来识别当前帧中不可见的实例.仅绘制与相机的视锥体相交的那些立方体.当玩家仰望天空时,渲染负荷可降低高达100%.