分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
本系列文章由@浅墨_毛星云 出品,转载请注明出处。
文章链接: http://blog.youkuaiyun.com/poem_qianmo/article/details/50878538
作者:毛星云(浅墨) 微博:http://weibo.com/u/1723155442
本文工程使用的Unity3D版本: 5.2.1
本次更新放出的Shader为透明系列的3个Shader和标准的镜面高光Shader的两个Shader。由易到难,由入门级到应用级,难度梯度合理。
依然是先放出游戏场景的exe和运行截图。
本期用的模型为妙蛙草。
OK,直奔主题吧。
一、单色透明Shader
在上篇文章中单色透明的基础上进行改造,加入alpha混合,构成了这篇文章的第一个Shader——单色透明Shader。具体代码如下:
//透明单色ShaderShader "浅墨Shader编程/Volume13/1.SimpleAlphaShader" { //------------------------------------【唯一的子着色器】------------------------------------ SubShader { //设置Queue为透明,在所有非透明几何体绘制之后再进行绘制 Tags{ "Queue" = "Transparent" } Pass { //不写入深度缓冲,为了不遮挡住其他物体 ZWrite Off //选取Alpha混合方式 Blend SrcAlpha SrcAlpha //Blend SrcAlpha OneMinusSrcAlpha //===========开启CG着色器语言编写模块============ CGPROGRAM //编译指令:告知编译器顶点和片段着色函数的名称 #pragma vertex vert #pragma fragment frag //--------------------------------【顶点着色函数】----------------------------- // 输入:POSITION语义(坐标位置) // 输出:SV_POSITION语义(像素位置) //--------------------------------------------------------------------------------- float4 vert(float4 vertexPos : POSITION) : SV_POSITION { //坐标系变换 //输出的顶点位置(像素位置)为模型视图投影矩阵乘以顶点位置,也就是将三维空间中的坐标投影到了二维窗口 return mul(UNITY_MATRIX_MVP, vertexPos); } //--------------------------------【片段着色函数】----------------------------- // 输入:无 // 输出:COLOR语义(颜色值) //--------------------------------------------------------------------------------- float4 frag(void) : COLOR { //返回单色 return float4(0.3, 1.0, 0.1, 0.6); } //===========结束CG着色器语言编写模块=========== ENDCG } }}
将其施用于材质之上的效果如下:
实景效果如下:
![]()
二、颜色可以调版单色透明Shader
老规矩,让颜色可调,来一个Properties属性块,替换掉Hard encoding硬编码的颜色。所以,代码如下:
//颜色可以调版单色透明ShaderShader "浅墨Shader编程/Volume13/2.ColorChangeAlpha"{ //------------------------------------【属性值】------------------------------------ Properties { //颜色值 _ColorWithAlpha("ColorWithAlpha", Color) = (0.9, 0.1, 0.1, 0.5) } //------------------------------------【唯一的子着色器】------------------------------------ SubShader { //设置Queue为透明,在所有非透明几何体绘制之后再进行绘制 Tags{ "Queue" = "Transparent" } //--------------------------------唯一的通道------------------------------- Pass { //不写入深度缓冲,为了不遮挡住其他物体 ZWrite Off //选取Alpha混合方式 Blend SrcAlpha SrcAlpha //Blend SrcAlpha OneMinusSrcAlpha //===========开启CG着色器语言编写模块============ CGPROGRAM //编译指令:告知编译器顶点和片段着色函数的名称 #pragma vertex vert #pragma fragment frag //变量声明 uniform float4 _ColorWithAlpha; //--------------------------------【顶点着色函数】----------------------------- // 输入:POSITION语义(坐标位置) // 输出:SV_POSITION语义(像素位置) //--------------------------------------------------------------------------------- float4 vert(float4 vertexPos : POSITION) : SV_POSITION { //坐标系变换 //输出的顶点位置(像素位置)为模型视图投影矩阵乘以顶点位置,也就是将三维空间中的坐标投影到了二维窗口 return mul(UNITY_MATRIX_MVP, vertexPos); } //--------------------------------【片段着色函数】----------------------------- // 输入:无 // 输出:COLOR语义(颜色值) //--------------------------------------------------------------------------------- float4 frag(void) : COLOR { //返回自定义的RGBA颜色 return _ColorWithAlpha; } //===========结束CG着色器语言编写模块=========== ENDCG } }}
将其施用于材质之上的效果如下:
这边的调色板中,,除了RGB三色,还有Alpha值可以进行调节。
实景效果如下:
三、双面双色颜色可以调版透明Shader
我们可以利用Cull语句,分别在两个Pass中Cull Front和Cull Back,以让材质的正面和反面显示出不同的颜色。代码实现如下:
//双面双色颜色可以调版透明ShaderShader "浅墨Shader编程/Volume13/3.TwoSideColorChangeAlpha" { //------------------------------------【属性值】------------------------------------ Properties { //正面颜色值 _ColorWithAlpha_Front("ColorWithAlpha_Front", Color) = (0.9, 0.1, 0.1, 0.5) //背面颜色值 _ColorWithAlpha_Back("ColorWithAlpha_Back", Color) = (0.1, 0.3, 0.9, 0.5) } //------------------------------------【唯一的子着色器】------------------------------------ SubShader { //设置Queue为透明,在所有非透明几何体绘制之后再进行绘制 Tags{ "Queue" = "Transparent" } //------------------------【通道1:渲染正面】------------------------- Pass { //剔除背面,渲染正面 Cull Back //不写入深度缓冲,为了不遮挡住其他物体 ZWrite Off //选取Alpha混合方式 Blend SrcAlpha OneMinusSrcAlpha //Blend SrcAlpha SrcAlpha //===========开启CG着色器语言编写模块============ CGPROGRAM //编译指令:告知编译器顶点和片段着色函数的名称 #pragma vertex vert &n