Unity(2022.3.41LTS) - 着色器
目录
一、着色器的基本概念
二、表面着色器
一、着色器的基本概念
-
定义与作用:
- 着色器是一种在图形硬件上运行的程序,用于控制物体的颜色、纹理、光照、透明度等视觉属性。它通过对输入的几何数据(如顶点位置、法线、纹理坐标等)进行计算和处理,输出最终的像素颜色值。
- 着色器的主要作用是实现各种逼真的材质效果,如金属、玻璃、木材等,以及特效,如光影、粒子效果、后处理等。它可以让游戏场景更加生动、真实,提升玩家的沉浸感。
-
着色器的类型:
- 表面着色器(Surface Shader):这是一种高级的着色器类型,它提供了一种简洁的方式来实现复杂的材质效果。表面着色器自动处理了光照、阴影、反射等复杂的渲染过程,开发者只需关注材质的表面属性和光照模型的定义。表面着色器适用于大多数材质效果的实现,尤其对于初学者来说,更容易上手。
- 顶点片段着色器(Vertex Fragment Shader):也称为可编程着色器,它提供了对渲染过程的更多控制。顶点着色器负责处理物体的顶点数据,如位置、法线、纹理坐标等的变换;片段着色器负责处理每个像素的颜色计算。开发者需要手动编写顶点着色器和片段着色器的代码,以实现特定的渲染效果。顶点片段着色器适用于需要高度定制化的材质效果和特效的实现。
- 固定功能着色器(Fixed Function Shader):这是一种传统的着色器类型,它使用固定的渲染流程和参数来实现材质效果。在现代游戏开发中,固定功能着色器已经逐渐被表面着色器和顶点片段着色器所取代,但在一些旧项目中仍然可能会使用到。
二、表面着色器
-
特点与优势:
- 简洁高效:表面着色器使用 Cg/HLSL 语言编写,它提供了一种简洁的语法和结构,使开发者可以快速实现复杂的材质效果。表面着色器自动处理了许多底层的渲染细节,如光照计算、阴影处理等,大大提高了开发效率。
- 易于理解:对于不熟悉图形编程的开发者来说,表面着色器的语法和结构更容易理解和掌握。它提供了一种高级的抽象,使开发者可以专注于材质的表面属性和光照模型的定义,而不必关心底层的渲染过程。
- 兼容性好:表面着色器在不同的图形硬件上具有较好的兼容性,因为它自动适应不同的硬件特性和性能。这使得开发者可以在不同的平台上实现一致的材质效果,减少了跨平台开发的难度。
-
结构与组成:
- 属性定义:表面着色器的开头部分是属性定义,用于指定材质的参数,如颜色、纹理、透明度等。这些参数可以在 Unity 的材质编辑器中进行调整,以实现不同的材质效果。
- 表面函数:表面函数是表面着色器的核心部分,它用于计算物体表面的颜色和属性。表面函数接收输入数据,如顶点位置、法线、纹理坐标等,并根据光照模型和材质属性计算出最终的颜色值。表面函数可以使用内置的光照模型,也可以自定义光照模型,以实现特定的材质效果。
- 光照模型:光照模型用于定义物体在不同光照条件下的外观。表面着色器提供了一些内置的光照模型,如 Lambert 光照模型、Blinn-Phong 光照模型等,开发者也可以自定义光照模型,以实现更复杂的材质效果。
-
示例与应用:
- 金属材质:使用表面着色器可以很容易地实现金属材质的效果。通过调整材质的颜色、光泽度、反射率等参数,可以模拟出不同种类的金属,如铜、铁、铝等。金属材质通常需要较强的高光和反射效果,表面着色器可以自动处理这些效果,使金属看起来更加真实。
- 玻璃材质:玻璃材质是一种具有透明和折射效果的材质,使用表面着色器可以实现逼真的玻璃效果。通过调整材质的透明度、折射率、反射率等参数,可以模拟出不同种类的玻璃,如透明玻璃、彩色玻璃、磨砂玻璃等。表面着色器可以自动处理玻璃的折射和反射效果,使玻璃看起来更加真实。
- 皮肤材质:皮肤材质是一种具有复杂纹理和颜色变化的材质,使用表面着色器可以实现逼真的皮肤效果。通过调整材质的颜色、纹理、粗糙度等参数,可以模拟出不同肤色和肤质的皮肤。表面着色器可以自动处理皮肤的光照和阴影效果,使皮肤看起来更加真实。
三、顶点片段着色器
-
特点与优势:
- 高度定制化:顶点片段着色器提供了对渲染过程的完全控制,开发者可以根据自己的需求编写任意的顶点和片段处理代码。这使得顶点片段着色器可以实现非常复杂和独特的材质效果和特效,如自定义的光照模型、粒子效果、后处理等。
- 性能优化:由于顶点片段着色器可以手动控制渲染过程中的各个阶段,开发者可以根据硬件性能和项目需求进行优化。例如,可以减少不必要的计算,使用纹理压缩,优化顶点和片段处理代码等,以提高渲染性能。
- 学习价值:编写顶点片段着色器需要对图形编程有更深入的理解,因此它是学习图形编程的一个很好的途径。通过编写顶点片段着色器,开发者可以深入了解图形硬件的工作原理和渲染过程,提高自己的图形编程能力。
-
结构与组成:
- 顶点着色器:顶点着色器是顶点片段着色器的第一部分,它负责处理物体的顶点数据。顶点着色器接收输入的顶点数据,如位置、法线、纹理坐标等,并进行一系列的变换和计算,最终输出顶点的最终位置和其他属性。顶点着色器可以使用内置的函数和变量,也可以自定义函数和变量,以实现特定的顶点处理效果。
- 片段着色器:片段着色器是顶点片段着色器的第二部分,它负责处理每个像素的颜色计算。片段着色器接收顶点着色器输出的属性,如位置、法线、纹理坐标等,并根据光照模型和材质属性计算出每个像素的最终颜色值。片段着色器可以使用内置的函数和变量,也可以自定义函数和变量,以实现特定的片段处理效果。
-
示例与应用:
- 自定义光照模型:顶点片段着色器可以实现自定义的光照模型,以实现更加逼真的材质效果。例如,可以实现基于物理的光照模型,如 PBR(Physically Based Rendering)光照模型,以模拟真实世界中的光照效果。自定义光照模型需要对光照原理和物理特性有深入的了解,同时需要进行大量的计算和优化,以保证渲染性能。
- 粒子效果:顶点片段着色器可以实现各种粒子效果,如火焰、烟雾、爆炸等。通过编写顶点着色器和片段着色器,可以控制粒子的位置、速度、颜色、大小等属性,以及实现粒子的动画效果。粒子效果通常需要大量的计算和优化,以保证渲染性能和效果的真实性。
- 后处理效果:顶点片段着色器可以实现各种后处理效果,如颜色调整、模糊、景深等。通过在渲染完成后对图像进行进一步的处理,可以增强画面的表现力和真实感。后处理效果通常需要在片段着色器中进行处理,对图像的每个像素进行计算和调整。
四、固定功能着色器
-
特点与优势:
- 简单易用:固定功能着色器使用固定的渲染流程和参数来实现材质效果,不需要开发者编写复杂的着色器代码。这使得固定功能着色器非常容易上手,适合初学者和快速开发。
- 兼容性好:由于固定功能着色器使用固定的渲染流程和参数,它在不同的图形硬件上具有较好的兼容性。这使得开发者可以在不同的平台上实现一致的材质效果,减少了跨平台开发的难度。
-
结构与组成:
- 材质参数:固定功能着色器通过调整材质的参数来实现不同的材质效果,如颜色、纹理、透明度、光照模型等。这些参数可以在 Unity 的材质编辑器中进行调整,以实现不同的材质效果。
- 渲染流程:固定功能着色器使用固定的渲染流程来处理物体的几何数据和材质参数,如顶点变换、光照计算、纹理采样等。这些流程是固定的,开发者无法进行修改和定制。
-
示例与应用:
- 简单材质效果:固定功能着色器适用于实现一些简单的材质效果,如纯色材质、纹理材质、透明材质等。这些材质效果不需要复杂的光照计算和特效,使用固定功能着色器可以快速实现。
- 旧项目维护:在一些旧项目中,可能仍然使用了固定功能着色器。如果需要对这些项目进行维护和更新,可以继续使用固定功能着色器,以保证项目的稳定性和兼容性。
五、着色器的创建和使用
-
创建着色器:
- 在 Unity 中,可以使用内置的着色器编辑器或者外部的文本编辑器来创建着色器。内置的着色器编辑器提供了一种可视化的方式来编写着色器代码,方便开发者进行调试和优化。外部的文本编辑器则提供了更多的功能和灵活性,适合有经验的开发者使用。
- 着色器文件通常以 “.shader” 为扩展名,它使用 Cg/HLSL 语言编写。着色器文件中包含了着色器的代码和属性定义,可以在 Unity 的材质编辑器中进行引用和调整。
-
应用着色器:
- 创建好着色器后,可以将其应用到材质上。在 Unity 的材质编辑器中,可以选择不同的着色器类型,并调整材质的参数来实现所需的外观效果。材质可以应用到游戏场景中的物体上,使物体具有特定的材质效果。
- 可以通过脚本动态地切换和调整材质的着色器,以实现不同的效果和动画。例如,可以在游戏中根据不同的场景和状态切换不同的着色器,或者通过调整着色器的参数来实现动态的材质效果。
-
优化着色器:
- 为了提高渲染性能,可以对着色器进行优化。优化的方法包括减少计算量、使用纹理压缩、避免不必要的光照计算等。
- 可以使用 Unity 的性能分析工具来分析着色器的性能,找出性能瓶颈并进行优化。性能分析工具可以提供着色器的执行时间、内存占用、GPU 使用率等信息,帮助开发者进行优化。
代码
Shader "Custom/NewSurfaceShader"
{
Properties
{
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Glossiness ("Smoothness", Range(0,1)) = 0.5
_Metallic ("Metallic", Range(0,1)) = 0.0
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
// Physically based Standard lighting model, and enable shadows on all light types
#pragma surface surf Standard fullforwardshadows
// Use shader model 3.0 target, to get nicer looking lighting
#pragma target 3.0
sampler2D _MainTex;
struct Input
{
float2 uv_MainTex;
};
half _Glossiness;
half _Metallic;
fixed4 _Color;
// Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader.
// See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing.
// #pragma instancing_options assumeuniformscaling
UNITY_INSTANCING_BUFFER_START(Props)
// put more per-instance properties here
UNITY_INSTANCING_BUFFER_END(Props)
void surf (Input IN, inout SurfaceOutputStandard o)
{
// Albedo comes from a texture tinted by color
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
o.Albedo = c.rgb;
// Metallic and smoothness come from slider variables
o.Metallic = _Metallic;
o.Smoothness = _Glossiness;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
这里就是路径和名字.
给材质使用刚才新建的Shader