【Unity】Shader编程 基础总结

    xiaoxiao2021-03-25  89

    Shader编程一直是一个比较难入门难上手的主题,本篇对Unity Shader编程的一些基础和要点进行了总结。

    包括Shader编程相关知识图谱、Shader编程相关数据类型、Shader核心结构体等(后续继续补充)。

    每个部分相互独立,可以单独参考,亦可作为一个整体参考。

    一、 Shader编程知识图谱

    (.xmind源文件下载地址:http://www.duzixi.com/doc/ShaderStudy.xmind)

    之所以屏幕上能够看到一个模型物体,一个是要有这样的“形”,这个信息保存在网格(Mesh)里,另一方面就是有颜色,也就是材质(Material)材质。

    当然还有一个前提,就是这个物体在可视范围之内,也就是Camera(摄像机)。

    决定材质如何上色的方式,就是Shader(着色器),Shader编程中涉及到的一些基本概念与这三者紧密相关。

    首先,网格的顶点坐标会直接影响像素着色的位置,法线和切线会影响光照阴影的呈现方式,而uv坐标决定了贴图采样的颜色等。

    其次,Unity引擎中用脚本对Shader复制的方式是通过Material类(材质)的SetXXXX系列方法来实现的,它是脚本与Shader的重要接口之一。

    最后,摄像机的位置决定了视线和世界坐标转视图坐标的矩阵值,而组件属性中渲染路径的选择也会决定Shader渲染所选择的通道。

    即使没有编写过Shader,我们都在有意无意的使用Shader。

    Unity引擎内置的Shader主要依据用途和呈现效果划分,

    普通(Nromal)、透明(Transparent)、自发光(Self Illuminated)、反射(Reflective)这一部分内容官方文档已经解释得很详细了。

    此外,粒子(Particle)这个系列的Shader特别值得一提。

    为什么粒子特效会如此靓丽炫酷,带来视觉效果呢?

    其实粒子材质,即Shader和贴图发挥了很大的作用。

    Shader中的颜色模型是大家熟知的RGBA模型,单一颜色光的取值范围在0~1之间。

    值越大,说明光越强,也就越亮;反之越暗。(0,0,0,1)为黑色,(1,1,1,1)为白色。

    这决定了两种基本的颜色叠加模式:加法(Additive)和乘法(Multiply)。

    前者越叠加越亮,后者越叠加越暗(可在Particle的内置Shader中找到)。

    一个立体的3D模型,在一定的光照情况下,会是什么样子?

    画面对“光”的呈现,是靠“影”来完成的。而英文中的“影”就是shade,是指有影的东西,按照英文语法习惯就是shader了。

    所以着色器(Shader)的出发点和本元,应该是如何更好的产生阴影。

    在计算机中,阴影的计算是靠光照模型完成的。

    光照模型有很多,最基本的是以下两种:

    LambertBlinn-Phong 

    二、 Shader编程数据类型

    有了基本的Shader编程知识之后,就可以尝试自己动手写Shader了。

    Shader编程中比较麻烦的一点是,同一个变量在不同的语法阶段表示的方式不同,常用变量类型对照如下:

    硬件平台

    CPU

    (Inspector面板设置)

    GPU

    变量类型

    C#脚本语言

    ShaderLab 属性

    Cg语言

    纹理贴图

    Texture

    2D

    sampler2D

    颜色

    Color

    Color

    fixed4 / half4

    3D贴图

    Cubemap

    Cube

    sampleCUBE

    4元素向量

    Vector4

    Vector

    float4

    浮点数

    float

    Float

    float

    浮点范围

    float 

    Range

    float

    矩形纹理

    Texture

    Rect

    sampleRect

    Cg语言中颜色类型使用4维向量表示的,根据精度选择,可选用fixed4或者half4等。

    三、 Shader核心结构体

    (1)顶点着色器输入结构体

    结构体也可以自定义,但是必须有位置信息

    成员类型

    成员名

    结构体名:

    appdata_base

    appdata_tan

    appdata_full

    appdata_img

    float4

    vertex

    位置

    1

    1

    1

    1

    float3

    normal

    法线

    1

    1

    1

    float4

    tangent

    切线

    1

    1

    fixed4

    color

    顶点颜色

    1

    float4

    texcoord

    纹理坐标0

    1

    1

    1

    1

    fixed4

    texcoord1

    纹理坐标1

    1

    (2)表面着色器输出结构体

    SurfaceOutput

    half3

    Abedo

    反射光

    half3

    Normal

    法线

    half3

    Emission

    自发光

    half

    Specular

    高光

    half

    Alpha

    透明度

    参考资料:

    Shader编程参考资料整理如下:

    【1】Unity 官方文档: Manual -> Graphics -> Graphics Reference -> Shader Reference 

    【2】Unity内建Shader下载地址:http://unity3d.com/unity/download/archive

    【3】Nvidia开发者入口:https://developer.nvidia.com

    【4】AMD开发者入口:http://developer.amd.com/tools-and-sdks/

    转载至:http://blog.csdn.net/duzixi/article/details/46559153

    转载请注明原文地址: https://ju.6miu.com/read-33138.html

    最新回复(0)