zoukankan      html  css  js  c++  java
  • [翻译]XNA 3.0 Game Programming Recipes之twentyeight

    PS:自己翻译的,转载请著明出处格
                                                    5-6 Enable Backface Culling:它是什么,他能为你做什么。
    问题
                   在先前的章节,在Draw方法中你总能找下面的行:
    1 device.RenderState.CullMode=CullMode.None;
                   如果您删除此线和移动相机到三角形的背后,它们就会消失!
                   此外,当您启动确定三角形的顶点不用理解backface culling,每个三角形您定义有百分之五十的机会没有被显示出来。
    解决方案
                   这个方法定义三角形的顶点告诉XNA哪一边你想面对摄象机
                   当绘制一个实心物体,一个人可以说清楚三角形的哪一边是在对象的里面或者在外面。绘制必要的三角形,你可以
    要求XNA去绘制唯一的三角形,它的前边是面对摄象机的。所有其它的三角形(它的前边远离摄象机)在对象的背后一边,被三角形的前边隐藏!
                   虽然,对于一台计算机来说事情不是如此的微不足道。为你定义的每一个三角形,你需要去说明它的哪条边是在里面或者不在里面。你做这个可以定义一个三角形的三个顶点逆时针或顺时针顺序。
    它是如何工作的
                   当确定顶点时,你需要保持摄象机的位置。如果你想要的三角被绘制,该顶点的顺序所看到的相机必须是顺时针的方式进行
                   可视化这一点,你可以想象从摄象机过来的光线从三角形的中心通过,如图5-9所示。如果顶点的顺序(被摄象机所看见!)围绕这个中心点用顺时针旋转如图象的左部分,XNA认为这个三角形面对摄象机;然后,三角形被绘制。

                   如果你把摄象机放在同一个三角后面,如图5-9右边所显示,顶点的顺序(在次看到摄象机!)增加用逆时针方式(如果你没有看见这个,立即阅读)。XNA将考虑这个三角形如果没有面对摄象机就不会绘制它。
                   图5-10显示同样的情况,但是这一次显示从摄象机的视觉范围。它应该清楚摄象机看到顶点的顺序在右边用逆时针方式。

    Why Do You Need Backface Culling?
                   单一一个三角形的情况是对显示的原理非常有益处的,但是不会真正显示backface culling的益处。简要提及介绍这有一节,backface culling是非常有意思的当绘制实心对象,如地形模型。
                   让我们来讨论一个立方体做为一个例子。虽然你旋转立方体,在任何时候,你每次只能看见立方体的三个面。意思是其他的三个面纯粹是浪费你图形卡的强大处理能力。没有面对摄象机的三角形不会被绘制。
                   作为一个例子,你保持这个立方体只能看见它的前脸,如图5-11左边所示。接下来,注视图的右边,那里立方体的前脸的一个三角形和后脸的一个三角形会高亮显示。
                   数据表明顶点的顺序。六个面由十二个三角形组成,要求有36个顶点被定义。在图5-11这些数字表明顶点定义了两个三角形。
    注意:你使用的是指数,立方体只有八个独特的顶点,但是仍然要求36个indices去绘制十二个三角形从八个顶点中。
                   图5-12左部分显示这个射线来自于你的摄象机,和三角形虚线相交。重点是虚线,它表明射线和前面的三角形的交点。当你按照前面三角形顶点增加顺序(从0开始1到2),你会看到正在围绕点顺时针旋转。其结果是,XNA将绘制这个三角形。
                  现在焦点在射线和后三角形的交叉点。当你随着后面三角形顶点的增加顺序(从6开始到7到8),你将会造成逆时针旋转。因此,XNA会剔除这个三角形,这非常好,因为它是在立方体的背后,会被前脸所挡住!
                  图5-12右边所显示同样的立方体,旋转180度,前脸和后脸转化下位置。摄象机仍然在这页的这边。现在你随着顶点6到7到8,你正在顺时针旋转围绕着眼睛射线。这时,你的图形卡将绘制这个三角形和裁减其他!这完全是一样的。
                 这就是你的图形卡知道哪个三角形被裁剪。裁剪没有面对摄象机的三角形,可以大大提高渲染的效果,这一项被默认是激活的。

    提示:5-7节包含一个圆柱的例子。确保裁剪是打开的,然后准确的移动下你的摄象机在圆柱的上面,看看发生了什么!
    When and How to Turn Off Culling
                 虽然裁剪提供一个巨大益处当绘制由固体表面组成的对象,有时候你想要关掉裁剪。例如,如果你创建一个建筑物,矩形的墙壁仅由两个三角形组成,这个墙壁从外面看起来非常好。虽然,摄象机进入建筑物时,这墙壁将会被裁剪掉。
                 为了解决这个,你可以定义两个额外的三角形为这个墙壁用相反的围绕顺序,所以无论采用哪种方式看,两个三角形绘制和两个三角形被裁剪。
                 一个很简单的方法是用下面的代码关闭裁剪:
    1 device.RenderState.CullMode=CullMode.None;
                 不要忘记把裁剪打开在你的代码绘制了墙体之后,虽然,你屏幕上剩下被绘制,裁剪启用。
                 你想使裁剪可以使用当绘制实心物体时,同时你想关闭裁减当绘制从两边都可以看到的一个表面。
    提示:尤其是在设计和调试你的程序时,你可以关掉裁剪。这样做删除了为什么对象不能被绘制的可能性之一。
    代码
                 例子代码定义一个立方体用顺时针顺序和逆时针顺序。当运行逆时针版本时,你可以看见XNA绘制只有一个三角形,它实际上不应该被绘制。
                  当你运行顺时针版本是,试着移动你的摄象机到立方体内。
  • 相关阅读:
    斐波那契数列——兔子问题
    最长上升子序列
    洛谷P1325 雷达安装
    K短路
    DIJ的优化,和spfa的优化
    洛谷P5017摆渡车
    洛谷P2258 子矩阵
    三元表达式、列表推导式和生成器表达式
    递归调用、 二分法
    匿名函数、内置函数
  • 原文地址:https://www.cnblogs.com/315358525/p/1537741.html
Copyright © 2011-2022 走看看