学习札记 GMAES202 高质量实时渲染 Lecture02: Recap of CG Basics
作者:互联网
一、Basic GPU hardware pipeline 基础硬件渲染管线知识
二、OpenGL
三、OpenGL Shading Language (GLSL)高阶着色语言
四、The Rendering Equation 渲染方程
五、Caluculus 基本微积分知识 (课上没讲)
一、Basic GPU hardware pipeline基础GPU渲染管线知识
从一开始从3D模型到最后的一张图,中间的过程就是渲染管线/渲染流水线,管线是GPU完成的工作。
输入:空间中的点和连接关系(空间中物体的表示);
Vertex processing: MVP变换将模型中的点变换为屏幕上的点;
Triangle processing:变换过后,顶点的连接关系并未发生改变,只是被投影到屏幕上了;
Rasterization光栅化:将三角形打散,离散化为屏幕上的一堆像素;
Fragment processing:计算像素/片段的颜色;
二、OpenGL
OpenGL是一系列API,通过在CPU端执行,来调度GPU负责干什么。由于OpenGL是在CPU端执行,因此OpenGL用任何语言写是完全没有关系的。
l OpenGL优点:
-跨平台。
l OpenGL缺点:
-版本是非常碎片化的,相比于DirectX(不同的版本各自有不同的特性)。
-面向CPU端,代码风格是C风格,难以面向对象。
-不好debug。
l 对OpenGL的理解:
-渲染管线每一步在OpenGL中都是有对应的
三、OpenGL Shading Language (GLSL)高阶着色语言
到目前为止,这里是本节最重要的内容。GLSL是一种语言,来描述着色器是如何运作、各种不同操作,着色器的运作是来描述顶点和片段如何运算、输出什么。
l 定义了顶点和片段的着色怎样去做
l 这些着色语言非常像C语言,并不面向对象
l 有着非常丰富的历史
-最早没有着色语言:需要在GPU上写汇编语言
-目前最主流的着色器语言:HLSL in Directx(Vertex+Pixel)
-GLSL in OpenGL(vertex+Fragment)
着色语言最终还是要编译成汇编语言来执行指令,因此都需要编译的步骤。
正常情况下shader如何使用:
-Create shader(vertex and Fragment) 写shader
-Compile shader 编译
-Attach Shader to program 建立program
-Link program
-Use program
Program集合了所有自定义的shader
shader的源文件是一系列字符串
与在CPU上的执行非常相似
Shader Initialization Code
以上OpenGL的流程不同程序中是可以复用的。这些操作是可以通过函数封装的。
作业0中的Phong shaders示例如下
l 顶点着色器
①顶点着色器工作1:顶点的变换
-顶点的位置由aVertexposition 一个vec3 3维向量 定义的。
-attribute是一个顶点属性,只在顶点着色器中有。定义的内容包括顶点位置、 顶点法线、顶点纹理。
-每一个shader是针对的每一个vertex 因此这里不包括for循环,只是循环内的事情。
②顶点着色器工作2:告诉片段着色中要用到的一些信息
-告诉片段着色器中用到的一些要被插值的量,是通过varying关键字来指定的,因此在片段着色器中一定还有一个相同的定义。其中highp是指的计算精度。
-uniform:全局变量。直接从CPU扔到 GUP的全局变量,顶点和片段着色器都可以访问。
l 片段着色器
-在片段着色器中varying定义一模一样,只不过在这里varying中的变量已经经过插值了。
-Sampler2D定义的是二维的一个纹理,可以通过某一个位置的查询这个位置上的值。
-gl_FragColor是OpenGL给的变量,告诉OpenGL片段的颜色 也就是要向这个里面写值。顶点着色器中的gl_position同理。
-vec3(2.2)是对颜色进行的一个Gama矫正。
很多年前,shader是无法debug的,可以用NVIDIA的NSIGHT和visual studio 来调试 但是需要多个GPU来调试,同时必须在软件模拟的情况下跑 来调试HLSL。
Shader不好调试的原因:
因为Shader是在GPU上运行,所以很难加上一个断点,来打印出来中间的结果。
目前新的办法:
Nsight Graphics(跨平台 只有N卡支持)
Render.doc (跨平台 对GPU没有限制)
其他方法:RGB调试法
-来打印出,也就是显示颜色。
-如果得出了某一个值,将这个值作为一个颜色
四、The Rendering Equation 渲染方程
渲染方程是非常重要的一个概念,整个Path Tracing的体系是建立在此基础上的,是一个正确的用来描述光线传播的一个方法/等式。
看到的任何一个点P,以wo方向打到眼睛上的Radiance,是这个点本身发出来的Radiance(自发光)+ 所有其他打到这个点的Radiance×BRDF ×cosθ。就是其他所有打到这个点的光在观察方向上的反射的能量。
在实时渲染中说BRDF的时候有的时候就是BRDF, 有的时候说的是BRDF和cosθ 项在一起。
当考虑一个Shading Point会不会接受四面八方的光照时,我们会引入Visibility 的概念(下图红色方框),这里会考虑某个方向上光源能不能照到这个点,是对Rendering Equation 的一个解释。这么理解的好处,就会引入环境光,因此对于环境光照的解释比不写Visibility项就会更为直观。
环境光:不同方向上来的光强度分布。
环境光的强度可以定义在一个Cube MAP上,也可以定义在一个球(sphere map)上。
环境光的难度:复杂在对于任何一个点(像素),都要去解这个积分,需要将每一个方向的都积分起来,这个运算量是非常恐怖的。
Rendering Equation是一个递归的定义,,一个点接收的光照可能是另外一个点反射的光照,也就是间接光照的存在。
直接光照:光只弹射一次。
全局光照:包含两个部分,包含直接光照和间接光照。
另外一个概念,如果让光再多弹射一次,就是图三的效果,但是实际上两次和三次差别并不明显。
在实时渲染中解决全局光照,通常说的就是解决多“一次”弹射的间接光照,在实时渲染中只要能搞出多一次的见见光照,更多的bounce可以暂时先不考虑。
五、Caluculus 基本微积分知识
闫玲琪大神课上没讲。。。。。。
标签:Basics,Lecture02,OpenGL,渲染,CG,GPU,顶点,着色器,光照 来源: https://blog.csdn.net/jiuzhouhi/article/details/123209254