这里是SunshineBooming,GPU公司一枚小小的Driver工程师,主要工作是写DirectX12 Driver,我会持续更新这个DX12 Spec系列,可能比较冷门,但是都是干货和工作中的心得体会,有任何GPU相关的问题都可以在评论区互动,知无不言:

DirectX12 Spec 总目录

目录

  • 1. 什么是Triangle Culling(三角形剔除)?
  • 2. 什么是Winding Order(绕序)?
  • 3. 如何用Winding Order(绕序)做Culling(剔除)?

1. 什么是Triangle Culling(三角形剔除)?

  • 我们都知道,在现有的3D图形框架中,3D模型都是由Triangle有序排列起来的。例如一个长方体有6个面,每个面可以拆分成2个Triangle。那么我们就可以用[Tri0…Tri11]这样12个Triangle有序排列,最后还原成一个长方体的3D模型:
  • 同时我们也可以发现,在正对着长方体某个面的观察视角上,例如这样:

    在此视角下,只能观察到Tri0、Tri1两个三角形组成的平面,Tri2/3/4/5是无法看见的,因此这部分Triangle在DirectX12的Rendering Pipeline中可以预先剔除(Culling),这样做可以减少不必要的计算量,提高渲染效率。

2. 什么是Winding Order(绕序)?

  • Winding Order是几何图形学中的知识。假设一个Triangle由3个Vertex构成,且3个Vertex输入到DX12驱动的Input Layout顺序,为Ver0->Ver1->Ver2,这个Vertex的排布顺序,就是Triangle的绕序(Winding Order)

    根据左手定则,在该绕序条件下,Triangle的法向量,为传出纸向外,且垂直于该平面的单位向量。
  • 注意:DirectX12判定平面法向量用的是左手定则,OGL正好相反,用的是右手定则
  • 所以我们可以看出,每个Triangle的Vertex绕序,决定了该Triangle图形的法向量方向

3. 如何用Winding Order(绕序)做Culling(剔除)?

  • 有了绕序的概念,做剔除的原理其实很简单。
  • 我们知道DirectX12做渲染过程中,所有3D模型最后都要统一到观察空间(View Space)。每个3D模型先在局部空间建模,然后通过世界矩阵->世界空间,然后根据Camera在世界空间中摆放的参数,得到观察矩阵,再通过观察矩阵,将世界空间->观察空间(扯远了。。。)。
  • 那么观察空间也是一个三维空间:

    Camera观察方向指向+Z方向,所以我们规定,任何一个Triangle的法向量,和-Z方向的单位向量(比如(0,0,-1))做比较,2个向量夹角在[0,Pi/2)范围留下,在[Pi/2,Pi]范围剔除,因为大于Pi/2角度的平面,是背向观察方向的平面,所以是不可见的:

    法向量如何确定呢?就是根据之前说的的绕序确定。
  • 所以剔除的整个原理就是这样简单,其中算法向量和算向量夹角都有数学公式支撑,这里不做赘述。
  • 另外剔除的整个计算和判定过程都是由GPU Hardware端做的,因为一个简单的3D模型,都可能有成千上万个Triangle组成,计算量是非常大的。

DirectX12 - Triangle Culling and Winding Order(三角形的剔除与绕序)相关推荐

  1. 设计如下类: 1) 建立一个Point类,表示平面中的一个点;建立一个Line类,表示平面中的一条线端, 内含两个Point类的对象;建立Triangle类,表示一个三角形

    设计如下类:     1) 建立一个Point类,表示平面中的一个点:建立一个Line类,表示平面中的一条线端,     内含两个Point类的对象:建立Triangle类,表示一个三角形,内含三个L ...

  2. 学习Jonathan Shewchuk的Triangle:分治法中三角形的几何信息和拓扑信息的操作

    介绍 想必研究网格细分技术的同学们不会不知道Jonathan Richard Shewchuk,凭借作品Triangle获得了2003年数值计算软件威尔金森奖.先拿下他的图来镇下楼(图片出自:点击打开 ...

  3. Project Euler 102:Triangle containment 包含原点的三角形

    Triangle containment Three distinct points are plotted at random on a Cartesian plane, for which -10 ...

  4. Directx12 Spec 总目录

    这里是SunshineBooming,GPU方向一枚小小的Driver工程师,主要工作是写DirectX12 Driver,我会持续更新这个DX12 Spec系列,可能比较冷门,但是都是干货和工作中的 ...

  5. 【OpenGL】谢尔宾斯基(Sierpinski)地毯 OpenGL分形(七)

    文章目录 效果展示 原理简介 大致流程: 关键点: 最终代码 主函数代码 着色器代码 包含头文件 效果展示 https://www.bilibili.com/video/BV1Ri4y1g7Gg 阴影 ...

  6. DirectX12 之HelloWorld

    DirectX12 之HelloWorld 如果用DX12书写一个最基础的图形程序,一个仅包含几何体顶点位置和顶点色的Box的程序会是怎样的呢?这个程序是DX12龙书第六章的案例.同时它也常常被图形界 ...

  7. 当我们谈游戏优化时,我们谈些什么

    前言 过去几年里,我经历过大约几十场面试,几乎在每次面试的时候,面试官都会问提一个问题:"你在渲染性能优化方面有什么经验?"这个时候我就会开始揣测面试官的意图,试着去回忆他之前提的 ...

  8. dx12 龙书第十一章学习笔记 -- 模板

    模板缓冲区是一种"离屏"(off-screen)缓冲区,我们可以用它来实现一些特殊的效果.模板缓冲区.后台缓冲区以及深度缓冲区都有着相同的分辨率,所以三者相同位置上的像素就能一一对 ...

  9. php实现 三角形_用PHP作 定义Triangle类,表示三角形类

    LIANHK class Triangle { // 属性成员,表示三角形的三边 private $_a; private $_b; private $_c; // 初始化三角形三边值 public  ...

最新文章

  1. 操作系统 实验三 进程调度模拟程序
  2. Android 中的接口回调
  3. 《Python Cookbook 3rd》笔记(3.16):结合时区的日期操作
  4. java dom xpath_Java:在org.w3c.dom文档中获取元素的xpath
  5. 面试官 | 说一下什么是代理模式?
  6. UDK编辑器 49条小提示
  7. python_类方法和静态方法
  8. oracle中least()和greastest()函数的使用,其中还包含一些if...then..elseif的使用
  9. Nvelocity模板引擎
  10. 基于极限学习机的自编码器(ELM-AE)
  11. 电话机器人源码智能电话机器人7项技术特点,教你选择合适的电话机器人!
  12. IntelliJ IDEA 代码格式化,快捷键
  13. [codeforces 1384A] Common Prefixes 上一字串是当前字串的基础(构造)
  14. C语言规律,C语言中运算符结合型规律
  15. java 设置 cors,Spring MVC配置CORS
  16. TikTok干货分享:月入20000美金的操作手法分享
  17. video标签的使用以及通过js控制视频开始与暂停
  18. pandas的数据拼接与合并(concat、join、merge)
  19. python+sklearn训练决策树分类模型(绘制学习曲线和验证曲线)
  20. 简单步骤实现wordpress添加og协议

热门文章

  1. python with打开多个文件_在python中使用with打开多个文件的方法
  2. 最新微信红包封面+抽奖小程序/小程序开源源码
  3. 8个常见的研究者认知偏误陷阱(转载)
  4. 云服务服务器免费使用
  5. 基于DCMTK的医学影像工作站设计
  6. 通用计算机按其规模速度和功能,电脑基础知识详解
  7. 有关获取并保存微信头像到本地服务器
  8. 天翼4gdongle linux,SIM7600X 4G DONGLE用户手册 (重定向自SIM7600CE-CNSE 4G DONGLE)
  9. 在线支付系列【2】支付宝和微信支付发展史
  10. 【机器学习】五种超参数优化技巧