转载自:https://blog.csdn.net/qq_33537945/article/details/79242512
我使用Unity版本是 2017.3.0
1. 创建工程什么的就不说了
2. 创建一个3D游戏物体(我创建的是Capsule) 和 一个材质球
3. 创建材质球添加到游戏物体 这时可以在 材质的Shader上进行进行Shader选择 Standard(标准的)FX(特效)GUI(GUI上的渲染) Moblie (适用于移动端的)
4. 创建一个自己的Shader 使用材质和Shader控制游戏物体渲染
创建一个标准的表面着色器如图(通常都是创建这个) 相当于材质球Shader选项里面的Standard 我起的名字叫做FirstShader-01
创建的这个Shader在如图位置可以看见 (根据代码修改) 默认就是这个位置
选择自己创建Shader后的后的样子 (现在创建的这个Shader里面是有自己的默认代码的 可以实现一些基本的功能等下 把这些代码删除 编写自己的Shader)
5.打双击开自己创建的Shader(VC2015以上版本对Shader进行了支持 但是不会自动填充什么的 只有个别关键字高亮 我用的是2017)
6.删除Shader里面的所以代码 随后自己编写
7.编写自己的Shader代码 如图
// 这里指定shader的名字,不要求跟文件名保持一致 /后面 代表shader的显示等级
// 语法: Shader"这里写名字" 固定写法
Shader"myshader/myshader01"{
}
8. 继续编写自己的Shader代码(此时运行会报红 因为现在编写的shader代码结构 还不完整)
// Properties里写属性 (固定写法)
Properties{
}
<span class="hljs-comment">// SubShader 可以有很多个 里面编写的是渲染的代码 利用属性编写一些 控制 渲染出来的效果</span>
<span class="hljs-comment">// 为什么创建多个SubShader 因为不同的SubShader可以实现不同的效果 在不同的显卡上运行时需要</span>
<span class="hljs-comment">// 比如不同的显卡对应不同的SubShader 好一点的对应 一个SubShader 差一点的对应一个SubShader</span>
<span class="hljs-comment">// 1. 显卡运行效果时,从第一个SubShader开始,如果里面的效果都可以实现,那么就使用第一个SubShader</span>
<span class="hljs-comment">// 2. 如果这个SubShader满足不了这个显卡的需求,它会自动跳到下一个 如果没有可以实现的会</span>
<span class="hljs-comment">// 3. 调用 Fallback"VertexLit" 默认的</span>
<span class="hljs-comment">// 一般第一个SubShader是显示效果最好的 第二个比第一个次一点 <a href="https://www.baidu.com/s?wd=%E4%BB%A5%E6%AD%A4%E7%B1%BB%E6%8E%A8&tn=24004469_oem_dg&rsv_dl=gh_pl_sl_csd" target="_blank">以此类推</a> 这样会增加shader的适应能力</span>
SubShader{
}
<span class="hljs-comment">// 上面的SubShader都不执行的时候 执行Fallback</span>
<span class="hljs-comment">// Fallback用来指定一个已经存在了的Shader </span>
Fallback<span class="hljs-string">"VertexLit"</span></code></pre><img src="https://img-blog.csdn.net/20180202203220919?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzM1Mzc5NDU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt=""><br>
这里的VertexLit 图(这里直接写名字就可以)
9. 补充完Shader代码结构 让它可以运行
编写属性
// 第一个 _color 代表属性的名字 是自定义的
// ("_color",Color) 里面的字符串是在Inspector面板显示的名字 是自定义的
// ("_color",Color) , 后面的Color代表定义的属性 是固定的
// =(1,1,1,1) 这个()里面设置默认值 R G B A
_color("_color",Color)=(1,1,1,1)
![](https://i-blog.csdnimg.cn/blog_migrate/e0a24655f601f735f4ef7c910afd8ff5.png)
在SubShader里面编写Pass块
// SubShader 里面必须有一个 Pass块 也可以有多个
// 一个Pass块代表一个方法
<span> </span>Pass{
<span> </span>// 在这里编写Shader代码
<span> </span>CGPROGRAM
<span> </span>// 使用CG语言编写shader代码
<span> </span>ENDCG
<span> </span>}
![](https://i-blog.csdnimg.cn/blog_migrate/74ff116c76754e24635d98ee75988e10.png)
此时代码可以通过了 效果如图
完整代码如下
// 这里指定shader的名字,不要求跟文件名保持一致 /后面 代表shader的显示等级
// 语法 Shader"这里写名字" 固定写法
Shader"myshader/myshader01"{
// Properties里写属性 (固定写法)
Properties{
// 第一个 _color 代表属性的名字 是自定义的
// ("_color",Color) 里面的字符串是在Inspector面板显示的名字 是自定义的
// ("_color",Color) , 后面的Color代表定义的属性 是固定的
// =(1,1,1,1) 这个()里面设置默认值 R G B A
_color("_color",Color)=(1,1,1,1)
}
// SubShader 可以有很多个 里面编写的是渲染的代码 利用属性编写一些 控制 渲染出来的效果
// 为什么创建多个SubShader 因为不同的SubShader可以实现不同的效果 在不同的显卡上运行时需要
// 比如不同的显卡对应不同的SubShader 好一点的对应 一个SubShader 差一点的对应一个SubShader
// 1. 显卡运行效果时,从第一个SubShader开始,如果里面的效果都可以实现,那么就使用第一个SubShader
// 2. 如果这个SubShader满足不了这个显卡的需求,它会自动跳到下一个 如果没有可以实现的会
// 3. 调用 Fallback"VertexLit" 默认的
// 一般第一个SubShader是显示效果最好的 第二个比第一个次一点 以此类推 这样会增加shader的适应能力
SubShader{
// SubShader 里面必须有一个 Pass块 也可以有多个
// 一个Pass块代表一个方法
Pass{
// 在这里编写Shader代码
CGPROGRAM
// 使用CG语言编写shader代码
ENDCG
}
}
// 上面的SubShader都不执行的时候 执行Fallback
// Fallback用来指定一个已经存在了的Shader
Fallback"VertexLit"
}
![](https://i-blog.csdnimg.cn/blog_migrate/321e8c9b296f3f443b46ad3311276e1d.png)