图形渲染流水线

本文记录《实时渲染》的读书笔记。

图形渲染的流水线包括三个阶段:应用阶段、几何阶段、光栅化阶段。

1. 应用阶段

应用阶段是应用所驱动的,因此是被软件所执行,并且运行在CPU上。根据不同的应用这个阶段包括碰撞检测、全局加速算法、动画、物理模拟等。

2. 几何阶段

几何阶段负责每个多边形和每个顶点的操作,通常这个阶段可以分成以下几个功能阶段:模型和视觉变换——顶点shading——投影——裁剪——屏幕映射。

模型变化:每个模型都有它自己的坐标系,我们要把模型放到时间坐标系去中,就需要通过模型变换。每个模型都有一个与之相关的模型变换,通过这个模型变换可以把这个模型放在世界坐标系中合适的位置。

视觉变换:在场景中的所有模型,都必须在相机的可视范围内才会变渲染出来,而这个相机也是放置在世界坐标系中的某个方位。为了方便后面裁剪和投影的计算,我们需要把世界坐标系变换成相机坐标系,也就是变换世界坐标系使相机处在坐标系的原点,X轴指向右边,Y轴指向上方,朝向-Z轴(有些可能使用+Z轴)。而这个过程是通过视觉变换来完成的。

顶点shading:决定光线在某个材质上产生的效果的这个操作叫做shading。它涉及在不同的顶点上计算shading方程,产生的结果将用于光栅化。

投影:把可视空间(view volume)变换到单位立方体中,这个立方体的坐标范围在(-1,-1,-1)到(1,1,1)之间,这个立方体叫做正规可视化空间(canonical view volume)。包括两种投影,正交投影和透视投影。投影后的坐标系称作标准设备坐标系(normalized device coordinates)。尽管这个过程是从一个空间变换到另一个空间,但这里仍用投影这个术语是因为经过显示后z坐标不在存储在图像中(而是保存在Z-buffer中)。从这个角度上看,这是一个从三维到二维的变换。这里指的是经过显示后的坐标,事实上,投影后坐标还是三维的。

裁剪:只有全部或者部分基本图元的顶点出现在可视空间内才会被传到光栅化阶段,然后显示在屏幕上。一个图元的全部顶点都在可视空间内时,这个图元会直接被传到光栅化阶段,如果全部顶点都不在可视空间内时,这个图元就会直接被丢弃,因此只有那些部分顶点在可视空间的图元才需要进行裁剪。不像其他可编程的阶段,这个阶段通常是被固定的硬件所操作。

屏幕映射:经过这个阶段后坐标将从三维变成二维,这里的二维坐标将变成屏幕上的坐标。在DX10 之前每个像素的中心坐标为“0.0”形式,DX10以后以及OpenGL每个像素的中心坐标为“0.5”形式。另外,OpenGL以左下角为原点,DX以右上角为原点。

3. 光栅化阶段

给定变换和投影后的顶点以及它们相应的shading数据,光栅化的目标是计算覆盖在每个物体上的像素颜色。这个阶段也可以分为几个功能阶段:三角形设置——三角形遍历——像素shading——合并。

三角形设置:三角形表面的差异和其他的相关数据被计算出来。固定的硬件操作来完成。

三角形遍历:这个阶段检查每个像素是否在三角形内部,fragment在这个阶段产生。通常采用插值方法。

像素shading:使用插值shading数据作为输入,输出一个或者多个颜色值用于下一阶段使用。这个阶段是可以通过编程来控制GPU执行,在这个阶段最常用的技术是纹理技术。

合并: 每个像素的颜色值存储在颜色缓存(color buffer)中,并在这个阶段进行颜色合并。这个阶段不是完全可编程的,它可以被配置以产生不同的效果。这个阶段会通过Z-buffer负责解决能见度(visibility)问题。除了color buffer和Z-buffer外,还有其他的一些buffer也在这个阶段产生作用,比如alpha通道,用于执行alpha test,stencil buffer,用于记录已渲染图元的位置。

时间: 2024-11-10 20:41:07

图形渲染流水线的相关文章

【原创】Linux环境下的图形系统和AMD R600显卡编程(10)——R600显卡的3D引擎编程

3D图形处理流水线需要流经多个硬件单元才能得到最后的渲染结果,流水线上的所有的硬件单元必须被正确编程,才能得到正确的结果. 总体上看,从图形处理流水线的源头开始,需要准备好vertex和index,在立即模式下,index可以直接编程在命令中,通过配置寄存器告诉GPU vertex buffer的位置,在启动GPU流水线之前,还需要将vertex shader程序和pixel shader程序加载到vram 中,并通过配置寄存器告示GPU shader程序的位置,在vertex shader和p

Anti-alias的前世今生

原文: http://www.cnblogs.com/gongminmin/archive/2011/05/16/2047506.html Anti-alias,简称AA,在图形学中广泛地用于提升渲染质量.经过几十年的发展,AA也从离线渲染逐步普及到了实时渲染的领域.本系列文章将总结一下在实时渲染中使用的AA方法的前世和今生.本片集中讨论硬件提供的AA方法. 图1. 一个像素内部的采样点.16个红圈表示16个采样点,蓝色和黄色是覆盖了这个像素的两个三角形. SSAA Super Sampling

【《Real-Time Rendering 3rd》 提炼总结】(一) 全书知识点总览

本文由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/69849858 一.<Real-Time Rendering 3rd>其书 在实时渲染和计算机图形学领域,<Real-Time Rendering 3rd>这本书一直备受推崇.有人说,它实时渲染的圣经.也有人说,它是绝世武功的目录. 诚然,<Real-Time Rendering 3rd>这本书的世界观架构宏大,

高咯德着色

引言 在前面,我们已经讲解了多个光照模型的方程,有了那些模型,读者就能够自己做出比较好看的Demo了,如果想要更加精确,高级,好看的效果,读者就需要自己去学习有关全局光照系统的方法.使用全局光照系统,需要掌握有关辐射着色的理论,这种理论难度很高,需要读者有足够的数学和物理理论知识,由于我自己在这方面也不是很了解,所以就不再讲述这种更加精确的光照模型了.如果将来,我学会了这样的知识,会在博客中与大家一起分享的.期待吧!!! 在前面,我们都是在顶点着色器中进行光照计算的,读者可能想知道,为什么我们只

Stencil buffer

Stencil buffer 模版缓冲(stencil buffer)或印模缓冲,是在OpenGL三维绘图等计算机图像硬件中常见的除颜色缓冲.像素缓冲.深度缓冲之外另一种数据缓冲.词源模版(stencil)是指一种印刷技术,通常以蜡纸或者钢板印刷文字或图形:区别于模板(template),用木板为外形修剪的依据来复制形状:模版(stencil)是指印模,而模板(template)主要是指形模.模版缓冲是以像素为单位的,整数数值的缓冲,通常给每个像素分配一个字节长度的数值.深度缓冲与模版缓冲经常在

了解各种AA特性

AA(Anti-Aliasing)抗锯齿想必不少玩家在游戏画质设定中经常会遇到,说通俗一点AA抗锯齿的作用:将图像边缘及其两侧的像素颜色进行混 合,然后用新生成的具有混合特性的点来替换原来位置上...    AA(Anti-Aliasing)抗锯齿想必不少玩家在游戏画质设定中经常会遇到,说通俗一点AA抗锯齿的作用:将图像边缘及其两侧的像素颜色进行混 合,然后用新生成的具有混合特性的点来替换原来位置上的点以达到柔化物体外形.消除锯齿的效果.随着图形技术的不断革新,AA抗锯齿的技术也随之在不断的 发

【Modern OpenGL】Shader【转】

转自:https://blog.csdn.net/SUKHOI27SMK/article/details/81040161 Shaders 正如在上一篇教程中提到的,shader是在GPU中运行的小程序.如上一个教程中实现的最简单的vertex shader和fragment shader,一个shader基本上负责图形渲染流水线中的一个阶段的功能.从根本上来说,shader就是将输入转化成输出的操作.而且,它们之间是独立的,除了以输入和输出方式外,他们之间不允许进行通信. 上一篇教程中我们仅仅

舌尖上的硬件: 厨房中探秘图形渲染

1食物?画卷?食物的画卷 在今后的<舌尖上的硬件>系列当中,我们将会继续保持这样的视角,以各种美味的组合和制作过程来为您展现不同的显卡/半导体芯片技术细节,五味的搭配因何而鲜美诱人.图形处理过程是怎样的精妙.食物为何会让我们大快朵颐.芯片的性能究竟由哪些要素决定.这个世界到底蕴藏了多少和谐与调和的艺术,小小厨房中所发生的一切将会成为我们带您认识电脑世界的载体.最终,我们将会一起探寻.发现并赞美这个世界的本质.如果一路上能够有您相伴,我们感激不尽. 信守承诺,带着一颗探索并感悟世界的心,我们和新

持续集成+自动化部署[代码流水线管理及Jenkins和gitlab集成]

持续集成+自动化部署[代码流水线管理及Jenkins和gitlab集成] 标签(空格分隔): Jenkins 一.代码流水线管理 Pipeline名词顾名思义就是流水线的意思,因为公司可能会有很多项目.如果使用jenkins构建完成后,开发构建项目需要一项一项点击,比较麻烦.所以出现pipeline名词. 代码质量检查完毕之后,我们需要将代码部署到测试环境上去,进行自动化测试 新建部署代码项目 点击新建 这里只需要写一下描述 执行Shell脚本 温馨提示:执行命令主要涉及的是权限问题,我们要搞明