Unity3D ShaderLab压缩混合纹理贴图
Unity3D ShaderLab压缩混合纹理贴图
纹理可以用于存储大量的数据,我们可以把多个图像打包存储在单一的RGBA纹理上,然后通过着色器代码提取这些元素,
我们就可以使用每个图片的RGBA通道的讯息作为一个独立的纹理。
这种使用场景特别是在地面的混合着色上有着很明显的优势,下面我们就来说说 怎么构建一个常用的四纹理混合着色器。
那么请县创建一个shader和材质球吧。下面我们直接开始:
1,修改Properties
{
//设置GUI;
_MainTint("Diffuse Tint",Color)=(,,,)
_ColorA("Terrain Color A",Color)=(,,,)
_ColorB("Terrain Color B",Color)=(,,,)
_RTexture("Red Channel Texture",2D)=""
_GTexture("Green Channel Texture",2D)=""
_BTexture("Blue Channel Texture",2D)=""
_ATexture("Alpha Channel Texture",2D)=""
_BlendTexture("Blend Texture",2D)=""
}
2,SubShader申明变量
#pragma surface surf Lambert //变量; float4 _MainTint; float4 _ColorA; float4 _ColorB; sampler2D _RTexture; sampler2D _GTexture; sampler2D _BTexture; sampler2D _ATexture; sampler2D _BlendTexture;
3,修改Input结构
struct Input {
float2 uv_RTexture;
float2 uv_GTexture;
float2 uv_BTexture;
float2 uv_ATexture;
float2 uv_BlendTexture;
};
4,修改无敌的surf函数
void surf (Input IN, inout SurfaceOutput o) {
//得到纹理讯息;
float4 blendData = tex2D(_BlendTexture,IN.uv_BlendTexture);
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 finalColor;
finalColor = lerp(rTexData,gTexData,blendData.g);
finalColor = lerp(finalColor,bTexData,blendData.b);
finalColor = lerp(finalColor,aTexData,blendData.a);
finalColor.a=;
//计算色调;
float4 terrainLayers = lerp(_ColorA,_ColorB,blendData.r)*;
finalColor *= terrainLayers;
finalColor = saturate(finalColor);
//half4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = finalColor.rgb*_MainTint.rgb;
o.Alpha = finalColor.a;
}
////////////////////////////////////////////////////
以上就是我们的混合纹理Shader全部步骤。
我们在unity中直接看看效果吧。

上面用到了lerp(a,b,f)。如果我们想得到1和2之间的中间值,我们可以将lerp函数的第三个函数赋值为0.5,他将会返回1.5,
这个函数很适合混合纹理,因为在一个RGBA纹理中单个通道的值就是单精度浮点值,通常值范围是0~1之间。
我们将提供的草地纹理 泥土纹理以及混合纹理的红色通道3个值作为lerp函数参数,这样我们得到物体表面每个像素值均为正确的混合颜色。
code start-------------------------------------------------------------------------------
Shader "91YGame/TextureBlend" {
Properties {
//设置GUI;
_MainTint("Diffuse Tint",Color)=(,,,)
_ColorA("Terrain Color A",Color)=(,,,)
_ColorB("Terrain Color B",Color)=(,,,)
_RTexture("Red Channel Texture",2D)=""
_GTexture("Green Channel Texture",2D)=""
_BTexture("Blue Channel Texture",2D)=""
_ATexture("Alpha Channel Texture",2D)=""
_BlendTexture("Blend Texture",2D)=""
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD
CGPROGRAM
#pragma surface surf Lambert
//变量;
float4 _MainTint;
float4 _ColorA;
float4 _ColorB;
sampler2D _RTexture;
sampler2D _GTexture;
sampler2D _BTexture;
sampler2D _ATexture;
sampler2D _BlendTexture;
struct Input {
float2 uv_RTexture;
float2 uv_GTexture;
float2 uv_BTexture;
float2 uv_ATexture;
float2 uv_BlendTexture;
};
void surf (Input IN, inout SurfaceOutput o) {
//得到纹理讯息;
float4 blendData = tex2D(_BlendTexture,IN.uv_BlendTexture);
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 finalColor;
finalColor = lerp(rTexData,gTexData,blendData.g);
finalColor = lerp(finalColor,bTexData,blendData.b);
finalColor = lerp(finalColor,aTexData,blendData.a);
finalColor.a=1.0;
//计算色调;
float4 terrainLayers = lerp(_ColorA,_ColorB,blendData.r)*;
finalColor *= terrainLayers;
finalColor = saturate(finalColor);
//half4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = finalColor.rgb*_MainTint.rgb;
o.Alpha = finalColor.a;
}
ENDCG
}
FallBack "Diffuse"
}
code end--------------------------------------------------------------------------------
Unity3D ShaderLab压缩混合纹理贴图的更多相关文章
- Unity3D ShaderLab 使用渐变纹理着色
Unity3D ShaderLab 使用渐变纹理着色 在我们编写着色器的过程中,还可以通过渐变纹理来控制漫反射的光照颜色.这种做法同样在VALVE的军团要塞2中及其流行. 前期,请准备一个渐变色的图片 ...
- Unity3D ShaderLab 静态贴图光照模型
Unity3D ShaderLab 静态贴图光照模型 其实在unity的光照模型中,我们可以把光照讯息烘培进入一个2D贴图,来实现着色器的光照效果. 下面是在unity中关闭灯光和打开灯光的对比效果. ...
- Unity3D ShaderLab 立方体图的反射遮罩
Unity3D ShaderLab 立方体图的反射遮罩 上一篇,简单的介绍了立方体图的反射,那么我们能不能使用一张纹理对其进行指定遮罩呢?这样美工可以更好的控制图像的效果. 我们接着使用上一篇的sha ...
- Unity3D ShaderLab 简单的立方体图反射
Unity3D ShaderLab 简单的立方体图反射 反射是着色器模拟现实环境的一个关键因素,它能使我们的着色器渲染效果更加具备视觉冲击,因为他利用了我们周围的环境, 让着色器反射外界的场景信息并将 ...
- Unity3D ShaderLab 使用贴图对模型的高光进行遮罩
Unity3D ShaderLab 使用贴图对模型的高光进行遮罩 前面研究了高光效果的实现,再说说现很多游戏用到的高光贴图技术,因为它可以让3D美工更容易控制最终的视觉效果. 这也就为我们提供了另外的 ...
- Unity3D ShaderLab 模拟纹理运动
Unity3D ShaderLab 模拟纹理运动 这一篇,我们要说到着色器上的uv贴图的滚动效果,这样的场景可以用在河流,瀑布,熔岩等效果.算是创建纹理动画的基础技术之一. 所以 准备一个新的着色器文 ...
- Unity3D ShaderLab 立方体图的菲涅尔反射
Unity3D ShaderLab 立方体图的菲涅尔反射 菲涅尔反射是反射类型中比较常见的一种类型,当我们的视线正对物体表面,那么反射量会明显增加, 我们几乎可以在任何支持反射类型的物体表面看到这种情 ...
- Unity3D ShaderLab立方体图的法线渲染
Unity3D ShaderLab立方体图的法线渲染 某些情况下,我们希望立方体图的材质球上产生法线效果,来更多的表现细节,比如菱形花纹的玻璃,冰块的表面. 在帧数的协调下,我们可以通过input结构 ...
- Unity3D ShaderLab法线贴图
Unity3D ShaderLab法线贴图 说到法线贴图,应该算是我们最常使用的一种增强视觉效果的贴图.将法线贴图的各个像素点座位模型的法线,这样我们的光照可以模拟出高分辨率的效果, 同时也保持较低的 ...
随机推荐
- iOS的常见文件及程序的启动原理
一. iOS中常见文件 (一). Xcode6之前 创建项目,默认可以看见一个存放框架的文件夹 info文件以工程文件名开头,如:第一个项目-Info.plist 项目中默认有一个PCH文件 (二). ...
- Java 之 I/O 系列 01 ——基础
Java 之 I/O 系列 目录 Java 之 I/O 系列 01 ——基础 Java 之 I/O 系列 02 ——序列化(一) Java 之 I/O 系列 02 ——序列化(二) 整理<疯狂j ...
- 51nod 1065 最小正子段和
题目链接:51nod 1065 最小正子段和 房教说用前缀和做,然后看了别人博客懂了后就感觉,这个真有意思... #include<cstdio> #include<cstring& ...
- CentOS 常用命令大全(2)
系统 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinf ...
- 统计sql语句执行效率
--统计sql语句执行效率SELECT (total_elapsed_time / execution_count)/1000 N'平均时间ms' ,total_elapsed_time/1000 N ...
- 分析与提取QQ木马盗号技术
程序大致的流程如下图: 因为是用画图工具画的,所以大家就将就看下把,有什么不对的地方请多多指教: 程序是用Delphi写的,只有加载器加了个upx壳,其他的都没有加壳:所以分析起来就比较简单了: 这个 ...
- 主机无法访问虚拟机上的elasticsearch服务器
问题: es在linux上搭建好,通过curl -XGET ip:port可以获得服务器信息展示,但是主机在浏览器上无法访问. 原因: 主机通过telnet访问linux的80端口,发现是不通的.可以 ...
- Mondriaan的梦(状态压缩dp)
题目原题可以看POJ2411,大意是给出m*n的矩形,要用2*1的矩形将它铺满(不能讲一个矩形铺在另外一个上面),求方案数,并且只要不是完全相同的就算不同的方案,也就是对称算不同的方案. F[i][s ...
- 第46套题【STL】【贪心】【递推】【BFS 图】
已经有四套题没有写博客了.今天改的比较快,就有时间写.今天这套题是用的图片的形式,传上来不好看,就自己描述吧. 第一题:单词分类 题目大意:有n个单词(n<=10000),如果两个单词中每个字母 ...
- Problem C 链表
Description 某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报 ...