Unity Shader--fixed function shader

本文參考unity3d官方API:https://docs.unity3d.com/Manual/ShaderTut1.html


首先写一个最简单示例代码如下:

Shader "Custom/FixedFunctionShader" 
{
	Properties
	{
		_Color("Color", color) = (1, 1, 1, 1)
	}


	SubShader 
	{
		Pass 
		{
			Material
			{
				DIFFUSE[_Color]
			}
		}
	}
}


然后,有这样的效果:


虽然能正确显示,但是这个时候,是不能调节显示的颜色的,因为我们所看到的东西都是有光来决定的,因此我们要继续加代码:

Pass 
		{
			Material
			{
				DIFFUSE[_Color]
				Ambient[_Color]
			}
			Lighting on 
		}

Ambient的顔色在一般情况下都是与物体的颜色采用同一个参数,而“”Lighting on“”是设置光的渲染,让Ambient起作用。

然后就有如下的效果了:


我把颜色设置成了红色,可以看到,有了明暗的变化等的效果。

然后,我们继续添加代码,增加高光的效果:

Properties
	{
		_Color("Color", color) = (1, 1, 1, 1)
		_SpecularColor("SpecularColor", color) = (1, 1, 1, 1)
	}

	SubShader 
	{
		Pass 
		{
			Material
			{
				DIFFUSE[_Color]
				Ambient[_Color]
				Specular[_SpecularColor]
			}
			Lighting on 
			SeparateSpecular on 
		}
	}

Specular与SeparateSpecular的作用与前面的Ambient与Lighting的指令一样,是unity内置的对于shader编程的指令。

现在可以看到有如下的效果:


可以看到,有非常明显的锯齿效果,为了消除这个,我们继续添加代码:

Properties
	{
		_Color("Color", color) = (1, 1, 1, 1)
		_SpecularColor("SpecularColor", color) = (1, 1, 1, 1)
		_Shininess("Shininess", Range(0.01, 0.1)) = 0.7 
	}

	SubShader 
	{
		Pass 
		{
			Material
			{
				DIFFUSE[_Color]
				Ambient[_Color]
				Shininess[_Shininess]
				Specular[_SpecularColor]
			}
			Lighting on 
			SeparateSpecular on 
		}
	}
然后调节一下参数后,会呈现如下的效果:



然后继续添加自发光的效果:

Properties
	{
		_Color("Color", color) = (1, 1, 1, 1)
		_SpecularColor("Specular Color", color) = (1, 1, 1, 1)
		_Shininess("Shininess", Range(0.01, 0.1)) = 0.7 
		_Emission("Emission Color", color) = (1, 1, 1, 1)
	}

	SubShader 
	{
		Pass 
		{
			Material
			{
				DIFFUSE[_Color]
				Ambient[_Color]
				Shininess[_Shininess]
				Specular[_SpecularColor]
				Emission[_Emission]
			}
			Lighting on 
			SeparateSpecular on 
		}
	}

调节参数,效果如下,第一张的是在有光的情况的,第二张的是没有光的情况下的:





然后,我们继续添加代码,添加一个可以使用贴图的功能:

Shader "Custom/FixedFunctionShader" 
{
	Properties
	{
		_Color("Color", color) = (1, 1, 1, 1)
		_SpecularColor("Specular Color", color) = (1, 1, 1, 1)
		_Shininess("Shininess", Range(0.01, 0.1)) = 0.7 
		_Emission("Emission Color", color) = (1, 1, 1, 1)
		_MainTex("Main Tex", 2d) = "white" {}
	}

	SubShader 
	{
		Pass 
		{
			Material
			{
				DIFFUSE[_Color]
				Ambient[_Color]
				Shininess[_Shininess]
				Specular[_SpecularColor]
				Emission[_Emission]
			}
			Lighting on 
			SeparateSpecular on 

			SetTexture[_MainTex]
			{
				Combine texture * primary  
			}
		}
	}
}

添加的SetTexture[_MainTex]的命令也是unity内置的,它可以应用一张贴图, combine是结合之前的计算再与贴图一起作用于材质球,你

也可以在primary的后面添加一个double,来提高亮度。效果如下:


使用的贴图:

            


添加了double的效果:



然后,再继续添加多一张贴图:

Shader "Custom/FixedFunctionShader" 
{
	Properties
	{
		_Color("Color", color) = (1, 1, 1, 1)
		_SpecularColor("Specular Color", color) = (1, 1, 1, 1)
		_Shininess("Shininess", Range(0.01, 0.1)) = 0.7 
		_Emission("Emission Color", color) = (1, 1, 1, 1)
		_MainTex("Main Tex", 2d) = "white" {}
		_SecondTex("Second Tex", 2d) = "white" {}
	}

	SubShader 
	{
		Pass 
		{
			Material
			{
				DIFFUSE[_Color]
				Ambient[_Color]
				Shininess[_Shininess]
				Specular[_SpecularColor]
				Emission[_Emission]
			}
			Lighting on 
			SeparateSpecular on 

			SetTexture[_MainTex]
			{
				Combine texture * primary  double 
			}
			
			SetTexture[_SecondTex]
			{
				Combine texture * previous  double
			}
		}
	}
}

这就是最终的代码了。最后的previous命令是unity内置的,用于处理多张贴图的指令。

效果如下:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值