【图形学】10 UnityShader入门(二)

来源:《UNITY SHADER入门精要》

1、DirectX/OpenGL和显卡、GPU的关系

  在应用阶段,CPU在主存中处理数据之后,就会传递给显存,CPU通过应用程序,调用底层的图形API,给显卡Draw Call命令,从而让GPU进行绘制。

2、着色器语言

  1. 基于 OpenGL 的 OpenGL Shading Language,简称 GLSL;

  2. 基于 DirectX 的 High Level Shading Language,简称 HLSL;

  3. 还有 NVIDIA 公司的 C for Graphic,简称 CG 语言。
    (由于CG和DX9风格的HLSL从写法上来说几乎是同一种语言,所以在Unity中CG和HLSL是等价的。)

  4. Unity自己的语言Unity Shader:它不等同于流水管线中所讲的 Shader。因为在它的文件中,可以做更多的事情:

a. 在传统的Shader中,我们仅可以编写特定类型的Shader,例如顶点着色器、片元着色器等。而在Unity Shader中,我们可以在同一个文件里同时包含需要的顶点着色器和片元着色器代码。

b. 在传统的Shader中,我们无法设置一些渲染设置,例如是否开启混合、深度测试等,这些是开发者在另外的代码中自行设置的。而在Unity Shader中,我们通过一行特定的指令就可以完成这些设置。

c. 在传统的Shader中,我们需要编写冗长的代码来设置着色器的输入和输出,要小心地处理这些输入输出的位置对应关系等。而在Unity Shader中,我们只需要在特定语句块中声明一些属性,就可以依靠材质来方便地改变这些属性。而且对于模型自带的数据(如顶点位置、纹理坐标、法线等),Unity Shader也提供了直接访问的方法,不需要开发者自行编码来传给着色器。

  所以,UnityShader编写的语法和类型都已经是高度封装过了。这是优点,也是缺点,对于一些类型的 Shader,比如:曲面细分着色器(Tessellaton Shader)、几何着色器(Geometry Shader)等,Unity的支持就会差一些 。

3、有关Draw Call的处理

①Draw Call队列

  在一个流程中,先是CPU处理和加载数据给GPU之后,再由GPU处理出画面。为了节省效率,让CPU和GPU并行工作。所以,建立了一个缓冲队列(Command Buffer),使得CPU和GPU尅相互独立工作,当CPU需要渲染一些对象的时候,就会向命令缓冲区添加命令,而当GPU完成了上一次渲染任务后,就可以从命令队列中抽取并执行新的命令。

在这里插入图片描述

②批处理(Batching)

  每次调用Draw Call的时候,CPU会做许多发送数据、状态、命令、检查渲染状态等工作,而对于GPU,渲染200个或者2000个三角形网络通常没什么区别,因此,频繁的调用Draw Call 就会造成CPU过载,GPU闲置的情况,
  **批处理(Batching)**的想法就是尽量把很多小的Draw Call合并成大的Draw Call。所以,我们需要在CPU的内存中合并网格,由于合并网格是需要消耗时间的,所以,为了不本末倒置,批处理更加适合那些静态的物体,例如不会移动的大地和石头等。只要他们的渲染状态想通,这些网格只需要合并一次就好了。这样只用调用一次Draw Call就能渲染它们了。

4、Unity中的Shader

  目前的Unity Shader有五种表面着色器模板:Standard Surface Shader、Unlit Shader、Image Effect Shader、Compute Shader、Ray Tracing Shader。

①Standard Surface Shader

  Standard Surface Shader会产生一个包含标准光照模型的表面着色器模板。

②Unlit Shader

  产生一个不包含光照(但包含雾效)的基本的顶点/片元着色器。

③Image Effect Shader

  为我们实现各种屏幕后处理效果提供了基本模板

④Compute Shader

  书也不知道

⑤Ray Tracing Shader

  暂时也不知道

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值