Unity3D ShaderLab 使用渐变纹理着色

在我们编写着色器的过程中,还可以通过渐变纹理来控制漫反射的光照颜色。这种做法同样在VALVE的军团要塞2中及其流行。

前期,请准备一个渐变色的图片。再把我们之前的Hlf Lambert的代码稍加修改。

1:Properties添加GUI上的图片纹理属性>_RampTex ("Ramp Texture", 2D) = ""

2:在SubShader中申明图片纹理>sampler2D _RampTex;

3:光照模型函数修改>

inline float4 LightingHalfLessDiffuse(SurfaceOutput s,fixed3 lightDir,fixed atten){

float difLight = max(,dot(s.Normal,lightDir));

float halfLight=difLight*0.5+0.5;

float3 ramp = tex2D(_RampTex, float2(,halfLight)).rgb;

float4 col;

col.rgb = s.Albedo * _LightColor0.rgb*(ramp);

col.a=s.Alpha;

return col;

}

从上面可以看出,主要就是多了float3 ramp = tex2D(_RampTex, float2(0,halfLight)).rgb;

这一行代码,利用图片计算rgb。最终效果如下,_EmissiveColor,_AmbientColor都是白色哦,结果确实不一样的:

总结看来,关键的tex2D().rgb就是返回了有一个float3的颜色集,这些颜色自然也就是通过tex2D的cg函数获得的,txe2D函数有2个参数,第一个是我们使用的纹理对象,第二个参数是映射纹理的uv坐标。

这时候我们需要的是使用漫反射浮点值来映射到渐变图上的某一个颜色值,最终根据灯光计算后的方向来映射整个渐变纹理到物体表面。所以我们就传入了上面计算获得的halfLight,将它计算为float2类型的纹理像素索引值。

最终的代码如下:

code start---------------------------------------------

Shader "91YGame/BasicMyHalfLessDiffuse" {
Properties {
_EmissiveColor("Emissive Color",Color) = (,,,)
_AmbientColor("Ambient Color",Color)=(,,,)
_MySliderValue("Slider Value",Range(,))=1.3
_RampTex ("Ramp Texture", 2D) = ""
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD CGPROGRAM
//#pragma surface surf Lambert
#pragma surface surf HalfLessDiffuse float4 _EmissiveColor;
float4 _AmbientColor;
float _MySliderValue;
sampler2D _RampTex; struct Input {
float2 uv_MainTex;
}; void surf (Input IN, inout SurfaceOutput o) {
float4 c;
c=pow((_EmissiveColor+_AmbientColor),_MySliderValue);
o.Albedo = c.rgb;
o.Alpha = c.a;
} inline float4 LightingHalfLessDiffuse(SurfaceOutput s,fixed3 lightDir,fixed atten){
float difLight = max(,dot(s.Normal,lightDir));
float halfLight=difLight*0.5+0.5;
float3 ramp = tex2D(_RampTex, float2(,halfLight)).rgb; float4 col;
col.rgb = s.Albedo * _LightColor0.rgb*(ramp);
col.a=s.Alpha;
return col;
}
ENDCG
}
FallBack "Diffuse"
}

code end-----------------------------------------------

Unity3D ShaderLab 使用渐变纹理着色的更多相关文章

  1. Unity3D ShaderLab压缩混合纹理贴图

    Unity3D ShaderLab压缩混合纹理贴图 纹理可以用于存储大量的数据,我们可以把多个图像打包存储在单一的RGBA纹理上,然后通过着色器代码提取这些元素, 我们就可以使用每个图片的RGBA通道 ...

  2. Unity3D ShaderLab BRDF模拟

    Unity3D ShaderLab BRDF模拟 在上一篇,说到了使用渐变纹理着色,使用一个值来控制纹理的uv坐标,但是这也就表示我们只能得到一个线性的光照效果. 那么我们能不能通过观察方向的向量结合 ...

  3. Unity3D ShaderLab 模拟纹理运动

    Unity3D ShaderLab 模拟纹理运动 这一篇,我们要说到着色器上的uv贴图的滚动效果,这样的场景可以用在河流,瀑布,熔岩等效果.算是创建纹理动画的基础技术之一. 所以 准备一个新的着色器文 ...

  4. Unity3D ShaderLab 透明裁剪着色器

    Unity3D ShaderLab 透明裁剪着色器 上一篇,我们介绍了使用Alpha实现透明的手法,其实Unity为我们的#pragma提供了另一种参数,是我们能做出更高效 简单的透明效果,也就是裁剪 ...

  5. Unity3D ShaderLab 布料着色器

    Unity3D ShaderLab布料着色器 布料着色器是我们在虚拟现实中经常使用的着色器.本篇就来完成一个较为简单的布料着色器. 新建Shader,Material,InteractiveCloth ...

  6. Unity3D ShaderLab 静态贴图光照模型

    Unity3D ShaderLab 静态贴图光照模型 其实在unity的光照模型中,我们可以把光照讯息烘培进入一个2D贴图,来实现着色器的光照效果. 下面是在unity中关闭灯光和打开灯光的对比效果. ...

  7. Unity3D ShaderLab 简单的立方体图反射

    Unity3D ShaderLab 简单的立方体图反射 反射是着色器模拟现实环境的一个关键因素,它能使我们的着色器渲染效果更加具备视觉冲击,因为他利用了我们周围的环境, 让着色器反射外界的场景信息并将 ...

  8. Unity3D ShaderLab 使用贴图对模型的高光进行遮罩

    Unity3D ShaderLab 使用贴图对模型的高光进行遮罩 前面研究了高光效果的实现,再说说现很多游戏用到的高光贴图技术,因为它可以让3D美工更容易控制最终的视觉效果. 这也就为我们提供了另外的 ...

  9. Unity3D ShaderLab 模拟精灵动画

    Unity3D ShaderLab 模拟精灵动画 在上一篇,介绍了通过Shader 模拟纹理运动,那么更深一步讲,我们也可以把帧动画的精灵纹理运动通过shader实现. 虽然大家都是在游戏脚本中做更高 ...

随机推荐

  1. java中将一个字符数组赋值给另一个,两者同时变化

    java中将一个字符数组赋值给另一个,两者的变化怎么是同步的?怎么才能让他们独立开? 比如有一个int[][] a 已经存在值,现在定义int[][] b=a;之后改变a的值,为何b也跟着改变?怎么才 ...

  2. 使用cnblogs.com的用户体验和提出来的建议

    1.是否提供良好的体验给用户(同时提供价值)? 我是很久以前就有CN的账号了的,因为这个网站有很多有用的信息,和比较活跃的论坛.很多不懂的问题可以求助上面的大神.但是,我第一次登陆主页面的时候我是懵逼 ...

  3. 分形树Fractal tree介绍——具体如何结合TokuDB还没有太懂,先记住其和LSM都是一样的适合写密集

    在目前的Mysql数据库中,使用最广泛的是innodb存储引擎.innodb确实是个很不错的存储引擎,就连高性能Mysql里都说了,如果不是有什么很特别的要求,innodb就是最好的选择.当然,这偏文 ...

  4. C#获取相对路径的方法

    这八种C#获取相对路径的方法,包括获取和设置当前目录的完全限定路径.获取启动了应用程序的可执行文件的路径,不包括可执行文件的名称等等内容. C#获取相对路径1. 获取和设置当前目录的完全限定路径.   ...

  5. asp.net core StaticFiles中间件修改wwwroot

    new StaticFileOptions() { FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentD ...

  6. 在Web中如何使用Windows控件(ActiveX)[转]

    最近做的一个Web项目,需要在网页中播放摄像头采集的实时视频,我们已经有了播放视频的使用C#编写的windows控件,如何将其嵌入到网页中去了?这需要使用一种古老的技术,ActiveX. 1.将.Ne ...

  7. curl,chkconfig

    1. Linux系统服务管理 工具ntsysv 类似图形界面管理工具,如果没有该命令使用 yum install -y ntsysv 安装 常用服务:crond, iptables, network, ...

  8. IISExpress配置文件的一个坑

    现象: 昨天在处理PBS系统问题的时候意外发现两个js错误(而同样的代码在同事机器上都没有问题),如下图. 图1 图2 图3 原因分析: 初步看起来是因为页面上没有id为'form1'的form和id ...

  9. C语言中 scanf 和 printf 的小要点

    1 scanf_s需指定%c 个数 h short l long关键字 * 不赋给任何值 W 指定读入宽度 转换字符 a 读浮点值(c99) A 读浮点值(c99) c 读单字符 d 读十进制数 i ...

  10. HDU 4906 Our happy ending(2014 Multi-University Training Contest 4)

    题意:构造出n个数 这n个数取值范围0-L,这n个数中存在取一些数之和等于k,则这样称为一种方法.给定n,k,L,求方案数. 思路:装压 每位 第1为表示这种方案能不能构成1(1表示能0表示不能)   ...