Unity3D ShaderLab 使用渐变纹理着色
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 使用渐变纹理着色的更多相关文章
- Unity3D ShaderLab压缩混合纹理贴图
Unity3D ShaderLab压缩混合纹理贴图 纹理可以用于存储大量的数据,我们可以把多个图像打包存储在单一的RGBA纹理上,然后通过着色器代码提取这些元素, 我们就可以使用每个图片的RGBA通道 ...
- Unity3D ShaderLab BRDF模拟
Unity3D ShaderLab BRDF模拟 在上一篇,说到了使用渐变纹理着色,使用一个值来控制纹理的uv坐标,但是这也就表示我们只能得到一个线性的光照效果. 那么我们能不能通过观察方向的向量结合 ...
- Unity3D ShaderLab 模拟纹理运动
Unity3D ShaderLab 模拟纹理运动 这一篇,我们要说到着色器上的uv贴图的滚动效果,这样的场景可以用在河流,瀑布,熔岩等效果.算是创建纹理动画的基础技术之一. 所以 准备一个新的着色器文 ...
- Unity3D ShaderLab 透明裁剪着色器
Unity3D ShaderLab 透明裁剪着色器 上一篇,我们介绍了使用Alpha实现透明的手法,其实Unity为我们的#pragma提供了另一种参数,是我们能做出更高效 简单的透明效果,也就是裁剪 ...
- Unity3D ShaderLab 布料着色器
Unity3D ShaderLab布料着色器 布料着色器是我们在虚拟现实中经常使用的着色器.本篇就来完成一个较为简单的布料着色器. 新建Shader,Material,InteractiveCloth ...
- Unity3D ShaderLab 静态贴图光照模型
Unity3D ShaderLab 静态贴图光照模型 其实在unity的光照模型中,我们可以把光照讯息烘培进入一个2D贴图,来实现着色器的光照效果. 下面是在unity中关闭灯光和打开灯光的对比效果. ...
- Unity3D ShaderLab 简单的立方体图反射
Unity3D ShaderLab 简单的立方体图反射 反射是着色器模拟现实环境的一个关键因素,它能使我们的着色器渲染效果更加具备视觉冲击,因为他利用了我们周围的环境, 让着色器反射外界的场景信息并将 ...
- Unity3D ShaderLab 使用贴图对模型的高光进行遮罩
Unity3D ShaderLab 使用贴图对模型的高光进行遮罩 前面研究了高光效果的实现,再说说现很多游戏用到的高光贴图技术,因为它可以让3D美工更容易控制最终的视觉效果. 这也就为我们提供了另外的 ...
- Unity3D ShaderLab 模拟精灵动画
Unity3D ShaderLab 模拟精灵动画 在上一篇,介绍了通过Shader 模拟纹理运动,那么更深一步讲,我们也可以把帧动画的精灵纹理运动通过shader实现. 虽然大家都是在游戏脚本中做更高 ...
随机推荐
- SAP本地文件策略(导EXCEL选择拒绝后处理)
导出EXCEL意外选择了拒绝+记住选择,这样的话在本地电脑就导不出文件了,如下图: 解决办法有2个: 1,修改导出文件的本地策略 :Alt+F12 ->选项->安全性->安全设置-& ...
- Mahout推荐算法基础
转载自(http://www.geek521.com/?p=1423) Mahout推荐算法分为以下几大类 GenericUserBasedRecommender 算法: 1.基于用户的相似度 2.相 ...
- urlencode在url中的作用
urlencode编码能解决特殊字符的传输问题. 使用urlencode主要用于正常识别输入的汉字.空格以及其他特殊字符. 列如: 一产品名称为A&T Plastic,在产品列表中就产生了这样 ...
- BZOJ4033 [HAOI2015]T1
令$f[p][i]$表示以$p$为根的子树内,选了$i$个黑点,剩下的都是白点的这个子树内贡献的答案 如果$p$的子树都算出来了,只要计算$p$与$fa[p]$之间的边对答案的贡献就好了,贡献是$di ...
- MongoDB Replica Set 选举过程
Replica Set 选举过程 心跳检测 假设我们有三个节点的replica sets:X,Y和Z节点.在replica sets结构中,这三个节点每2秒会各自向其它两个节点发送一个心跳检测请求.比 ...
- MyEclipse8.6 破解以及注册码
建立JAVA工程文件.将以下Java代码拷贝至类中并执行即可. 注册码: register name: bobo9360013 Serial:oLR8ZC-855550-6065705698041 ...
- qml 相关的博客
http://qt-project.org/wiki/SpaceAppsChallengeResources http://www.ics.com/blog https://www.ics.com/d ...
- 佳佳的魔法药水 (vijos 1285)
题目大意: 给出N种药水的价格,然后给出一些形如A B C 的关系,表示 A药水+B药水 可以组合出 C药水(保证 A+B 不会得到多种药水). 要求得到1号药水的最少花费和相应的方案数. N< ...
- 一模 (5) day1
第一题: 题目大意:求出1-10^n 这些数中,包含数字3的有多少个. n<=1000: 解题过程: 1.这题一看就是高精度+递推..如果n=1000,那么假设个位是3,其他999位任意..那么 ...
- C# JavaScriptSerializer 解析Json数据(多方法解析Json 三)
准备工作: 1.添加引用System.Web.Extensions, 2..net3.5+版本都有,如果VS2010找不到,在这个文件夹找:C:\Program Files\Reference Ass ...