Direct3D11学习:(六)渲染管线

转载请注明出处:http://www.cnblogs.com/Ray1024

一、概述

这篇文章主要讲解渲染管线(rendering pipeline)的理论知识。

渲染管线是指:在给定一个3D场景的几何描述及一架已确定位置和方向的虚拟摄像机(virtual camera)时,根据虚拟摄像机的视角生成2D图像的一系列步骤。

下图所示为构成渲染管线的各个阶段,以及与各个阶段相关的内存资源。

从上图中我们可以看到,渲染管线就像工厂中的流水线,把各个处理过程分成不同的阶段,各个阶段可以独立工作,这样,各个阶段就可以同时工作,效率自然就会比较高。3D渲染从最初的场景描述到最终的显示结果,这整个过程就是在3D渲染管线中完成的。

这篇文章中,我们将详细讲解D3D11中渲染管线的各个阶段。

二、渲染管线的各个阶段

2.1 输入装配阶段

输入装配(Input Assembler,简称IA)阶段从内存读取几何数据(顶点和索引)并将这些数据组合为几何图元(例如,三角形、直线)。我们通过指定图元拓扑来告诉Direct3D以何种方式组成几何图元。D3D11中常见的拓扑类型有以下几种:

(1)点列表(point list):每个顶点都会被绘制为一个独立的点,如下图:

(2)线带(line strip):前后相邻的两个顶点会形成一条直线,如下图:

(3)线列表(line list):每两个顶点会形成一条独立的直线,如下图:

(4)三角形带(triangle strip):带状方式形成连续的三角形,如下图:

(5)三角形列表(triangle list):每三个顶点会形成一个独立的三角形,如下图:

例如,使用三角形列表来构建四边形,给出顶点数组和索引列表:

Vertex v[4] = {v0, v1, v2, v3};

UINT indexList[6] = {0, 1, 2,   // Triangle0

  0, 2, 3};  // Triangle1

构成下图由两个三角形组成的四边形:

除了这5种拓扑图元类型外,还有两种:带有邻接信息的图元和控制点面片列表。这里不多作介绍,在后面学习到曲面细分技术时再来了解。

2.2 顶点着色器阶段

在完成图元装配后,顶点将被送往顶点着色器(vertex shader)阶段。

顶点着色器可以被看成是一个以顶点作为输入输出数据的函数。每个将要绘制的顶点都会通过顶点着色器推送至硬件。顶点着色器函数由我们自己编写,但是它会在GPU上运行,所以执行速度非常快。许多效果,比如变换(transformation)、光照(lighting)和置换贴图映射(displacement mapping)都是由顶点着色器来实现的。记住,在顶点着色器中,我们不仅可以访问输入的顶点数据,也可以访问在内存中的纹理和其他数据,比如变换矩阵和场景灯光。

(1) 局部空间和世界空间

我们在创建3D场景时,不在全局场景坐标系(world space,世界空间)中建立物体,而是在局部坐标系(local space,局部空间)中建立物体;局部坐标系是最常用的实用坐标系,它的原点接近于物体中心,坐标轴的方向与物体的方向对齐。在完成3D模型的制作之后,将模型放到全局场景中;通过计算局部坐标系相对于世界坐标系的原点和轴向,实现相应的坐标转换变换。将坐标从局部坐标系转换到世界坐标系的过程称为世界变换(world transform),相应的变换矩阵称为世界矩阵(world matrix)。当所有的物体都从局部空间变换到世界空间后,这些物体就会位于同一个坐标系(世界空间)中。如果你希望直接在世界空间中定义物体,那么可以使用单位世界矩阵(identity world matrix)。

(2)观察空间

我们在场景中指定一个虚拟摄像机,我们把一个局部坐标系(称为观察空间、视觉空间或摄像机空间)附加在摄像机上,该坐标系以摄像机的位置为原点,以摄像机的观察方向为z轴正方向,以摄像机的右侧为x轴,以摄像机的上方为y轴。在渲染管线的随后阶段中,使用观察空间来描述顶点比使用世界空间来描述顶点要方便的多。从世界空间到观察空间的坐标转换称为观察变换(view transform),相应的矩阵称为观察矩阵(view matrix)。

(3)投影与齐次剪裁空间

摄像机能看到的范围通过一个平截头体(frustum)来描述,它是一个在近平面处削去尖部的棱锥体,如下图。

这个空间即世界空间的物体被投影到相应的投影面上之后,继而进行裁剪操作所在的空间叫投影与齐次剪裁空间。

2.3 曲面细分阶段

Hull Shader Stage、Tessellation Stage、Domain Shader Stage统称为曲面细分阶段(Tessellation Stage),指通过添加三角形的方式对一个网格的三角形进行细分,这些新添加的三角形可以偏移到一个新的位置,让网格的细节更加丰富。曲面细分阶段是Direct3D 11中新添加的,这样我们就可以在GPU上对几何体进行细分了。曲面细分阶段是可选的,我们将在以后详细介绍。

2.4 几何着色器阶段

几何着色器阶段(geometry shader stage)是D3D11中加入的新特性,是可选的。几何着色器以完整的图元作为输入数据。例如,当我们绘制三角形列表时,输入到几何着色器的数据是构成三角形的三个点。(注意,这三个点是从顶点着色器传递过来的。)几何着色器的主要优势是它可以创建或销毁几何体。例如,输入图元可以被扩展为一个或多个其他图元,或者几何着色器可以根据某些条件拒绝输出某些图元。这一点与顶点着色器有明显的不同:顶点着色器无法创建顶点,只要输入一个顶点,那么就必须输出一个顶点。几何着色器通常用于将一个点扩展为一个四边形,或者将一条线扩展为一个四边形。这是一项高级技术,我们会在后面的章节中对它进行讨论,这里只做一个简短的概述。

2.5 光栅化阶段

光栅化(rasterization)阶段的主要任务是为投影后的3D三角形计算像素颜色。这个阶段属于不可编程阶段,即完全由硬件实现,主要包括:

(1)视口变换

即把投影变换后得到的顶点的x,y坐标,根据用户设定的视口参数,变换到屏幕上对应的坐标。

(2)背面消隐(Backface Culling)

摄像机不会看到实心物体的背面,所以绘制它们是毫无意义的。背面消隐是指让管线放弃对朝后的三角形的处理。这可以将所要处理的三角形的数量降低到原数量的一半。

(3)顶点属性差值

我们通过指定三角形的3个顶点来定义一个三角形。除位置外,顶点还可以包含其他属性,比如颜色、法线向量和纹理坐标。在视口变换之后,这些属性必须为三角形表面上的每个像素进行插值。顶点深度值也必须进行插值,以使每个像素都有一个可用于深度缓存算法的深度值。对屏幕空间中的顶点属性进行插值,其实就是对3D空间中的三角形表面进行线性插值这一工作需要借助所谓的透视矫正插值(perspective correct interpolation)来实现。本质上,三角形表面内部的像素颜色都是通过顶点插值得到的。

2.6 像素着色器阶段

像素着色器(Pixel shader)是由我们编写的在GPU上执行的程序。像素着色器会处理每个像素片段(pixel fragment),它的输入是插值后的顶点属性,由此计算出一个颜色。像素着色器可以非常简单地输出一个颜色,也可以很复杂,例如实现逐像素光照、反射和阴影等效果。

2.7 输出合并阶段

在输出合并(output merger,简称OM)阶段中,某些像素片段会被丢弃(例如,未能通过深度测试或模板测试)。未丢弃的像素片段会被写入后台缓冲区。混合(blending)工作是在该阶段中完成的,一个像素可以与后台缓冲区中的当前像素进行混合,并以混合后的值作为该像素的最终颜色。某些特殊效果,比如透明度,就是通过混合来实现的,我们在以后的学习中会介绍。

三、结语

Direct3D11整个渲染管线就介绍到这里,我们最后总结一下,渲染管线的各个阶段按照先后顺序分别为:输入装配阶段、顶点着色器阶段、曲面细分阶段、几何着色器阶段、光栅化阶段、像素着色器阶段和输出合并阶段。

3D渲染管线是非常重要的3D图形学的理论知识。在之后的学习中,我们将学习渲染管线的实际使用。

时间: 2024-10-22 04:55:01

Direct3D11学习:(六)渲染管线的相关文章

C#多线程学习(六) 互斥对象

C#多线程学习(六) 互斥对象 如何控制好多个线程相互之间的联系,不产生冲突和重复,这需要用到互斥对象,即:System.Threading 命名空间中的 Mutex 类. 我们可以把Mutex看作一个出租车,乘客看作线程.乘客首先等车,然后上车,最后下车.当一个乘客在车上时,其他乘客就只有等他下车以后才可以上车.而线程与Mutex对象的关系也正是如此,线程使用Mutex.WaitOne()方法等待Mutex对象被释放,如果它等待的Mutex对象被释放了,它就自动拥有这个对象,直到它调用Mute

Beaglebone Back学习六(Can总线测试)

Can总线测试 1 Can总线 控制器局域网 (Controller Area Network, 简称 CAN 或 CANbus)是一种通信协议,其特点是允许网络上的设备直接互相通信,网络上不需要主机(Host)控制通信.是由研发和生产汽车电子产品著称的德国BOSCH公司开发了的,并最终成为国际标准(ISO11898).CAN总线原理是通过CAN总线.传感器.控制器和执行器由串行数据线连接起来.它不仅仅是将电缆按树形结构连接起来,其通信协议相当于ISO/OSI参考模型中的数据链路层,网络可根据协

JBPM学习(六):详解流程图

概念: 流程图的组成: a. 活动 Activity / 节点 Node b. 流转 Transition / 连线(单向箭头) c. 事件 1.流转(Transition) a) 一般情况一个活动中可以指定一个或多个Transition i. 开始活动(Start)中只能有一个Transition. ii. 结束活动(End)中没有Transition. iii. 其他活动中有一条或多条Transition b) 如果Transition只有一个,则可以不指定名称(名称是null):如果有多个

Cmdlet开发与学习(六)

之前的内容主要是关于cmdlet开发的,下面要将的内容,是关于在应用程序中集成PowerShell引擎. 运行空间和管道       Runspace类是PowerShell引擎API的重要组成部分,Runspace实例代表一个PowerShell执行引擎实例,其中包含自己的一系列变量,驱动器映射,函数等.这些资源统称为运行空间的"会话状态". 创建并调用Pipeline类的实例,我们就可以在运行空间中使用命令行.Pipeline类实例代表PowerShell命令行对象,其中包含各种命

程序设计入门学习六步曲

初学者遇到最多的困惑是:上课也能听懂,书上的例题也能看明白,可是到自己动手做编程时,却不知道如何下手.发生这种现象的原因有三个: 一.所谓的看懂听明白,只是很肤浅的语法知识,而我们编写的程序或软件是要根据要解决问题的实际需要控制程序的流程,如果你没有深刻地理解C语言的语句的执行过程(或流程),你怎么会编写程序解决这些实际问题呢? 二.用C语言编程解决实际问题,所需要的不仅仅是C语言的编程知识,还需要相关的专业知识.例如,如果你不知道长方形的面积公式,即使C语言学得再好你也编不出求长方形的面积的程

Spark学习六:spark streaming

Spark学习六:spark streaming 标签(空格分隔): Spark Spark学习六spark streaming 一概述 二企业案例分析 三Spark streaming的工作原理 四textFileStreaming的应用 四企业中的开发方式 五总结 一,概述 一个简单的实例 1,安装nc nc -lk 9999 2,启动应用 ./bin/run-example streaming.NeworkWordCount localhost 9999 二,企业案例分析 需求: 实时统计

TweenMax动画库学习(六)

目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            TweenMax动画库学习(四)            TweenMax动画库学习(五)              TweenMax动画库学习(六)  上一节我们主要聊了TweenMax动画库中的currentLabel():获取当前状态.getLabelAfter():获取下一个状态.getLabel

springMVC3学习(六)--SimpleFormController

SimpleFormController提交表单流程例如以下: login.jsp <form action="login" method="post"> 用户名:<input type="text" name="username"/></br> 密码:<input type="password" name="password"/><

Oracle学习(六):子查询

1.知识点:可以对照下面的录屏进行阅读 SQL> --子查询所要解决的问题:问题不能一步求解 SQL> --查询工资比SCOTT高的员工信息 SQL> --(1)使用普通方法 SQL> --1. SCOTT的工资 SQL> select sal from emp where ename='SCOTT'; SQL> --2. 查询比3000高的员工 SQL> select * 2 from emp 3 where sal>3000; SQL> --(2)

Jetty学习六:配置连接器

连接器配置概览 连接器用于接收网络连接,配置一个连接器需要配置: 1)连接器的网络参数(例如:端口): 2)连接器使用的服务(例如:executors,schedulers): 3)为接收连接而初始化和配置协议的连接工厂. Jetty主要使用的连接器类型为ServerConnector. 标准Jetty发布使用下面的Jetty XML文件创建和配置连接器: 1)jetty-http.xml 初始化一个ServerConnector,用于接收HTTP连接(可以被升级到WebSocket连接). 2