OpenGL 渲染管线

  1. 顶点数据:顶点数据是一系列顶点的集合。一个顶点(Vertex)是一个3D坐标的数据的集合。而顶点数据是用顶点属性(Vertex Attribute)表示的,它可以包含任何我们想用的数据,比如顶点的坐标,颜色,法线,纹理坐标等。
  2. 顶点着色器:把一个单独的顶点及其属性作为输入,主要功能是进行坐标变换。将输入的局部坐标变换到世界坐标、观察坐标和裁剪坐标。虽然也可在顶点着色器进行光照计算(称作高洛德着色),然后经过光栅化插值得到各个片段的颜色,但由于这种方法得到的光照比较不自然,所以一般在片段着色器进行光照计算。
  3. 图元装配:将顶点着色器输出的所有顶点作为输入(如果是GL_POINTS,那么就是一个顶点),并将所有的点装配成指定图元的形状。图元组装阶段会进行裁剪和背面剔除相关的优化,以减少进入光栅化的图元的数量,加速渲染过程。
  4. 几何着色器:图元装配阶段的输出会传递给几何着色器(Geometry Shader)。几何着色器把图元形式的一系列顶点的集合作为输入,它可以通过产生新顶点构造出新的(或是其它的)图元来生成其他形状。
  5. 剪切:顶点可能会落在视口之外,此时与顶点相关的图元会做出改动,以保证相关的像素不会在视口外绘制。
  6. 视口变换:投影到屏幕空间(模型经过转换到屏幕空间之后,GPU会计算出每个像素的深度、像素的颜色、插值得出的纹理坐标、像素位置等数据。)
  7. 光栅化:把图元映射为最终屏幕上相应的像素,生成供片段着色器(Fragment Shader)使用的片段(Fragment)。在片段着色器运行之前会执行裁切(Clipping)。
  8. 片段着色器:用来决定屏幕上像素的最终颜色。在这个阶段会进行光照计算以及阴影处理,是渲染管线高级效果产生的地方。 通常,片段着色器包含3D场景的数据(比如光照、阴影、光的颜色等等),这些数据可以被用来计算最终像素的颜色。
  9. 测试混合:测试包括裁切测试、Alpha测试、模板测试和深度测试。没有经过测试的片段会被丢弃,不需要进行混合阶段;经过测试的片段可被绘制到帧缓存中,之后会进入混合阶段。Alpha混合可以根据片段的alpha值进行混合,用来产生半透明的效果。即使在片段着色器中计算出来了一个像素输出的颜色,通过混合后,在渲染多个三角形的时候最后的像素颜色也可能完全不同。测试混合阶段虽然不是可编程阶段,但是我们可以通过OpenGL或DirectX提供的接口进行配置,定制混合和测试的方式。
    注:Alpha表示的是物体的不透明度,因此alpha=1表示完全不透明,alpha=0表示完全透明。

补充:

  1. 提前深度测试是将深度测试提前到片元着色器之前,当GPU在经过片元着色器进行大量的计算终于得到片元的颜色了,在进行最终深度测试的时候却发现这些片元根本无效,此时才把他们舍弃掉,那么之前的颜色计算都白费了。这也是Overdraw(同一个像素绘制多次)问题。而其实每个片元的深度信息在光栅化之后就已经知道了,因此使用Early-Z技术,在进入片元着色器之前就可以提前舍弃掉那些被不透明片元遮挡的片元,优化渲染效率。当然除了提前做深度测试外,最后阶段的深度测试仍然要进行,以保证最终的遮挡关系正确。

参考:
https://www.jianshu.com/p/923f061206ad
https://zhuanlan.zhihu.com/p/79183044
《OpenGL编程指南 第8版》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值