DirectX backface culling(背面剔除)

1010 篇文章 11 订阅
480 篇文章 12 订阅

先看一下什么是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 - 按逆时针方向进行剔除

其中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是默认的剔除方式。

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

 

 

TrangleStrip——三角形带是一系列相连的三角形,每两个相邻的三角形共享两个顶点。剔除模式会自动翻转所有偶数个三角形(flipped on all even-numbered triangles),因为相邻的三角形共享两个顶点,他们会被翻到反方向。这也是复杂的3D对象使用的最多的图元类型。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值