Games202高质量实时渲染_lecture2_Recap of CG Basics
1 渲染管线
总结一下渲染管线:
虽然光栅化这套体系对直接光照可以处理的很好,但是任何一点全局的情况都处理不好,比如阴影,光线的多次弹射。
参数化问题是非常难的问题,也是学术界一直在做到。
2 OpenGL
OpenGL就是API;
以下为画油画的过程,用来类比OpenGL的过程。
1.放置物体
2.画架放好
3.画架放一个画布
4.在画布上画东西
5.换一张画布继续画
6.之前画过的画,可以继续用。
OpenGL就是做了这么一个步骤:
VBO-GPU中一块区域,用来存放物体的顶点,发现和纹理坐标,存一堆顶点的位置,有顺序和编号,对应的normal,存一些连接方式。
1第一步:放置物体:
2 第二步:设置一个画架
framebuffer就是OpenGL 中的画架。
3 第三步:使用画架,将画布搞到画架上
指定一个framebuffer可以一下子渲染多张图,坑可能是一张深度,一张是normal,等。
一个framebuffer可以画多张纹理。
一个特殊的目标是将一个frambufer直接渲染到屏幕,但是不推荐,这样话这一帧没有渲染完,下一帧就会开始渲染,导致画面撕裂,先把渲染的结果存储到纹理,或者缓冲区里,没有问题了然后再渲染到屏幕,这个就是双重缓冲,更复杂的是三重缓冲。
frambuffer就是画架,画布可以有很多张。
渲染一次,会得到很多东西,由fragment shder告诉你渲染到拿一张纹理上去。
纹理就是画布吗?
4 第四步:在画布上画画
要用shading。
顶点先做mvp,然后
集中精力在着色语言上。
5 总结
所有信息告诉GPU,
定义我要渲染什么物体/场景、然后定义这些物体/场景的MVP矩阵,相机在哪里,mvp是什么,
还要告诉gpu选什么画架frambuffer,frambuffer输出是几个纹理,是一个还是多个呢,都是谁呢?纹理告诉frambuffer。
告诉gpu怎么渲染,把我的vertex 和 fragment shader都告诉gpu,当所有的东西都在gpu中,才可以。
OpenGL是状态机模型,不同意,应该告诉他上面的这样。
还可以多次渲染,把以前的纹理当作这次的参考,一个场景为啥要渲染很多次呢?shadermap就是非常经典的多次渲染,用了两次,一次是看light能看到谁,第二次在camera看到的物体能不能被light看到。
第一次是得到的是light看到的最小深度纹理,在第二次中用它。
OpenGL支持optics,可以的,不能再shader中做。
纹理就是一张图,
3 GLSL
类c
主要是是为了gpu上编程,
1 shader 如何启动
program集合了你的所有的自定义shader,然后再做个连接,就是查一下顶点着色器和片段着色器对上对不上啊,各自都是对的在,中间能不能连上。很自然的步骤。
完全可以封装成一个很好用的函数,openGL本身的东西没有必要学习。
2 vertex shader
顶点的变换,顶点的位置,顶点的发现,建立vbo的时候已经告诉gpu了。
顶点着色器要定义片段着色器中要插值用的量,用varying指定的在在fragment中肯定还有相对应的。
uniform就是全局变量,是从cpu直接扔到gpu中,顶点着色器可以访问,片段着色器中也可以访问。
3 片元着色器
用到了更多的全局变量,
sample2D就是二维的纹理,可以查某个位置的值,四通道RGBA,
对颜色进行2.2是进行γ矫正,
4 debug shader
gpu中无法在屏幕上显示
Nsight Graphics
RenderDoc
不知道是否可以调试web GL,
个人建议:
print it out!
shaw values as colors!
得到某种深度,在0-200,除以200.0,这样就变成了0-1.
然后传给GLgramcolor,把他当成颜色显示出来, 观察像素点的颜色值来显示,
gpu中只能复杂那一个像素对应的颜色。
openGL写错了shder基本是全黑,可以用上面的方法,看对应的数值是多少。
负数的话先加上某个偏移,然后再看…
4 渲染方程
用来描写光线传播的方式,
实时渲染都是以他为基础。
忘掉了很多概念,需要复习一下。
环境光照:
cubemap,球体map,
八面体的表示--新的环境光的表示
环境光的难度:直接光照,每个点都要往四面八方去看,每个方向的贡献都要积分起来,一个像素,一个fragment都要这么做,就很复杂了。
这个是直接光照;
这个是间接光照,
全局光照=直接光照+间接光照。
实时光照,多一次间接光照就可以。