计算机图形学高质量实时渲染(一) |
您所在的位置:网站首页 › 现代gpu渲染管线设置 › 计算机图形学高质量实时渲染(一) |
计算机图形学基础
先对渲染管线进行一个复习 我们知道物体在最开始是3D的模型,经过渲染后会最终得到一张图,而这中间经过了一些系列的操作,这个过程我们称其为渲染管线(渲染流水线) 渲染管线的一系列操作是现代GPU上完成的,因为GPU完成或者说是计算的快,因为GPU的并行度比较高。 三角形投影到屏幕上后我们要进行光栅化操作来将三角形离散成一堆像素(或者是fragment) 布林冯是一个经验式模型,因此它并不是完美的,它对全局或者是间接光照是一个近似的做法,它对全局的一些现象处理的不好,比如阴影,光线的多次弹射。 首先什么是OpenGL: OpenGL是一系列在cpu端上负责调动GPU的API,也就是在CPU端写的,我们可以知道OpenGL用什么语言写是没有关系的。 我们更关心的是GPU怎么去执行,而不是CPU如何让GPU去执行。
在OpenGL中我们通过VBO我们可以把需要渲染的图元的顶点信息,直接上传存储在GPU的显存中。 **VBO就是GPU中一块用来存储你的模型的区域,**模型的存储方式与存储三角形的OBJ方式相似,存储一堆vertices,normal,texture coords等以一定的格式组织了一个物体应该放在GPU何处。 b)模型应该如何摆放在101中我们需要自己手写各种矩阵来进行物体的运动,而在OpenGL当中内置了这些函数,我们只需要调动函数写入参数即可,不用再自己去写函数。 2.架好画架
b)create/use a framebuffer(建立画架) 要建立opengl画架,就是framebuffer,为了要使用一个画架,我们一定要在上面贴一块画布的,因此到第三步。 3.在画架上贴上一块画布
也就是你从一个角度看过去渲染一次场景可以输出好几张不同的图,可能有一张是shading的结果,有一张是深度。 例如这几张图就是通过MRT在对场景渲染一次后得到的四张不同性质的图: 在游戏中常有一个叫做垂直同步的设置能解决这个问题,或者先把渲染好的结果存储在一个纹理或者缓冲区内,确定没问题再放在屏幕上,这种方法叫做双缓冲,更复杂的还有三缓冲。 4.在画布上绘画我们要把场景给画在画布上,那么无论如何我们肯定要进行shading,那么: 如何做shading呢?(我们在101中已经讲的很清楚了) 课程中只会用到顶点着色和像素着色。 顶点着色的话,每个顶点的要在顶点着色器操作,首先要进行mvp的投影,之后我们将需要做插值的值进行插值得到结果后,再将结果传递到像素着色器。 那么像素得到的输入就是顶点着色器的输出在上一个顶点的属性,接着就会被插值到任何一个像素的属性上。 OpenGL会将三角形打成一堆像素,然后对每个像素着色。 这门课程最重要的就是我们如何去写顶点着色器和片段着色器。 我们来做一个简单的总结: 5.在画新画时可以采用或者参考旧画上的内容 之前渲染的纹理可以给之后渲染参考(多pass渲染) 那么为什么场景要渲染多次? 我们以shadow map为例,它是一个典型的两趟做法,从light和camera分别去看场景,因此在light得到的深度这个一个纹理,我们可以在camera时候再去用它。 OpenGL Shading Language(GLSL)顾名思义,就是着色器怎么操作的语言就是着色语言,着色语言风格偏C语言。 怎么使用shader 首先要写shader,然后让opengl去编译shader,但是你可能会比编译fragment shader或者是vertex shader,因此可以建立program集合了你写的所有自定义shader,再做一个链接,最后使用链接好的program渲染。 写shader可以近似于在cpu上编程,两者十分相似。 The Rendering Equation 在games101中,我们整个path tracing的体系是建立在rendering equation上的,因为他是一个正确的用来描述光线传播的一个方法。 real time rendering会显式的考虑visibility,他与原先的理解是等价的,之所以这么理解是为了能够更好的理解环境光照,要比不写visibility项更加的直观。 此时只需要考虑说,从任何一个shading point往那个方向看去,看这个visibility是否可见,等于将实际上的光源和能否看到他,把这两项拆开考虑了,就很方便。 间接光照光线会进行弹射,形成间接光照,将间接光照加到直接光照上就是全局光照,实现全局光照就是要解决间接光照。 课堂答疑整理: 1.问:怎么定义哪些点连接成三角形?答:比如obj格式是先给一系列点进行编号,在定义面,每个面都带着三个点的编号的下标。 2.问:有无适合全局光照的管线?答:无,但光线追踪渲染管线很完善。 3.问:纹理坐标怎么进行参数化?答:可以理解为物体外面有个盒子,把盒子挤压到物体上,盒子上的uv是比较好进行确定的。 4.问:几个光源就需要几个shadowmap吗?光源也需要深度测试吗?答:是 5.问:纹理是不是是个buffer?答:opengl里两者的定义不一样,但也可以这样理解,理解为显存里面的一块缓存区域。 6.问:opengl支持optix吗?答:可以,但不要指望shader能调用一个光线一个场景怎么运作。 7.问:一个pass就是一个fragmentbuffer渲染一次吗?答:一个场景渲染一次。 8.问:不同shader里定义里的变量会通用吗?答:不是。 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |