渲染流程分为3个阶段:应用阶段、几何阶段、光栅化阶段
应用阶段:应用阶段是由CPU进行处理
首先,准备数据,场景中需要渲染的数据进行准备,位置信息等
其次Culling剔除,把不可见的物体进行剔除。
最后设置渲染状态,设置渲染图元。输出渲染的几何信息
几何阶段:这一阶段由GPU进行
几何阶段的重要任务是把顶点坐标变换到屏幕中,再交给光栅器进行处理。
光栅化:这一阶段同样有GPU完成,使用上一个阶段的数据产生屏幕像素,并最终渲染成图像。光栅化的主要任务是决定每个渲染图元中的那些像素应该被绘制在屏幕上。需要对上一个阶段得到的逐顶点数据(纹理坐标、顶点颜色等)进行插值,然后逐像素处理。
渲染流水线的起点是Cpu。即应用阶段
应用阶段大致分为三个阶段:
1,把数据加载到显存中,2,设置渲染状态,3,调用DrawCall。
DrawCall是一个命令,指向一个需要被渲染的图元(primitives)列表,不包含材质信息。
Gpu流水线:从cpu得到数据后,进行一些列的流水线操作。对于最后的两个阶段,几何阶段和光栅化阶段,开发者没有绝对的控制权。
顶点着色器(Vertex Shader)是完全可编程。
顶点着色器的处理单位是点,所以输入的每个顶点都会调用一次顶点着色器,顶点着色器本身不可以创建或销毁顶点,而且无法得到其他顶点的关系。顶点着色器的主要工作:坐标变换和逐顶点光照。同时为下一阶段准备数据。
坐标转换:顶点着色器可以在这个阶段进一步改变顶点位置,在顶点动画中非常有用,可以模拟水面,布料等。
一个最基本的顶点着色器必须完成的工作是,把顶点坐标从模拟空间转换到齐次裁剪空间。
例子:o.pos=mul(UNITY_MVP,v.postions);
顶点坐标转换齐次裁剪空间,经过透视剔除后得到
归一化设备坐标(Normalized Device Coordinates,NDC)
OpenGL 的z值是[-1.1] DirectX的z值是[0,1]
顶点着色器的常见输出路径是顶点--片元,也可以发送给曲面细分或几何着色器。
曲面细分着色器(Tessellation Shader)是可选的着色器
几何着色器(Geometry Shader)可选着色器
裁剪(Clipping)裁剪掉不在摄像机视野内的区域
图元与摄像机有三种关系:完全在视野内,部分在视野内,完全不在视野。完全在视野内的交由传递给下一个流水阶段,完全不在视野的不处理。部分在视野内,要有Clipping处理。这一步不可编程,但可以自定义一个裁剪操作对这一步进行处理.
映射屏幕(Screen Mapping)不可操作。OpenGl以屏幕左下角为开始坐标。DirectX以屏幕左上角为坐标开始。
三角形遍历 检查每个像素是否被一个三角网格覆盖。如果覆盖,产生一个片元(fragment).也称为扫描变换。
片元着色器 在Directx中也被称为像素着色器 每一个片元负责存储光栅化产生的一系列数据。真正会对图像产生影响的阶段是--逐片元操作 。在片元着色器中,可以完成重要的渲染技术,最重要的是纹理采样,通常会对顶点着色器阶段输出每个顶点对应的纹理坐标,经过三角形遍历的插值后,可以得到覆盖片元的纹理坐标。
逐片元操作 在DirectX中也称为输出合并阶段。
这一阶段有几个主要任务。
(1)决定每个片元的可见性,涉及到深度测试,模板测试等
(2)如果片元经过了测试,就要把这个片元的颜色和存储在颜色缓冲区里的颜色进行混合
对于不透明的物体可以关闭混合(Blend)。混合是高度可控的。
为了保证我们看到的图像是连续的。Gpu会使用双重缓冲技术。后置缓冲(Back Buffer)和前置缓冲(Front Buffer),当后置缓冲完成后,会替代前置缓冲。
常见的shader语言:DirectX 的HLSL(High Level Shading language)、OpenGL的GLSL(OpenGl Shading Language)、以及英伟达的CG(C For Graphic)
GLSL是依赖硬件而非操作系统。所以编译结果取决于硬件供应商。即显卡驱动。