Unity shader(CG) 写一个海浪纹理多种效果
1。unity shader 这个东西,它给我们简化了许多的写shader的节奏,
2。unity 基于左手世界坐标系,给人的感觉还是蛮可以的样子,
3。也有许多的人士对UV这个东西一直敏感,比如一直理解的UV是0-1,有时候uv又可以无限大,其实uv
4.这鸡巴编辑器把3.处后面的文字弄不在了,好烦。。。
看一下浪纹的效果
- 简单的浪纹移动
看起冒似一种投影纹理,你在猜猜 !!!(猜了在说) 简单的浪纹亮度调节
这个嘛就更好说了,第一个都实现了,你又试试!再猜猜看!!!简单的浪纹密度调节
哦。。。没有搞混了,在继续想想有什么方法能产生同样的效果。。。简单的主纹理灰彩调节
看到这里,会写shader的同学就快赶紧动手吧!!!(猜猜完了,就开始把自己的方法写出来)shader的感觉
差不多吧,见过我的同志都这么形容,这个世界都被你用shader形容了。
shader是一种美丽的语言,有的人觉得shader是一坨复杂的数学公式,有的人觉得它是枯燥的rgba,xyzw,stpq,而有人觉得shader就是一种生活……….
它的代码
- 世界坐标uv的应用
可以看出,我之前应用了许多方法,而最后我觉得,如果要达到同样的效果,性能更优,方法更简单,岂不是很有效益而不是什么显示什么复杂水平。
于是我直接采用世界坐标的xz,当然你要先让物体转换到世界坐标中来。 浪纹亮度
这种假光照不叫技术,这是一种享受算法,ou.nDir为法线。
可以看出,之前用if语句来者!可想而知if语句是多么的耗能,于是用lerp获得浪纹洒在皮肤上的渐变,同时又能起到那个浪纹亮度的效果。主纹理灰色到彩色的渐变实现
主纹理,这这。。。
彩色变灰色。。
有同学说,取取rgb的平均值就行了,其实我觉得Luminance最好,应为它是对亮度进行合理算法,在unity UnityCG.cginc 中有这个函数,非常科学,对于色盲来说他对亮度和灰度就敏感了。(有群主想歪了,哈哈哈,程序没美工颜色好,no!no!no!)
哎哟,这这,,一个lerp搞定,灰色与彩色一步搞定。- 至于那个叫什么浪纹密度
方法太水了,我怕贴出来笑话了。
一坨毫无修饰的代码
//shayu shader by qq834144373 提供
//技术编写 by qq834144373
//更多详情,请联系 qq834144373
Shader "Custom/shayu" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_R1 ("灰彩渐变", Range(0.0, 1.1)) = 0
_Texure ("光影纹理", 2D) = "white" {}
_R ("浪纹亮度", Range(.0, 4.0)) = 1.
_R0 ("浪纹密度", float) = 1.
_Color ("光影颜色", Color) = (1.0, 1.0, 1.0, 1.0)
}
SubShader {
Tags { "RenderType"="Opaque" }//"Queue"="Overlay"
LOD 200
Pass{
ZWrite On Blend Off AlphaTest Off Lighting Off
CGPROGRAM
// Upgrade NOTE: excluded shader from qq834144373, twitter@834144373Zhu because you should call me here.
//#pragma exclude_renderers d3d11 xbox360 gles flash all the terget!!!!
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
fixed _R1;
sampler2D _Texure;
half _R;
half _R0;
fixed4 _Color;
half4 _MainTex_ST;
half4 _Texure_ST;
//float4x4 _Object2Light;
struct vertIN{
float4 vertex : POSITION;
fixed2 tex : TEXCOORD0;
fixed3 normal : NORMAL;
};
struct vertOUT{
float4 pos : SV_POSITION;
//half4 ver : TEXCOORD1;
fixed4 uv : TEXCOORD0;
fixed3 nDir : NORMAL;
fixed3 lDir : TEXCOORD2;
//fixed2 screenUV : TEXCOORD3;
};
vertOUT vert(vertIN i){
vertOUT o;
o.pos = mul(UNITY_MATRIX_MVP,i.vertex);
//float4x4 m = float4x4(float4(_Object2World[0]),float4(_Object2World[1]),float4(_Object2World[2]),float4(_Object2World[3]));
//o.ver = mul(m,i.vertex);
//half4 v = half4(i.vertex.x,i.vertex.z,-i.vertex.y,i.vertex.w);
float4 ver = mul(_Object2World,i.vertex);
//half4x4 m = float4x4(half4(UNITY_MATRIX_P[0]),half4(UNITY_MATRIX_P[1]),half4(UNITY_MATRIX_P[2]),half4(UNITY_MATRIX_P[3]));
//ver = mul(m,ver);
//ver = ver*2. - 1.;
//o.ver = mul(UNITY_MATRIX_P,o.ver);
//o.ver.xy = float2(o.ver.x, o.ver.y*_ProjectionParams.x) + o.ver.w;
//ver.xz = ver.xz/1;
ver.xz = ver.xz/ver.y;
o.uv.rg = TRANSFORM_TEX(i.tex,_MainTex);
o.uv.ba = TRANSFORM_TEX(ver.xz,_Texure);
o.nDir = normalize(mul(_World2Object,i.normal));
o.lDir = normalize(WorldSpaceLightDir(i.vertex));
return o;
}
fixed4 frag(vertOUT ou):SV_target{
fixed4 c0 = tex2D(_MainTex,ou.uv.rg);
fixed3 c1 = Luminance(c0.rgb);
fixed diff = max(0,dot(fixed3(0,1,0),ou.nDir));
fixed4 c =tex2D(_Texure,ou.uv.zw*_R0+sin(_Time.x))*_Color*c0;
//if(diff<-0.1){
// c.rgb = 0;
//}
c.rgb *= lerp(0.,_R,diff);
c0.rgb = lerp(c1,c0.rgb,_R1);
return c + c0;//*diff ;
}
ENDCG
}
}
FallBack "代码归qq834144373所有"
}
- 怎么会是这样子啊,这个代码一贴感觉一坨翔
- 所以坚决的放图放图
shader = 世界 + 想象力 + 感觉
写shader是一种美好的而又享受的事情,当你发现这个世界都可以用shader写时,那么你永远不会感觉shader的枯燥。。。。