Unity着色器和屏幕特效开发秘籍 顶点-片元着色器实现系列-BasicDiffuse
2018-02-24 16:55
501 查看
BasicDiffuse表面着色器代码为:
对应的顶点-片元着色器代码为:Shader "BasicDiffuse"
{
Properties
{
_EmissiveColor("Emissive Color",Color) = (1,1,1,1)
_AmbientColor("Ambient Color",Color) = (1,1,1,1)
_MySilderValue("This is a Silder",Range(0,10)) = 2.5
}
SubShader
{
Pass
{
Tags{"LightMode" = "ForwardBase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc"
fixed4 _EmissiveColor;
fixed4 _AmbientColor;
fixed _MySilderValue;
struct a2v
{
float4 vertex:POSITION;
float3 normal:NORMAL;
};
struct v2f
{
float4 pos:SV_POSITION;
float3 worldNormal:TEXCOORD0;
float3 worldPos:TEXCOORD1;
};
v2f vert(a2v v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;
o.worldNormal = mul(unity_ObjectToWorld,v.normal);
return o;
}
fixed4 frag(v2f i):SV_Target
{
fixed3 worldNormal = normalize(i.worldNormal);
fixed3 lightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
fixed NdotL = dot(worldNormal,lightDir);
fixed4 col = pow((_EmissiveColor + _AmbientColor),_MySilderValue);
fixed3 finalColor = _LightColor0.rgb * col.rgb * max(0,NdotL);
return fixed4(finalColor,1.0);
}
ENDCG
}
}
FallBack "Diffuse"
}效果如下:
Shader "BasicDiffuse" { Properties { _EmissiveColor("Emissive Color",Color) = (1,1,1,1) _AmbientColor("Ambient Color",Color) = (1,1,1,1) _MySilderValue("This is a Silder",Range(0,10)) = 2.5 } SubShader { Tags{"RenderType" = "Opaque"} LOD 200 CGPROGRAM #pragma surface surf BasicDiffuse fixed4 _EmissiveColor; fixed4 _AmbientColor; float _MySilderValue; struct Input { half2 uv_MainTex; }; inline fixed4 LightingBasicDiffuse(SurfaceOutput s,fixed3 lightDir,fixed3 viewDir,fixed atten) { fixed NdotL = dot(normalize(s.Normal),normalize(lightDir)); fixed4 col; col.rgb = s.Albedo * _LightColor0.rgb * max(0,NdotL); col.a = s.Alpha; return col; } void surf(Input IN,inout SurfaceOutput o) { fixed4 col = pow((_EmissiveColor + _AmbientColor),_MySilderValue); o.Albedo = col.rgb; o.Alpha = col.a; } ENDCG } FallBack "Diffuse" }效果如下:
对应的顶点-片元着色器代码为:Shader "BasicDiffuse"
{
Properties
{
_EmissiveColor("Emissive Color",Color) = (1,1,1,1)
_AmbientColor("Ambient Color",Color) = (1,1,1,1)
_MySilderValue("This is a Silder",Range(0,10)) = 2.5
}
SubShader
{
Pass
{
Tags{"LightMode" = "ForwardBase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc"
fixed4 _EmissiveColor;
fixed4 _AmbientColor;
fixed _MySilderValue;
struct a2v
{
float4 vertex:POSITION;
float3 normal:NORMAL;
};
struct v2f
{
float4 pos:SV_POSITION;
float3 worldNormal:TEXCOORD0;
float3 worldPos:TEXCOORD1;
};
v2f vert(a2v v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;
o.worldNormal = mul(unity_ObjectToWorld,v.normal);
return o;
}
fixed4 frag(v2f i):SV_Target
{
fixed3 worldNormal = normalize(i.worldNormal);
fixed3 lightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
fixed NdotL = dot(worldNormal,lightDir);
fixed4 col = pow((_EmissiveColor + _AmbientColor),_MySilderValue);
fixed3 finalColor = _LightColor0.rgb * col.rgb * max(0,NdotL);
return fixed4(finalColor,1.0);
}
ENDCG
}
}
FallBack "Diffuse"
}效果如下:
相关文章推荐
- Unity着色器和屏幕特效开发秘籍 顶点-片元着色器实现系列-AnimatedSprite
- Unity着色器和屏幕特效开发秘籍 顶点-片元着色器实现系列-SimpleReflection
- Unity着色器和屏幕特效开发秘籍 顶点-片元着色器实现系列-Phong
- Unity着色器和屏幕特效开发秘籍 顶点-片元着色器实现系列-SpecularMask
- Unity着色器和屏幕特效开发秘籍 顶点-片元着色器实现系列-NormalMapping
- Unity着色器和屏幕特效开发秘籍 顶点-片元着色器实现系列-BRDFDiffuse
- 《着色器和屏幕特效》读书笔记第八章-用Unity的渲染纹理实现屏幕特效
- 关键帧实现的动画效果顶点着色器的开发(Shader特效1)
- 波动效果顶点着色器的实现(Shader特效4)
- 【Unity Shader编程】之十五 屏幕高斯模糊(Gaussian Blur)后期特效的实现
- 【unity】【shader】屏幕高斯模糊(Gaussian Blur)后期特效的实现
- Unity开发安卓游戏:1.实现移动设备屏幕自适应
- 【《Unity着色器和屏幕特效开发秘笈》】学习整理:关于模型顶点色的显示问题
- Android官方开发文档Training系列课程中文版:多样屏幕之实现自适应UI
- unity使用屏幕后处理实现闪烁特效,创建新的shader文件过程
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四)实现2D人物动画①
- BlogEngine.Net架构与源代码分析系列part9:开发扩展(上)——Extension与管理上的实现
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(五)实现2D人物动画②
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四)实现2D人物动画①
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(十一)地图遮罩层的实现