DirectX backface culling(背面剔除)

简介:

先看一下什么是backface,有backface必然就有frontface,在DX中,frontface是这样定义的,按照顶点定义的先后顺序,呈顺时针排列的顶点构成的三角形是frontface(以view space为参考),与frontface相对的面则是backface,如下图所示。

可见决定frontface的因素有两个

  1. 顶点定义的先后顺序
  2. 顶点的排列方向-顺时针或者逆时针(由顶点的位置坐标决定)

先看第一条,如果顶点的位置不变,但是定义顺序变了,可能导致frontface变成backface,如下图

 

再看第二条,如果顶点的定义顺序不变,但是位置变了,也可能导致frontface变成backface,如下图

 

通常backface都是不可见的,为了提高渲染速度,DX允许用户对backface进行剔除,有三种剔除方法

  • D3DCULL_NONE - 不进行任何剔除
  • D3DCULL_CW  - 按顺时针方向进行剔除
  • D3DCULL_CCW - 按逆时针方向进行剔除(这是DX的默认剔除方式

该上代码了,下面的代码定义6个顶点,一共可以画两个三角形,我们看一下各种剔除方式是如何工作的。由于顶点数目不多,这里不使用IndexBuffer,直接用VertexBuffer操作,为了方便,这里采用D3DFVF_XYZRHW | D3DFVF_DIFFUSE格式的顶点,省去Transform和Lighting操作

复制代码
ScreenVertex Vertices[] =
{
    { 50.0f, 100.0f, 0.0f, 1.0f, 0xffff0000}, // 0
    {100.0f,  50.0f, 0.0f, 1.0f, 0xffff0000}, // 1
    {150.0f, 100.0f, 0.0f, 1.0f, 0xffff0000}, // 2
    {200.0f,  50.0f, 0.0f, 1.0f, 0xffff0000}, // 3
    {250.0f, 100.0f, 0.0f, 1.0f, 0xffff0000}, // 4
    {300.0f,  50.0f, 0.0f, 1.0f, 0xffff0000}, // 5
};
复制代码

剔除方式1 - D3DCULL_NONE

不做任何剔除,所以两个三角形都显示

g_pd3dDevice -> SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE) ;

 

剔除方式2 - D3DCULL_CW

顺时针剔除,由于v0,v1,v2是顺时针排列,故第一个三角形被剔除,只显示第二个

g_pd3dDevice -> SetRenderState(D3DRS_CULLMODE, D3DCULL_CW) ;

 

剔除方式3 - D3DCULL_CCW

逆时针剔除,由于v3,v4,v5是逆时针排列,故第二个三角形被剔除,只显示第一个

g_pd3dDevice -> SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW) ;

 

不指定剔除方式,结果同D3DCULL_CCW,因为D3DCULL_CCW是默认的剔除方式。

练习一下

给定如下一个立方体,如果按照D3D默认的剔除方式(逆时针剔除),那么正确的顶点顺序是什么样的呢?假设使用vertex buffer。

需要注意的是,我们在定义每个面上的三角形时,一定是正对着这个面,也就是以该面法向量相对的方向去观察这个面,然后在定义三角形中顶点顺序,这在立方体中尤为重要。所以正确的顺序如下。

复制代码
CUSTOMVERTEX vertices[] =
    {
        A, E, H, A, H, D, // front face
        C, G, F, C, F, B, // back face
        B, F, E, B, E, A, // left face
        D, H, G, D, G, C, // right face
        E, F, G, E, G, H, // top face
        D, C, B, D, B, A, // bottom face
    };
复制代码

如果深入下去的话,backface culling 还与Transform以及coordinates相关,有时间再讨论,比如视点的位置也可能影响culling的方向,我们上面讨论的都是假定视点在Z轴负方向,视线朝向Z轴正方向的,如果视点在Z轴正方向,视线指向Z轴负方向,那么剔出的方向就正好反过来,即原来的顺时针剔除变成逆时针剔除了。


本文转自zdd博客园博客,原文链接:http://www.cnblogs.com/graphics/archive/2010/11/21/1883139.html,如需转载请自行联系原作者

相关文章
|
2月前
Google Earth Engine(GEE)——MODIS/061/MOD09GQ数据缺失波段信息(官方引入数据超时)
Google Earth Engine(GEE)——MODIS/061/MOD09GQ数据缺失波段信息(官方引入数据超时)
24 0
|
安全 Python
python库ffmpeg的错误解决方法:“Couldn‘t find ffmpeg or avconv - defaulting to ffmpeg, but may not work“
简介:python库ffmpeg的错误解决方法:“Couldn‘t find ffmpeg or avconv - defaulting to ffmpeg, but may not work“
python库ffmpeg的错误解决方法:“Couldn‘t find ffmpeg or avconv - defaulting to ffmpeg, but may not work“
|
6月前
|
JavaScript
Angular 内容投影出现 No provider for TemplateRef found 错误的单步调试
Angular 内容投影出现 No provider for TemplateRef found 错误的单步调试
56 2
|
Python
Python 库配置问题:“Couldn‘t find ffmpeg or avconv - defaulting to ffmpeg, but may not work“. 解决办法
Python 库配置问题:“Couldn‘t find ffmpeg or avconv - defaulting to ffmpeg, but may not work“. 解决办法
743 0
Python 库配置问题:“Couldn‘t find ffmpeg or avconv - defaulting to ffmpeg, but may not work“. 解决办法
|
存储 XML C#
Unity 实用小技巧(更新ing)
Unity 实用小技巧(更新ing)
161 0
Unity 实用小技巧(更新ing)
|
iOS开发
Xcode消除警告:-1: The iOS Simulator deployment target is set to 6.0, but the range of supported deplo...
Xcode消除警告:-1: The iOS Simulator deployment target is set to 6.0, but the range of supported deplo...
131 0
Xcode消除警告:-1: The iOS Simulator deployment target is set to 6.0, but the range of supported deplo...
Libra教程之:运行自定义move modules
Libra教程之:运行自定义move modules
|
机器学习/深度学习 人工智能 开发工具
|
前端开发
Angular 默认的Change detection策略及缺陷
默认策略下,用户事件,计时器,XHR,promise等事件触发,所有的组件都会执行变更检测。
Angular 默认的Change detection策略及缺陷
|
Kubernetes Linux C语言
如何处理VirtualBox启动错误消息:The vboxdrv kernel module is not loaded
如何处理VirtualBox启动错误消息:The vboxdrv kernel module is not loaded
584 0

热门文章

最新文章