其他分享
首页 > 其他分享> > 学习札记 GMAES202 高质量实时渲染 Lecture02: Recap of CG Basics

学习札记 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