地形混合shader
1.四个贴图混合
Shader "Custom/BlendTex_surface" {
Properties {
_RTexture("Red Channel Texture", 2D) = "" {}
_GTexture("Green Channel Texture", 2D) = "" {}
_BTexture("Blue Channel Texture", 2D) = "" {}
_ATexture("Alpha Channel Texture", 2D) = "" {}
_Mask("Mask(RG)",2D) = ""{}
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD CGPROGRAM
#pragma surface surf Lambert
#pragma target 4.0 sampler2D _RTexture;
sampler2D _GTexture;
sampler2D _BTexture;
sampler2D _ATexture; sampler2D _Mask; struct Input {
float2 uv_RTexture;
float2 uv_GTexture;
float2 uv_BTexture;
float2 uv_ATexture;
float2 uv_Mask;
}; void surf (Input IN, inout SurfaceOutput o) {
float4 rTexData = tex2D(_RTexture, IN.uv_RTexture);
float4 gTexData = tex2D(_GTexture, IN.uv_GTexture);
float4 bTexData = tex2D(_BTexture, IN.uv_BTexture);
float4 aTexData = tex2D(_ATexture, IN.uv_ATexture);
float4 blendData = tex2D(_Mask, IN.uv_Mask); float4 finalColor;
//根据blendData.g 将 RTexture 和 GTexture 混合
finalColor = lerp(rTexData, gTexData, blendData.g);//原本为g
//根据blendData.b 将 BTexture 混合
finalColor = lerp(finalColor, bTexData, blendData.b);//原本为b
//根据blendData.a 将 ATexture 混合
finalColor = lerp(finalColor, aTexData , blendData.a);//原本为a
finalColor = saturate(finalColor);
o.Albedo = finalColor.rgb;
o.Alpha = finalColor.a;
}
ENDCG
}
FallBack "Diffuse"
}
BlendTex_surface
Shader "Custom/BlendTex_vertfrag"
{
Properties
{
Tex0 ("Layer 0 (R)", 2D) = "white" {}
Tex1 ("Layer 1 (G)", 2D) = "white" {}
Tex2 ("Layer 2 (G)", 2D) = "white" {}
Tex3 ("Layer 3 (A)", 2D) = "white" {}
_Control ("Control (RGBA)", 2D) = "red" {}
_IllumFactor ("Illumin Factor", Range(,)) =
} SubShader
{
Tags{ "Queue" = "Geometry+110" }
Pass
{ Tags{"LightMode" = "ForwardBase" } CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 2.0
#include "UnityCG.cginc" sampler2D _Control;
sampler2D Tex0;
sampler2D Tex1;
sampler2D Tex2;
sampler2D Tex3;
half _IllumFactor; half4 Tex0_ST;
half4 Tex1_ST;
half4 Tex2_ST;
half4 Tex3_ST;
half4 _Control_ST; struct v2f
{
float4 pos : SV_POSITION;
half2 uv_Tex0:TEXCOORD0;
half2 uv_Tex1:TEXCOORD1;
half2 uv_Tex2:TEXCOORD2;
half2 uv_Tex3:TEXCOORD3;
half2 uv_Control:TEXCOORD4;
}; struct appdata
{
float4 vertex : POSITION;
float4 texcoord : TEXCOORD0;
}; v2f vert (appdata v)
{
float4 worldPos = mul(unity_ObjectToWorld, v.vertex); v2f o; o.uv_Control = v.texcoord.xy;
o.uv_Tex0 = TRANSFORM_TEX(v.texcoord ,Tex0);
o.uv_Tex1 = TRANSFORM_TEX(v.texcoord ,Tex1);
o.uv_Tex2 = TRANSFORM_TEX(v.texcoord, Tex2);
o.uv_Tex3 = TRANSFORM_TEX(v.texcoord, Tex3);
o.pos = mul(UNITY_MATRIX_MVP, float4(v.vertex.xyz, )); return o;
} fixed4 frag(v2f i) : COLOR
{
fixed4 splat_control = tex2D (_Control, i.uv_Control.xy); fixed4 albedo = fixed4(,,,);
fixed4 Tex0Color = tex2D(Tex0, i.uv_Tex0);
//albedo.rgb = splat_control.r * Tex0Color.rgb;...用这个会出现不明黑色阴影
fixed4 Tex1Color = tex2D(Tex1, i.uv_Tex1);
//albedo.rgb += splat_control.g * Tex1Color.rgb; fixed4 Tex2Color = tex2D(Tex2, i.uv_Tex2).rgba;
//albedo.rgb += splat_control.b * Tex2Color;
fixed4 Tex3Color = tex2D(Tex3, i.uv_Tex3).rgba;
//albedo.rgb += splat_control.a * Tex3Color; albedo = lerp(Tex0Color,Tex1Color, splat_control.g);
albedo = lerp(albedo,Tex2Color, splat_control.b);
albedo = lerp(albedo,Tex3Color, splat_control.a); return albedo* _IllumFactor;
} ENDCG
}
}
FallBack "Diffuse"
}
BlendTex_vertfrag
2.四个贴图(加法线)混合
Shader "Custom/BlendNormalTex_surface" {
Properties {
_RTexture("Red Channel Texture", 2D) = "" {}
_GTexture("Green Channel Texture", 2D) = "" {}
_BTexture("Blue Channel Texture", 2D) = "" {}
_ATexture("Alpha Channel Texture", 2D) = "" {} _RNormalTex ("RNormal Map", 2D) = "bump" {}
_GNormalTex ("GNormal Map", 2D) = "bump" {}
_BNormalTex ("BNormal Map", 2D) = "bump" {}
_ANormalTex ("ANormal Map", 2D) = "bump" {} _RNormalIntensity ("RNormal Map Intensity", Range(-,)) =
_GNormalIntensity ("GNormal Map Intensity", Range(-,)) =
_BNormalIntensity ("BNormal Map Intensity", Range(-,)) =
_ANormalIntensity ("ANormal Map Intensity", Range(-,)) =
_IllumFactor ("Illumin Factor", Range(,)) = _Mask("Mask(RG)",2D) = ""{}
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD CGPROGRAM
#pragma surface surf Lambert
// #pragma surface surf Lambert vertex:vert
#pragma target 4.0 sampler2D _RTexture,_GTexture,_BTexture,_ATexture;
sampler2D _RNormalTex,_GNormalTex,_BNormalTex,_ANormalTex;
float _RNormalIntensity,_GNormalIntensity,_BNormalIntensity,_ANormalIntensity;
float _IllumFactor; sampler2D _Mask; struct Input {
float2 uv_RTexture;
float2 uv_GTexture;
float2 uv_BTexture;
float2 uv_ATexture;
float2 uv_RNormalTex;
float2 uv_GNormalTex;
float2 uv_BNormalTex;
float2 uv_ANormalTex;
float2 uv_Mask;
// float3 m_normal;
};
void surf (Input IN, inout SurfaceOutput o) {
float4 rTexData = tex2D(_RTexture, IN.uv_RTexture);
float4 gTexData = tex2D(_GTexture, IN.uv_GTexture);
float4 bTexData = tex2D(_BTexture, IN.uv_BTexture);
float4 aTexData = tex2D(_ATexture, IN.uv_ATexture);
float4 blendData = tex2D(_Mask, IN.uv_Mask); float4 finalColor;
//根据blendData.g 将 RTexture 和 GTexture 混合
finalColor = lerp(rTexData, gTexData, blendData.g);
//根据blendData.b 将 BTexture 混合
finalColor = lerp(finalColor, bTexData, blendData.b);
//根据blendData.a 将 ATexture 混合
finalColor = lerp(finalColor, aTexData , blendData.a);
finalColor = saturate(finalColor); float3 rNormalMap = UnpackNormal(tex2D(_RNormalTex, IN.uv_RNormalTex));
rNormalMap.xy*=_RNormalIntensity;
float3 gNormalMap = UnpackNormal(tex2D(_GNormalTex, IN.uv_GNormalTex));
gNormalMap.xy*=_GNormalIntensity;
float3 bNormalMap = UnpackNormal(tex2D(_BNormalTex, IN.uv_BNormalTex));
bNormalMap.xy*=_BNormalIntensity;
//bNormalMap.z=sqrt(1.0-saturate(dot(bNormalMap.xy,bNormalMap.xy)));这个似乎并没有效果
float3 aNormalMap = UnpackNormal(tex2D(_ANormalTex, IN.uv_ANormalTex));
aNormalMap.xy*=_ANormalIntensity; float3 finalNormal;
//根据blendData.g 将 RTexture 和 GTexture 混合
finalNormal = lerp(rNormalMap, gNormalMap, blendData.g);
//根据blendData.b 将 BTexture 混合
finalNormal = lerp(finalNormal, bNormalMap, blendData.b);
//根据blendData.a 将 ATexture 混合
finalNormal = lerp(finalNormal, aNormalMap , blendData.a); o.Albedo =finalColor*_IllumFactor;
o.Alpha = finalColor.a;
o.Normal=finalNormal;
//o.Normal=rNormalMap*blendData.r+gNormalMap*blendData.g+bNormalMap*blendData.b+aNormalMap*blendData.a;
}
ENDCG
}
FallBack "Diffuse"
}
BlendNormalTex_surface
Shader "Custom/BlendNormalTex_vertfrag"
{
Properties
{
Tex0 ("Layer 0 (R)", 2D) = "white" {}
Tex1 ("Layer 1 (G)", 2D) = "white" {}
Tex2 ("Layer 2 (G)", 2D) = "white" {}
Tex3 ("Layer 3 (A)", 2D) = "white" {} _Normal0("Normal 0 (A)", 2D) = "bump" {}
_Normal1("Normal 1 (B)", 2D) = "bump" {}
_Normal2("Normal 2 (G)", 2D) = "bump" {}
_Normal3("Normal 3 (R)", 2D) = "bump" {} _BumpScale0("BumpScale 0", Range(-1.0,1.0)) = 1.0
_BumpScale1("BumpScale 1", Range(-1.0, 1.0)) = 1.0
_BumpScale2("BumpScale 2", Range(-1.0, 1.0)) = 1.0
_BumpScale3("BumpScale 3", Range(-1.0, 1.0)) = 1.0
_Control ("Control (RGBA)", 2D) = "red" {}
_IllumFactor ("Illumin Factor", Range(,)) =
} SubShader
{
Tags{ "Queue" = "Geometry+110" }
Pass
{ Tags{"LightMode" = "ForwardBase" } CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 2.0
#include "UnityCG.cginc"
#include "Lighting.cginc" sampler2D _Control;
//贴图及纹理
sampler2D Tex0,Tex1,Tex2,Tex3;
half4 Tex0_ST,Tex1_ST,Tex2_ST,Tex3_ST;
//法线贴图及纹理
sampler2D _Normal0,_Normal1,_Normal2,_Normal3;
half4 _Normal0_ST,_Normal1_ST,_Normal2_ST,_Normal3_ST;
half _BumpScale0, _BumpScale1, _BumpScale2, _BumpScale3; half _IllumFactor;
half4 _Control_ST; struct v2f
{
float4 pos : SV_POSITION;
float3 normal:NORMAL;
float4 tangnent:TANGENT;
half4 uv_Tex0:TEXCOORD0;
half4 uv_Tex1:TEXCOORD1;
half4 uv_Tex2:TEXCOORD2;
half4 uv_Tex3:TEXCOORD3;
half2 uv_Control:TEXCOORD4;
half3 lightDir:TEXCOORD5;
half3 viewDir:TEXCOORD6;
}; struct appdata
{
float4 vertex : POSITION;
float4 texcoord : TEXCOORD0;
float4 tangent:TANGENT;
float3 normal:NORMAL;
}; v2f vert (appdata v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv_Control = v.texcoord.xy;
o.uv_Tex0.xy = TRANSFORM_TEX(v.texcoord ,Tex0);
o.uv_Tex0.zw = TRANSFORM_TEX(v.texcoord ,_Normal0); o.uv_Tex1.xy = TRANSFORM_TEX(v.texcoord ,Tex1);
o.uv_Tex1.zw = TRANSFORM_TEX(v.texcoord ,_Normal1); o.uv_Tex2.xy = TRANSFORM_TEX(v.texcoord, Tex2);
o.uv_Tex2.zw = TRANSFORM_TEX(v.texcoord ,_Normal2); o.uv_Tex3.xy = TRANSFORM_TEX(v.texcoord, Tex3);
o.uv_Tex3.zw = TRANSFORM_TEX(v.texcoord ,_Normal3); TANGENT_SPACE_ROTATION;
o.lightDir=mul(rotation,ObjSpaceLightDir(v.vertex)).xyz;
o.viewDir=mul(rotation,ObjSpaceViewDir(v.vertex)).xyz; return o;
}
fixed4 frag(v2f i):SV_Target
{
fixed3 tangentLightDir=normalize(i.lightDir);
fixed3 tangentViewDir=normalize(i.viewDir);//暂时没用到,用于补充高光 fixed4 splat_control = tex2D (_Control, i.uv_Control.xy); fixed3 tangentNormal0=UnpackNormal(tex2D(_Normal0, i.uv_Tex0.zw));
tangentNormal0.xy*=_BumpScale0; fixed3 tangentNormal1=UnpackNormal(tex2D(_Normal1, i.uv_Tex1.zw));
tangentNormal1.xy*=_BumpScale1; fixed3 tangentNormal2=UnpackNormal(tex2D(_Normal2, i.uv_Tex2.zw));
tangentNormal2.xy*=_BumpScale2; fixed3 tangentNormal3=UnpackNormal(tex2D(_Normal3, i.uv_Tex3.zw));
tangentNormal3.xy*=_BumpScale3; fixed4 albedo = 0.0f; fixed4 Tex0Color = tex2D(Tex0, i.uv_Tex0);
fixed4 Tex1Color = tex2D(Tex1, i.uv_Tex1);
fixed4 Tex2Color = tex2D(Tex2, i.uv_Tex2);
fixed4 Tex3Color = tex2D(Tex3, i.uv_Tex3); albedo = lerp(Tex0Color*max(, dot(tangentNormal1, tangentLightDir)),Tex1Color*max(, dot(tangentNormal1, tangentLightDir)), splat_control.g);
albedo = lerp(albedo,Tex2Color*max(, dot(tangentNormal2, tangentLightDir)), splat_control.b);
albedo = lerp(albedo,Tex3Color*max(, dot(tangentNormal3, tangentLightDir)), splat_control.a); return albedo*_IllumFactor;
}
ENDCG
}
}
FallBack "Diffuse"
}
BlendNormalTex_vertfrag
效果:
albedo = lerp(Tex0Color,Tex1Color, splat_control.g);
//splat_control.g*Tex0Color+(1-splat_control.g)*Tex1Color
工程文件:http://files.cnblogs.com/files/luxishi/BlendShader.rar
地形混合shader的更多相关文章
- Unity3d之Shader编程:子着色器、通道与标签的写法 & 纹理混合
一.子着色器 Unity中的每一个着色器都包含一个subshader的列表,当Unity需要显示一个网格时,它能发现使用的着色器,并提取第一个能运行在当前用户的显示卡上的子着色器. 我们知道,子着色器 ...
- 【浅墨Unity3D Shader编程】之三 光之城堡篇:子着色器、通道与标签的写法 & 纹理混合
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://hpw123.net/a/C__/kongzhitaichengxu/2014/1117/120.html 作者:毛星云 ...
- Unity3d之将terrain转化成mesh
Unity3d中,terrain还是比较耗的,DrawCall数也比较多,为了优化性能,可能需要将terrain转化成mesh. 现提供一工具,思路是根据terrain高度图生成mesh等,可参考: ...
- unity描边效果
这里总结了几种在unity实现描边效果的方法,首先准备一个模型导入在unity中,使用默认shader,上传一张原始图,以便后面实现功能效果的对比 一.边缘光,这里参照官方的一个SurfaceShad ...
- Android群英传笔记——第六章:Android绘图机制与处理技巧
Android群英传笔记--第六章:Android绘图机制与处理技巧 一直在情调,时间都是可以自己调节的,不然世界上哪有这么多牛X的人 今天就开始读第六章了,算日子也刚好一个月了,一个月就读一半,这效 ...
- UE问题分部解决
0.寻找Actor ALandscape *land=nullptr; for (TActorIterator<ALandscape> It(GEditor->GetEditorWo ...
- Unity中实现网格轮廓效果,选中边框效果
问题背景: 最近要实现选中实体的高亮效果,要那种类似于unity中Outline的效果,网格轮廓高亮效果. 效果图: 具体代码: OutlineEffect.cs 实体高亮效果类: 轮廓边总控制类,该 ...
- 添加Google网络地图功能
在MeteoInfo中添加了Google网络地图功能.打开MeteoInfo软件,选中图层管理区的一个Map Frame(New Map Frame),点击鼠标右键,在弹出菜单中点击Add Web L ...
- 解读Unity中的CG编写Shader系列七(不透明度与混合)
转自http://www.itnose.net/detail/6098539.html 1.不透明度 当我们要将两个半透的纹理贴图到一个材质球上的时候就遇到混合的问题,由于前面的知识我们已经知道了片段 ...
随机推荐
- SQL Server判断某个字段是否包含中文/英文字符/数字
原文:SQL Server判断某个字段是否包含中文/英文字符/数字 因最近在清理系统中的脏数据,需要查询某个字段是否包含中文/英文字符/数字的数据, 比较简单,仅以此篇博客做一个简单总结,方便以后查阅 ...
- 咏南3层数据集控件--TYNDataSet
咏南3层数据集控件--TYNDataSet 和2层CS数据集的语法非常近似.有了这个控件,学习掌握3层开发变得如此地简单. 新增数据: procedure Tfunit.btnappendClick( ...
- 【微信】1.微信小程序开发--入门
开始开发微信小程序咯!! ============================= 1.找到官网API地址 https://developers.weixin.qq.com/miniprogram/ ...
- Go -- 在Go语言中使用JSON struct
Encode 将一个对象编码成JSON数据,接受一个interface{}对象,返回[]byte和error: func Marshal(v interface{}) ([]byte, error) ...
- SpringBoot 框架整合webservice
spring boot集成web service框架 题记: 本篇博客讲的spring boot如何集成 spring web service,如果您想用Apache CXF集成,那么可能不适合您.为 ...
- hdoj 1159最长公共子序列
/*Common Subsequence A subsequence of a given sequence is the given sequence with some elements ( ...
- C# 窗体位置 Show和ShowDialog (转载)
CenterParent 窗体在其父窗体中居中. CenterScreen 窗体在当前显示窗口中居中,其尺寸在 ...
- log4j教程 3、架构
Log4j API设计为分层结构,其中每一层提供了不同的对象,对象执行不同的任务.这使得设计灵活,根据将来需要来扩展. 有两种类型可用在Log4j的框架对象. 核心对象: 框架的强制对象和框架的使用. ...
- java gc log
java full gc 经常带来延迟, 导致性能问题 如下命令使java虚拟机记录gc的log到文件, 帮助分析定位问题. java -Xloggc:./a.log -jar a.jar // ...
- react native使用 mobx , can't find variable:Symbol
原因是因为 mobx的版本用的最新版本..用到了 Symbol部分es6的api特性. 解决问题办法 1. 把mobx降版本到 4.3.1 . mobx-react降版本到 5.1.0 即可. 或者 ...