ShaderLab学习笔记<一>

本文介绍了Unity ShaderLab的基础知识,包括ShaderLab的意义、如何控制渲染引擎、显卡编程代码解析、语法框架结构以及属性、SubShader和Pass的使用。通过实例讲解了颜色、材质、灯光、纹理和Alpha通道的控制,以及颜色混合、雾效等基本概念,适合Unity初学者学习。
摘要由CSDN通过智能技术生成

一、ShaderLab总大纲



ShaderLab意义


3、控制渲染引擎的工作方式

         这个功能是最主要功能,他可以控制渲染引擎的工作方式,也可以和引擎的其他功能产生沟通,比如我可以使用脚本代码控制其数据,或者通过编辑器控制着色器代码的数据;


4、解析显卡编程代码

对于 OpenGL 3D API他自动调用 GLSL解析程序; 

对于DirectX 3D API他自动调用HLSL解析程序

如果发现你写的是Cg代码,他使用Cg version 3.0来实现代码解析; 


语法框架结构

框架层级

1、外框:用来标注他是什么代码

Shader " 着色器代码名称

注意:着色器代码名称可以实现层级方式,例如:"MyShader/FixedShader",表示这个着色器代码数据 "MyShader"这个总目录之下的一个子对象;


2、属性框:用来和外界程序沟通的通道

Properties 

     // 属性:公共级别变量; 


注意:属性框必需存在于Shader "着色器名称" { } 这样外框之内。而且一定要在外框的最上面; 


属性: 

写法:变量名 ("在检视体面板上提供的名称 ", 变量的类型)=初始化值 


写法注意:属性必须初始化,变量名必须是英文的,"在检视体面板上提供的名称 ":这个东西可以是中文,一定要记住,最后不能添加 ";"进行结尾。这个属性变量一行只能定义一个,绝对不容许出现多个变量定义; 


属性变量类型: 

Vector : 向量类型,对应一个四位的向量 (x, y, z, w); 

Color : 颜色类型(float),对应一个 RGBA颜色设定: (R, G,B,A) 


Float : 单精度浮点,没有范围,对于初始化值据对不容许加入 "f"强转符号,例如 1.0  

Range(min, max): 区间取值,范围是你定义的min max之间的数包含min max的数。这个数必须是单精度浮点; 


2D: 表示一个2D的纹理贴图对象,必须是外界传递的 Texture2D资源。 

Cube :  立方体贴图,多用于天空盒,支持六面体贴图; 

Rect : 矩形贴图,用户鱼眼相机; 


属性定义例如: 

Properties  

     // 表示我们定义了一个颜色变量,并且初始化为白色 

     _Color("颜色", Color) = (1,1,1,1)  

     // 表示我们定义了一个坐标,初始化为 Zero 

     _Position("坐标", Vector) =(0,0,0,0) 

     // 表示我们定义了一个浮点化的数值 

     _Value("浮点数值", Float)=1.0 

     // 表示我们定义了一个区间值,并且给了一个值 

     _Range ( "区间值", Range(0.0,  1.0) ) = 0.5 

     // 表示我们定义了一个白色的底图,但是没有数据存在,需要外界程序给我们指定一个 2D纹理贴图; 

     _MainTex("纹理贴图", 2D) = "white"{} 

 


3、子外框:用来给着色框架提供着色代码

SubShader 

注意: SubShader这个子外框主要是用来提供着色代码的, SubShader可以实现好几个,多个 SubShader是为了让渲染引擎根据当时的渲染条件来选择可以执行的渲染代码。这个选择过程主要是渲染引擎自己抉择的,当渲染引擎选择了一个可以执行的 SubShader代码,其他的代码就全部失效; 

SubShader 的执行代码分类: 

1Unity引擎自带的一种功能渲染模式:表面体着色,他只能实现上色的功能,不能控制网格对象中的顶点坐标。对于的他上色一定是具有实时光照效果的; 

2、固定着色器代码,他是通过一系列的命令,控制渲染引擎工作; 

3、着色器代码:GLSL, HLSL, Cg这些就是显卡元语言代码,他可以干预网格定义定位和颜色的上色过程; 

### 回答1: 好的,下面是一个简单的故障 shader 的示例: ``` Shader "Faulty/ExampleShader" { 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 使用了标准光照模型,并且为所有光类型启用了阴影。它使用了 shader model 3.0 目标,以获得更好看的光照效果。该 shader 还支持实例化,允许您在使用该 shader 的材质上选中“启用实例化”复选框。 本示例中的故障可能体现在,如果您的项目使用的是 shader model ### 回答2: 故障shader是一种用于游戏或图形渲染中的特殊效果shader,可以通过改变材质外观和渲染方式来模拟故障效果。下面是一个使用shaderlab编写的简单故障shader的示例: 在Unity中,打开一个新的着色器程序(shader)文件,命名为"FaultShader"。 首先,定义材质属性(Properties),以便在材质面板中进行设置: ```shaderlab Properties { _MainTex("Main Texture", 2D) = "white" {} _FaultTex("Fault Texture", 2D) = "white" {} _Intensity("Intensity", Range(0, 1)) = 1 } ``` 接下来,定义顶点着色器输入结构(结构体)和输出结构: ```shaderlab struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; ``` 在顶点着色器中,将输入结构中的顶点位置直接传递给输出结构,并将纹理坐标传递给片段着色器: ```shaderlab v2f vert(appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } ``` 在片段着色器中,首先从纹理中获取颜色值,并将其与故障纹理中的颜色进行混合。混合的程度由设置的强度决定。然后将结果颜色作为输出: ```shaderlab sampler2D _MainTex; sampler2D _FaultTex; float _Intensity; fixed4 frag(v2f i) : SV_Target { fixed4 mainColor = tex2D(_MainTex, i.uv); fixed4 faultColor = tex2D(_FaultTex, i.uv); fixed4 finalColor = lerp(mainColor, faultColor, _Intensity); return finalColor; } ``` 最后,在着色器程序中使用以上定义的顶点着色器和片段着色器: ```shaderlab SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" sampler2D _MainTex; sampler2D _FaultTex; float _Intensity; struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; v2f vert(appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } fixed4 frag(v2f i) : SV_Target { fixed4 mainColor = tex2D(_MainTex, i.uv); fixed4 faultColor = tex2D(_FaultTex, i.uv); fixed4 finalColor = lerp(mainColor, faultColor, _Intensity); return finalColor; } ENDCG } } ``` 这就是一个简单的故障shadershaderlab编写示例,可通过在材质面板中设置主纹理和故障纹理以及故障强度来应用故障效果。当使用此shader渲染模型时,会产生与故障效果类似的视觉外观。 ### 回答3: ShaderLab是Unity中用于编写Shader的语言,可以用它来定义渲染对象的效果和纹理。故障Shader是一种可以在场景中创造各种有趣的视觉效果的Shader。以下是一个使用ShaderLab编写的简单故障Shader示例: ```csharp Shader "Custom/FaultShader" { Properties { _MainTex ("Main Texture", 2D) = "white" {} // 定义主纹理 _Speed ("Speed", Range(0, 10)) = 1 // 控制故障效果的速度 _Magnitude ("Magnitude", Range(0, 1)) = 0.5 // 控制故障效果的强度 } SubShader { Tags { "RenderType"="Opaque" } // 渲染类型为Opaque CGPROGRAM // 使用CG语言编写 #pragma surface surf Lambert // 使用Lambert模型表面着色 sampler2D _MainTex; // 主纹理 float _Speed; // 速度 float _Magnitude; // 强度 struct Input { float2 uv_MainTex; // 纹理坐标 }; void surf (Input IN, inout SurfaceOutput o) { float2 distortion = _Magnitude * sin(IN.uv_MainTex * _Speed); // 根据纹理坐标、速度和强度计算扭曲值 float4 mainTex = tex2D(_MainTex, IN.uv_MainTex + distortion); // 在纹理坐标上加上扭曲值 o.Albedo = mainTex.rgb; o.Alpha = mainTex.a; } ENDCG } FallBack "Diffuse" // 使用Diffuse Shader作为回滚效果 } ``` 这个故障Shader在场景中对渲染对象的纹理进行扭曲和失真处理。使用_Speed和_Magnitude属性来控制扭曲效果的速度和强度。故障效果是通过在纹理坐标上加上一个根据速度和强度计算的扭曲值来实现的。最后,使用Lambert模型表面着色来渲染对象。 以上是一个简单的故障Shader示例,可以根据需求进行更多定制和改进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值