Shader基础(一)

 

渲染流水线

概念流水线的三个阶段

应用阶段、几何阶段、光栅化阶段

应用阶段

输出渲染图元(点、线、三角面等)
此阶段对于开发者来说的任务有:

  • 要准备好场景数据(包括设计相机的位置、视锥体、模型、光源)
  • 做一个粗粒度的剔除工作,把不可见的物体剔除
  • 设置好每个模型的渲染状态(材质、纹理、Shader)

几何阶段

输出屏幕的顶点信息

光栅化阶段

使用上一阶段的数据来阐述屏幕上的像素,并渲染出最终的图像

CPU与GPU的通信

把数据加载到显存中

数据从硬盘加载到内存,然后网格和纹理等数据又被加载到显卡的存储空间,即显存里

设置渲染状态

定义场景中的网格是怎样被渲染的

调用Draw Call

Draw Call:每次CPU准备数据并调用图形绘制API通知GPU的过程就称之为一个DrawCall

所谓Draw Call,就是一个命令,发起方是CPU,接收方是GPU,仅仅指向一个需要被渲染的图元(点线面)列表,不包含任何材质信息(材质信息已经加载到了显存中)

GPU流水线

几何阶段和光栅化阶段可以分成若干个更小的流水线阶段。这些流水线阶段由GPU来实现,每个姐u但GPU提供不同的可配置性和可编程性
顶点着色器:实现顶点空间变换、顶点着色功能。把顶点坐标从模型空间转换到齐次裁剪空间(类似于归一化)
曲面细分着色器:用于细分图元
几何着色器:用于执行逐图元的着色操作,或者用于产生更多图元
裁剪:将不在摄像机视野内的顶点裁剪掉,剔除某些三角图元的面片
屏幕映射:负责把每个图元的坐标转换到屏幕坐标系中
// 在Unity中,屏幕坐标系是以屏幕左下角为原点,向右为 x 正方向,向上为 y 的正方向,相机世界坐标中 z 坐标的负方向为正方向的坐标系
三角形设置:固定函数阶段,计算光栅化一个三角形网格所需的信息
三角形遍历:固定函数阶段,检查每个像素是否被一个三角网格所覆盖,是的话就生成一个片元
// 一个片元并不是真正意义上的像素,只是包含要渲染的像素所需要的信息的集合,用于计算每个像素的最终颜色
片元着色器(像素着色器):实现逐片元的着色操作
逐片元操作(合并阶段):修改颜色、深度缓冲、进行混合等
输出:屏幕图像

着色器语言

HLSL

DX的着色器语言

GLSL

OpenGL的着色语言

CG

英伟达C for Graphic

小总结

Shader 所在的阶段就是渲染流水线的一部分,更具体来说 Shader 就是GPU流水线上一些可编程的部分。而着色器编译出来的代码最终是在GPU上运行的


Unity Shader基础

Unity 中提供了方便管理着色器、代码以及渲染设置的 Unity Shader

  • 标准表面着色器(Standdard Surface Shader):包含标准光照的表面着色器模板
  • 无光照着色器(Unlit Shader):不包含光照的基本顶点/片元着色器
  • 图像效果着色器(Image Effect Shader):实现各种屏幕后处理效果
  • 计算着色器(Compute Shader):产生一个特殊的Shader文件,旨在利用GPU并行性进行一些与常规渲染流水线无关的计算
  • 光线追踪着色器(Ray Tracing Shader): 执行与光线追踪相关的计算

流程

创建一个材质(Material),创建一个着色器(Shader),将Shader赋予到材质上,再把材质赋予给游戏对象,在材质面板中调整属于以达到满意的效果。

ShaderLab

ShaderLab 是 Unity 中用于编写着色器的特定语言csharp Shader"_ShaderName" { Properties{ //属性} SubShader{ //子着色器} SubShader{ //子着色器} Fallback "VertexLit" //SubShader都无法使用时调用Fallback }

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
CCCCCO2的头像-白漂资源网
评论 抢沙发

请登录后发表评论

    暂无评论内容