Application Stage:
输入primitive(点,线段,几何体)即vertex data。
Vertex Data包括:
Vertex Position
Vertex Normal
Vertex Color
Texture coordinate(UV)
Geometry Stage:
Vertex Shader :
改变顶点位置
Vertex Transformation (Model-View-Projection)
纹理坐标转换
Per-vertex Lighting
……
MVP Matrix:
Clip space是视锥空间,然后会由硬件进行透视除法(NormalizedDevice Coordinates, NDC),换算成归一化坐标的立方体空间中(-1,-1,-1)到(1,1,1),方便调整深度与位置。
Primitive Assembly:
图元组装,把零散定点组装成三角形
Tessellation Shader (Optional for DX11,OpenGL4,OpenGL ES3.2):
把Primitive细分成更精细,更多三角面。
Geometry Shader(Optional for DX10,OpenGL3.2,OpenGL ES3.2 ):
输入单个primitive,进行顶点和图元的增减
Clipping:
把NDC空间外的部分剔除,卡在中间的用新顶点补齐。
Screen Mapping:
把3D空间转换到2D屏幕,即屏幕映射。
Rasterizer Stage:
Rasterization & Interpolation:
把三角形区域转化成一片一片fragment(不是Pixel),根据深度与位置其颜色做插值运算。
Fragment data:
Screen coordinate
Color
Depth
Normal
Texture coordinate(UV)
……
Fragment shader:
输入一个个的fragment,改变其颜色值和纹理映射(Texturemapping)
Raster Operations:可以用选项来控制
Pixel Ownership Test:当两个视窗(物体)重叠时,确定pixel的所有权
背面剔除(不在图上)
Scissor(剪刀) Test:设定一个长方形区域,物体只能在里面渲染
Alpha Test:透明度测试,当透明度大于某值或小于某值才渲染
Stencil(模板) Test:使用一个参考值做比较,满足参考值的可以渲染,即用来限制渲染范围
在说明模板测试之前,我们需要先介绍一下模板缓存。
模板缓存与深度测试缓存、后台缓存(或颜色缓存,最终显示在屏幕上的缓冲区)的大小(分辨率)完全一致,模板缓存中的像素点与后台缓存的像素点是一 一对应的。模板缓存允许我们动态地、有针对性地决定是否将某个像素写入后台缓存中。模板缓存用与获得某种特效,如镜面效果或阴影效果。在实现镜面效果时,我们在“镜子”这块区域中绘制某个特定物体的映像,而使用模板缓存来阻止物体映像在“非镜子”的区域中进行绘制。为了进行这种阻止,就需要使用模板测试。判断是否将某个像素写入后台缓存的决策过程,称为模板测试
Depth Test:距离Camara越远深度越高,一般设定深度小的才会被渲染出来
Blending:颜色值混合,把fragment shader输入的颜色值和当前画面的颜色值混合,一般用来做半透明
融合技术能使我们将当前要进行的光栅化的像素的颜色与先前已经光栅化并处于同一位置的像素的颜色进行合成,即将正在处理的图元颜色值与存储中后台缓存中的像素颜色值进行合成。利用该技术,我们可以获得各种各样的效果,尤其是透明效果。不过值得注意的是,为了中场景中绘制透明物体,通常需要对物体按照由后到前的顺序进行混合处理,如果按照任意顺序进行处理将会产生严重的失真。所以在blending(混色)操作之前要来一次Depth test
Dithering:用抖动的方式把颜色值算得更精确
在低位深度的图象中,由于颜色总数的限制,有些颜色无法显示出来,为了模拟出那些颜色以提高显示效果,广泛采用了一种称作抖动处理(dithering)的方法,也称半色调处理(Halftoning)。它是指用交替的点图案去模拟在图象中不能使用的颜色的过程。单色图象是最简单的格式,一般由黑色和白色组成,在一些单色图象如黑白照片和有深浅的图案中,会使用各种灰度,这种图象常被称为灰度图象(Grayscale Image)。由于人眼会把一个很细致的黑白相间的图案解释成灰色,所以灰度图象也可使用单色文件格式,数据仍然可以是黑和白。使用黑色或某一种单色的点获得连续的该色灰度的过程就是抖动处理。抖动处理被更多的用在那些低位数彩色图象文件中,与不采用这种处理相比,它具有更好的显示效果。
Logic OP:用&,||,!来进行一些数值比较,最后输出颜色值到color buffer
相关技术:
Early Z:把Depth Test放到fragment shader之前,可以去掉一些不必要的fragment,节约时间
Double buffering:渲染需要时间,所用用front,end两层buffer,front用来显示,end用来渲染
……
Direct3D和OpenGL
CG是如何跨平台的:
CG位于OpenGL和DX上层
Material,Shader和Texture 的关系
Material是渲染的结果,Shader是Material使用的渲染过程,Texture是shader的参数
Forward Rendering 和Deferred Rendering
鉴于传统的Forward Rendering对于多光源渲染时的低效问题,各种Deferred Rendering的方法被提出并且广泛使用。比如DeferredShading以及其之后的Deferred Lighting。Deferred方法相对于传统Forward Rendering最主要区别都是提高了对多光源渲染时的效率,它是是将光源的计算转到屏幕空间来进行,进而不浪费无效的光源着色。DeferredRendering的方法已经已经成为现在游戏引擎的主流。但是,DeferredShading与Deferred Lighting又是有所不同的:DeferredShading是一股脑儿将所有的Shading全部转到Deferred阶段进行,而Deferred Lighting则是有选择地只将Lighting转到deferred中进行,两种方法的不同也就导致了算法的不同的特点及各自的优劣。
传统的Forward Rendering在外理多光源时基本上需要一个与光源数量及待绘制物体数量相关密切相关的复杂程度,这样就导致效率很低。而DeferredRendering就是将这种与光源相关的计算转到屏幕空间来进行,这样最大程度上减少无关的计算浪费。为了将传统的ForwardRendering转移到Deferred上进行操作需要对光照方程进行分析或改动,并生成相应所需的辅助Buffer来完成最终的着色操作。
Render Target
一个Renter Target即一个渲染出来的场景buffertexture, multiple render target是现在 GPU的一种特性,在可编程管线中同时渲染多张贴图,例如法线贴图,光照贴图,深度图等等,被广泛用于deferredshading,deferred lighting中,因为这些技术需要把深度,法线等等信息(在GPASS中计算)储存于GBUFFER中
Reference:https://blog.csdn.net/bugrunner/article/details/7436600