DirectX backface culling(背面剔除)
来源:互联网 发布:域名被抢注 编辑:程序博客网 时间:2024/05/01 21:44
先看一下什么是backface,有backface必然就有frontface,在DX中,frontface是这样定义的,按照顶点定义的先后顺序,呈顺时针排列的顶点构成的三角形是frontface(以view space为参考),与frontface相对的面则是backface,如下图所示。
可见决定frontface的因素有两个
- 顶点定义的先后顺序
- 顶点的排列方向-顺时针或者逆时针(由顶点的位置坐标决定)
先看第一条,如果顶点的位置不变,但是定义顺序变了,可能导致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
不做任何剔除,所以两个三角形都显示
剔除方式2 - D3DCULL_CW
顺时针剔除,由于v0,v1,v2是顺时针排列,故第一个三角形被剔除,只显示第二个
剔除方式3 - D3DCULL_CCW
逆时针剔除,由于v3,v4,v5是逆时针排列,故第二个三角形被剔除,只显示第一个
不指定剔除方式,结果同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轴负方向,那么剔出的方向就正好反过来,即原来的顺时针剔除变成逆时针剔除了。
原文来自:http://www.cnblogs.com/graphics/archive/2010/11/21/1883139.html
- DirectX backface culling(背面剔除)
- DirectX backface culling(背面剔除)
- DirectX backface culling(背面剔除)
- DirectX3D游戏开发七 backface culling(背面剔除)
- 3D数学 学习笔记(10) 背面剔除(Clipping)、裁切(Backface Culling)、光栅化(Rasterzation)
- OpenGL学习脚印:背面剔除(Face Culling)
- C# Managed DirectX 背面剔除
- Backface Culling
- 多边形背面剔除
- D3DRS_CULLMODE(背面剔除)
- OpenGL背面剔除
- 5.10.2 背面剔除
- 软渲染-背面剔除
- 面剔除 Face Culling
- 背面剔除的数学原理
- 关于背面剔除的概念。
- 第三章 第六节 背面剔除
- C# 模拟光照运算以及背面剔除
- 用户不在sudoers文件中的解决方法
- 如何确定Linux内核源代码目录即,$KBUILD的路径
- MATLAB2014b安装(Ubuntu 14.10)
- 黑马程序员_Java_File、Properties
- windows 多线程同步技术
- DirectX backface culling(背面剔除)
- 学习设计模式的书籍
- 【Swift初见】Swift函数(一)
- linux下编程----git版本控制
- Android应用程序基础(Manifest结构预览约定和进程生命周期)
- 2015年开始学习安卓应用程序2015-2-25
- opencv2改变图像的大小
- ThreadPoolExecutor中策略的选择与工作队列的选择(java线程池)
- 条件表达式的类型