图形学学习笔记 - OpenGL渲染流程

我们知道通过GPU【显卡】来渲染3D场景,其实是有严格的过程的,每个阶段都有自己的工作要做,然后给下一阶段提供所需的数据

早起的GPU是固定渲染管线,也就是说,把模型加载,它就显示出来了。

但是后来发展为可编程渲染管线,什么意思?

就是说,GPU把某几个阶段开放,用户可以自己控制这个阶段的渲染工作,比方我想模型自发光,那么我就在光柵阶段,做滤镜处理!


OpenGL渲染流程:

  1. CPU:将Fbx、Obj等模型格式 加载至 MeshRenderer。

  2. Fbx、Obj等:模型文件  包含了UV、Vertex位置、法线、切线等渲染所需要的信息

  3. MeshRenderer:将这些信息传递到GPU。

  • skin mesh renderer:带蒙皮的骨骼

  • mesh renderer:将UV、顶点等信息传递给GPU

  • mesh filter:表示将哪个模型信息传递给GPU

GPU:

    渲染管线PipeLine:(有下划线的就是在Shader中的可编程部分)

 

  1. 顶点着色器 Vertex Shader

    ·计算顶点的颜色

                Shader调节顶点的颜色:

                    _TestColor ( "TestColor", Color) = (1, 0, 0, 1)

                    Color (0,1,0,1)

                    Color[_TestColor ]

                Shader 1.0 灯光计算公式:

                    Ambient * Lighting Window's Ambient Intensity setting + (Light Color * Diffuse + Light Color * Specular) + Emission

                    Ambient:环境光

                    Diffuse:漫反射光

                    Specular:镜面反射

                    Emission:自发光

                        Lighting On:灯光的总开关

                        SeparateSpecular On:高光开关                    

    ·将物体坐标系转换到相机坐标系 - 顶点变换

    ·灯光的作用 (shader 1.0)

  2. 光柵化 Rasterization

    ·将 顶点 转换成 像素

    ·将 各个像素之间插值运算成片段  四个点变成一个面

  3. 片段着色器 Fragment Shader

    ·已经是像素点 处理像素点

            像素:RGBA 4通道组成,还可以携带 模板 信息(模版值)

            屏幕:720*1280  横720个像素 竖1280个像素

    ·纹理采样 从 纹理 像素 赋值给 像素 (图案)

    ·计算 像素跟灯光

    (以下三个测试都通过才能决定像素点的显示)

    总结:片段着色器会利用贴图、灯光等信息,为在屏幕上的面片进行着色处理。

  4. Alpha通道测试 Alpha Test

    ·挑选合格(alpha)的像素显示

  5. 模板测试 Stencil Test

    ·达到条件的模板值

  6. 深度测试 Depth Test

    ·符合条件的像素就通过,不然就丢弃

  7. 混合 Blending

    将当前要渲染的像素和已经渲染出来的像素混合运算

    (Buffer相当于缓冲区的意思)

  8. GBuffer

    Float[ 720 * 1280 * 4]

    中转区:合格通过测试的点 会把 RGBA值 模板值 深度值 等存入GBuffer。

  9. FrontBuffer

    Float[ 720 * 1280]

    从GBuffer传入像素点信息,存入FrontBuffer,然后传入FrameBuffer。

  10. FrameBuffer

    Float[ 720 * 1280]

  11. 显示器


【关于顶点着色器 Vertex Shader 和片段着色器 Fragment Shader】

Vertex Shader:位置、法线、UV

Fragment Shader:贴图、光照、阴影

比如4个顶点的正方形,同时片段着色器为100*100

顶点着色器会运行4次  片段着色器会运行10000次

所以,顶点着色器 和 片段着色器  运算次数 不是一个量级。。。

所以,运算部分 优先放在顶点着色器,其次放在片段着色器


【关于GBuffer、FrontBuffer、FrameBuffer】

GBuffer选出来的像素,FrontBuffer只写入GBuffer的RGBA,推到显示器显示,之后退到后台变为FrameBuffer;

FrameBuffer同样也会只写入GBuffer的RGBA,推到显示器显示,之后退到后台变为FrontBuffer。如此交替显示,一帧一帧渲染显示,有了动画。


整个过程大致分为三个阶段:

应用程序阶段:和CPU、内存打交道,把场景中的对象的几何体数据(顶点坐标、法向量、纹理坐标、纹理)传给下一阶段。

            1.碰撞检测;

            2.场景图简历;

            3.空间八叉树更新;

            4.视锥裁剪等算法;

几何阶段 Vertex:变换和投影之后的(三角面)传给下一阶段。

            1.顶点坐标变换;

            2.关照;

            3.投影(Perspective,Orth);

            4.CVV裁剪

            5.屏幕映射

            6.图元装配(背面剔除、遮挡剔除、右手法则等)

光柵阶段 Pixel:像素所有权测试 Pixel Ownership Test -> 裁剪测试 Scissor Test -> Alpha通道测试 Alpha Test -> 模板测试 Stencil Test -> 深度测试 Depth Test -> 混合 Blending -> 抖动 Dithering -> 逻辑操作 Logic Op

2019-02-24

评论

©大米の食堂 / Powered by LOFTER