谁能帮我按要求做一个简单的Unity 水面效果Shader

今天看啥 热点:
Unity shader(CG) 写一个海浪纹理多种效果,unityshader
Unity shader(CG) 写一个海浪纹理多种效果
1。unity shader 这个东西,它给我们简化了许多的写shader的节奏,
2。unity 基于左手世界坐标系,给人的感觉还是蛮可以的样子,
3。也有许多的人士对UV这个东西一直敏感,比如一直理解的UV是0-1,有时候uv又可以无限大,其实uv
4.这鸡巴编辑器把3.处后面的文字弄不在了,好烦。。。
看一下浪纹的效果
一坨毫无修饰的代码
//shayu shader by qq 提供
//技术编写 by qq
//更多详情,请联系 qq
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"
ZWrite On Blend Off AlphaTest Off Lighting Off
// Upgrade NOTE: excluded shader from qq, twitter@Zhu 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
sampler2D _Texure
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){
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))
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 *= lerp(0.,_R,diff)
c0.rgb = lerp(c1,c0.rgb,_R1)
return c + c0
FallBack "代码归qq所有"
shader = 世界 + 想象力 + 感觉
写shader是一种美好的而又享受的事情,当你发现这个世界都可以用shader写时,那么你永远不会感觉shader的枯燥。。。。
相关搜索:
相关阅读:
相关频道:
Android教程最近更新下次自动登录
现在的位置:
& 综合 & 正文
Unity-水面效果的shader文件
[javascript]
Shader "FX/Water" {
Properties {
_WaveScale ("Wave scale", Range (0.02,0.15)) = 0.063
_ReflDistort ("Reflection distort", Range (0,1.5)) = 0.44
_RefrDistort ("Refraction distort", Range (0,1.5)) = 0.40
_RefrColor ("Refraction color", COLOR) = ( .34, .85, .92, 1)
_Fresnel ("Fresnel (A) ", 2D) = "gray" {}
_BumpMap ("Bumpmap (RGB) ", 2D) = "bump" {}
WaveSpeed ("Wave speed (map1 x,y; map2 x,y)", Vector) = (19,9,-16,-7)
_ReflectiveColor ("Reflective color (RGB) fresnel (A) ", 2D) = "" {}
_ReflectiveColorCube ("Reflective color cube (RGB) fresnel (A)", Cube) = "" { TexGen CubeReflect }
_HorizonColor ("Simple water horizon color", COLOR) = ( .172, .463, .435, 1)
_MainTex ("Fallback texture", 2D) = "" {}
_ReflectionTex ("Internal Reflection", 2D) = "" {}
_RefractionTex ("Internal Refraction", 2D) = "" {}
Subshader {
Tags { "WaterMode"="Refractive" "RenderType"="Opaque" }
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#pragma fragmentoption ARB_fog_exp2
#pragma multi_compile WATER_REFRACTIVE WATER_REFLECTIVE WATER_SIMPLE
#if defined WATER_REFLECTIVE || defined WATER_REFRACTIVE
#define HAS_REFLECTION 1
#if defined WATER_REFRACTIVE
#define HAS_REFRACTION 1
#include "UnityCG.cginc"
uniform float4 _WaveScale4;
uniform float4 _WaveO
#ifdef HAS_REFLECTION
uniform float _ReflD
#ifdef HAS_REFRACTION
uniform float _RefrD
struct appdata {
float4 vertex : POSITION;
float3 normal : NORMAL;
struct v2f {
V2F_POS_FOG;
#if defined HAS_REFLECTION || defined HAS_REFRACTION
float2 bumpuv[2];
float3 viewD
v2f vert(appdata v)
PositionFog( v.vertex, o.pos, o.fog );
temp.xyzw = v.vertex.xzxz * _WaveScale4 + _WaveO
o.bumpuv[0] = temp.
o.bumpuv[1] = temp.
o.viewDir.xzy = ObjSpaceViewDir(v.vertex);
#if defined HAS_REFLECTION || defined HAS_REFRACTION
float3x4 mat = float3x4 (
0.5, 0, 0, 0.5,
0, 0.5 * _ProjectionParams.x, 0, 0.5,
0, 0, 0, 1
o.ref = mul (mat, o.pos);
#if defined WATER_REFLECTIVE || defined WATER_REFRACTIVE
sampler2D _ReflectionT
#if defined WATER_REFLECTIVE || defined WATER_SIMPLE
sampler2D _ReflectiveC
#if defined WATER_REFRACTIVE
sampler2D _F
sampler2D _RefractionT
uniform float4 _RefrC
#if defined WATER_SIMPLE
uniform float4 _HorizonC
sampler2D _BumpM
half4 frag( v2f i ) : COLOR
i.viewDir = normalize(i.viewDir);
half3 bump1 = tex2D( _BumpMap, i.bumpuv[0] ).
half3 bump2 = tex2D( _BumpMap, i.bumpuv[1] ).
half3 bump = bump1 + bump2 - 1;
half fresnelFac = dot( i.viewDir, bump );
#ifdef HAS_REFLECTION
float3 uv1 = i. uv1.xy += bump * _ReflD
half4 refl = tex2Dproj( _ReflectionTex, uv1 );
#ifdef HAS_REFRACTION
float3 uv2 = i. uv2.xy -= bump * _RefrD
half4 refr = tex2Dproj( _RefractionTex, uv2 ) * _RefrC
#ifdef WATER_REFRACTIVE
half fresnel = tex2D( _Fresnel, float2(fresnelFac,fresnelFac) ).a;
color = lerp( refr, refl, fresnel );
#ifdef WATER_REFLECTIVE
half4 water = tex2D( _ReflectiveColor, float2(fresnelFac,fresnelFac) );
color.rgb = lerp( water.rgb, refl.rgb, water.a );
color.a = refl.a * water.a;
#ifdef WATER_SIMPLE
half4 water = tex2D( _ReflectiveColor, float2(fresnelFac,fresnelFac) );
color.rgb = lerp( water.rgb, _HorizonColor.rgb, water.a );
color.a = _HorizonColor.a;
Subshader {
Tags { "WaterMode"="Reflective" "RenderType"="Opaque" }
#pragma vertex vert
#include "UnityCG.cginc"
uniform float4 _WaveScale4;
uniform float4 _WaveO
uniform float _ReflD
struct appdata {
float4 vertex : POSITION;
float3 normal : NORMAL;
struct v2f {
V2F_POS_FOG;
float2 bumpuv[2] : TEXCOORD0;
float3 viewDir : TEXCOORD2;
float4 ref : TEXCOORD3;
v2f vert(appdata v)
PositionFog( v.vertex, o.pos, o.fog );
temp.xyzw = v.vertex.xzxz * _WaveScale4 + _WaveO
o.bumpuv[0] = temp.
o.bumpuv[1] = temp.
o.viewDir.xzy = normalize( ObjSpaceViewDir(v.vertex) );
float4x4 mat = float4x4 (
.5, 0, 0,.5,
0,.5 * _ProjectionParams.x, 0,.5,
0, 0,.5,.5,
0, 0, 0, 1
o.ref = mul (mat, o.pos);
Program "" {
SubProgram {
Keywords { "WATER_REFLECTIVE" "WATER_REFRACTIVE" }
SetTexture [_BumpMap] { 2D }
SetTexture [_BumpMap] { 2D }
SetTexture [_ReflectiveColor] { 2D }
SetTexture [_ReflectionTex] { 2D }
Local 0, ([_ReflDistort],0,0,0)
"!!ATIfs1.0
CONSTANT c0 = program.local[0];
StartPrelimP
PassTexCoord r3, t3.stq_ # reflection vector
SampleMap r0, t0. # bump1
SampleMap r1, t1. # bump2
PassTexCoord r2, t2.
ADD r1.half, r0.bias, r1. # bump = bump1 + bump2 - 1
DOT3 r2, r1.2x, r2;
# fresnel: dot (bump, viewer-pos)
# add less offset because it' big ones look bad
MAD r3.rg, r1, c0.r, r3;
# uv += bump * add less because it's not perspective
StartOutputP
SampleMap r3, r3.
# reflection color
SampleMap r2, r2.
# water color/fresnel
LERP r0.rgb, r2.a, r3, r2; # between water and reflected based on fresnel
MUL r0.a, r3.a, r2.a;
SubProgram {
Keywords { "WATER_SIMPLE" }
SetTexture [_BumpMap] { 2D }
SetTexture [_BumpMap] { 2D }
SetTexture [_ReflectiveColor] { 2D }
Local 0, [_HorizonColor]
"!!ATIfs1.0
CONSTANT c0 = program.local[0];
StartPrelimP
SampleMap r0, t0.
SampleMap r1, t1.
PassTexCoord r2, t2.
ADD r1, r0.bias, r1. # bump = bump1 + bump2 - 1
DOT3 r2, r1, r2;
# fresnel: dot (bump, viewer-pos)
StartOutputP
SampleMap r2, r2.
LERP r0.rgb, r2.a, c0, r2; # fade in reflection
MOV r0.a, c0.a;
Subshader {
Tags { "WaterMode"="Simple" "RenderType"="Opaque" }
Color (0.5,0.5,0.5,0.5)
SetTexture [_MainTex] {
Matrix [_WaveMatrix]
combine texture * primary
SetTexture [_MainTex] {
Matrix [_WaveMatrix2]
combine texture * primary + previous
SetTexture [_ReflectiveColorCube] {
combine texture +- previous, primary
Matrix [_Reflection]
Subshader {
Tags { "WaterMode"="Simple" "RenderType"="Opaque" }
Color (0.5,0.5,0.5,0.5)
SetTexture [_MainTex] {
Matrix [_WaveMatrix]
combine texture
SetTexture [_ReflectiveColorCube] {
combine texture +- previous, primary
Matrix [_Reflection]
Subshader {
Tags { "WaterMode"="Simple" "RenderType"="Opaque" }
Color (0.5,0.5,0.5,0)
SetTexture [_MainTex] {
Matrix [_WaveMatrix]
combine texture, primary
Shader "FX/Water" {
Properties {
_WaveScale ("Wave scale", Range (0.02,0.15)) = 0.063
_ReflDistort ("Reflection distort", Range (0,1.5)) = 0.44
_RefrDistort ("Refraction distort", Range (0,1.5)) = 0.40
_RefrColor ("Refraction color", COLOR) = ( .34, .85, .92, 1)
_Fresnel ("Fresnel (A) ", 2D) = "gray" {}
_BumpMap ("Bumpmap (RGB) ", 2D) = "bump" {}
WaveSpeed ("Wave speed (map1 x,y; map2 x,y)", Vector) = (19,9,-16,-7)
_ReflectiveColor ("Reflective color (RGB) fresnel (A) ", 2D) = "" {}
_ReflectiveColorCube ("Reflective color cube (RGB) fresnel (A)", Cube) = "" { TexGen CubeReflect }
_HorizonColor ("Simple water horizon color", COLOR) = ( .172, .463, .435, 1)
_MainTex ("Fallback texture", 2D) = "" {}
_ReflectionTex ("Internal Reflection", 2D) = "" {}
_RefractionTex ("Internal Refraction", 2D) = "" {}
// -----------------------------------------------------------
// Fragment program cards
Subshader {
Tags { "WaterMode"="Refractive" "RenderType"="Opaque" }
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#pragma fragmentoption ARB_fog_exp2
#pragma multi_compile WATER_REFRACTIVE WATER_REFLECTIVE WATER_SIMPLE
#if defined WATER_REFLECTIVE || defined WATER_REFRACTIVE
#define HAS_REFLECTION 1
#if defined WATER_REFRACTIVE
#define HAS_REFRACTION 1
#include "UnityCG.cginc"
uniform float4 _WaveScale4;
uniform float4 _WaveO
#ifdef HAS_REFLECTION
uniform float _ReflD
#ifdef HAS_REFRACTION
uniform float _RefrD
struct appdata {
float4 vertex : POSITION;
float3 normal : NORMAL;
struct v2f {
V2F_POS_FOG;
#if defined HAS_REFLECTION || defined HAS_REFRACTION
float2 bumpuv[2];
float3 viewD
v2f vert(appdata v)
PositionFog( v.vertex, o.pos, o.fog );
// scroll bump waves
temp.xyzw = v.vertex.xzxz * _WaveScale4 + _WaveO
o.bumpuv[0] = temp.
o.bumpuv[1] = temp.
// object space view direction (will normalize per pixel)
o.viewDir.xzy = ObjSpaceViewDir(v.vertex);
#if defined HAS_REFLECTION || defined HAS_REFRACTION
// calculate the reflection vector
float3x4 mat = float3x4 (
0.5, 0, 0, 0.5,
0, 0.5 * _ProjectionParams.x, 0, 0.5,
0, 0, 0, 1
o.ref = mul (mat, o.pos);
#if defined WATER_REFLECTIVE || defined WATER_REFRACTIVE
sampler2D _ReflectionT
#if defined WATER_REFLECTIVE || defined WATER_SIMPLE
sampler2D _ReflectiveC
#if defined WATER_REFRACTIVE
sampler2D _F
sampler2D _RefractionT
uniform float4 _RefrC
#if defined WATER_SIMPLE
uniform float4 _HorizonC
sampler2D _BumpM
half4 frag( v2f i ) : COLOR
i.viewDir = normalize(i.viewDir);
// combine two scrolling bumpmaps into one
half3 bump1 = tex2D( _BumpMap, i.bumpuv[0] ).
half3 bump2 = tex2D( _BumpMap, i.bumpuv[1] ).
half3 bump = bump1 + bump2 - 1;
// fresnel factor
half fresnelFac = dot( i.viewDir, bump );
// perturb reflection/refraction UVs by bumpmap, and lookup colors
#ifdef HAS_REFLECTION
float3 uv1 = i. uv1.xy += bump * _ReflD
half4 refl = tex2Dproj( _ReflectionTex, uv1 );
#ifdef HAS_REFRACTION
float3 uv2 = i. uv2.xy -= bump * _RefrD
half4 refr = tex2Dproj( _RefractionTex, uv2 ) * _RefrC
// final color is between refracted and reflected based on fresnel
#ifdef WATER_REFRACTIVE
half fresnel = tex2D( _Fresnel, float2(fresnelFac,fresnelFac) ).a;
color = lerp( refr, refl, fresnel );
#ifdef WATER_REFLECTIVE
half4 water = tex2D( _ReflectiveColor, float2(fresnelFac,fresnelFac) );
color.rgb = lerp( water.rgb, refl.rgb, water.a );
color.a = refl.a * water.a;
#ifdef WATER_SIMPLE
half4 water = tex2D( _ReflectiveColor, float2(fresnelFac,fresnelFac) );
color.rgb = lerp( water.rgb, _HorizonColor.rgb, water.a );
color.a = _HorizonColor.a;
// -----------------------------------------------------------
// Radeon 9000 cards
Subshader {
Tags { "WaterMode"="Reflective" "RenderType"="Opaque" }
#pragma vertex vert
#include "UnityCG.cginc"
uniform float4 _WaveScale4;
uniform float4 _WaveO
uniform float _ReflD
struct appdata {
float4 vertex : POSITION;
float3 normal : NORMAL;
struct v2f {
V2F_POS_FOG;
float2 bumpuv[2] : TEXCOORD0;
float3 viewDir : TEXCOORD2;
float4 ref : TEXCOORD3;
v2f vert(appdata v)
PositionFog( v.vertex, o.pos, o.fog );
// scroll bump waves
temp.xyzw = v.vertex.xzxz * _WaveScale4 + _WaveO
o.bumpuv[0] = temp.
o.bumpuv[1] = temp.
// object space view direction
o.viewDir.xzy = normalize( ObjSpaceViewDir(v.vertex) );
// calculate the reflection vector
float4x4 mat = float4x4 (
.5, 0, 0,.5,
0,.5 * _ProjectionParams.x, 0,.5,
0, 0,.5,.5,
0, 0, 0, 1
o.ref = mul (mat, o.pos);
Program "" {
SubProgram {
Keywords { "WATER_REFLECTIVE" "WATER_REFRACTIVE" }
SetTexture [_BumpMap] { 2D }
SetTexture [_BumpMap] { 2D }
SetTexture [_ReflectiveColor] { 2D }
SetTexture [_ReflectionTex] { 2D }
Local 0, ([_ReflDistort],0,0,0)
"!!ATIfs1.0
CONSTANT c0 = program.local[0];
StartPrelimP
PassTexCoord r3, t3.stq_ # reflection vector
SampleMap r0, t0. # bump1
SampleMap r1, t1. # bump2
PassTexCoord r2, t2.
ADD r1.half, r0.bias, r1. # bump = bump1 + bump2 - 1
DOT3 r2, r1.2x, r2;
# fresnel: dot (bump, viewer-pos)
# add less offset because it' big ones look bad
MAD r3.rg, r1, c0.r, r3;
# uv += bump * add less because it's not perspective
StartOutputP
SampleMap r3, r3.
# reflection color
SampleMap r2, r2.
# water color/fresnel
LERP r0.rgb, r2.a, r3, r2; # between water and reflected based on fresnel
MUL r0.a, r3.a, r2.a;
SubProgram {
Keywords { "WATER_SIMPLE" }
SetTexture [_BumpMap] { 2D }
SetTexture [_BumpMap] { 2D }
SetTexture [_ReflectiveColor] { 2D }
Local 0, [_HorizonColor]
"!!ATIfs1.0
CONSTANT c0 = program.local[0];
StartPrelimP
SampleMap r0, t0.
SampleMap r1, t1.
PassTexCoord r2, t2.
ADD r1, r0.bias, r1. # bump = bump1 + bump2 - 1
DOT3 r2, r1, r2;
# fresnel: dot (bump, viewer-pos)
StartOutputP
SampleMap r2, r2.
LERP r0.rgb, r2.a, c0, r2; # fade in reflection
MOV r0.a, c0.a;
// -----------------------------------------------------------
// Old cards
// three texture, cubemaps
Subshader {
Tags { "WaterMode"="Simple" "RenderType"="Opaque" }
Color (0.5,0.5,0.5,0.5)
SetTexture [_MainTex] {
Matrix [_WaveMatrix]
combine texture * primary
SetTexture [_MainTex] {
Matrix [_WaveMatrix2]
combine texture * primary + previous
SetTexture [_ReflectiveColorCube] {
combine texture +- previous, primary
Matrix [_Reflection]
// dual texture, cubemaps
Subshader {
Tags { "WaterMode"="Simple" "RenderType"="Opaque" }
Color (0.5,0.5,0.5,0.5)
SetTexture [_MainTex] {
Matrix [_WaveMatrix]
combine texture
SetTexture [_ReflectiveColorCube] {
combine texture +- previous, primary
Matrix [_Reflection]
// single texture
Subshader {
Tags { "WaterMode"="Simple" "RenderType"="Opaque" }
Color (0.5,0.5,0.5,0)
SetTexture [_MainTex] {
Matrix [_WaveMatrix]
combine texture, primary
&&&&推荐文章:
【上篇】【下篇】最近经常要给2D游戏写一些新的shader来做特效。比起粒子特效,着色器特效可能更适合UI和2D元素上的表现。
先看一下效果:
关于在shaderlab种实现流光的文章很多,但很少有给UI实现的,并且常常只是Add一层颜色,并没有去表现&光&的效果。
以下是shader全文,后面会介绍一些细节:
1 Shader "UI/Unlit/Flowlight"
Properties
[PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
_Color ("Tint", Color) = (1, 1, 1, 1)
[MaterialToggle] PixelSnap ("Pixel snap", float) = 0
/* Flowlight */
_FlowlightTex ("Add Move Texture", 2D) = "white" {}
_FlowlightColor ("Flowlight Color", Color) = (0, 0, 0, 1)
_Power ("Power", float) = 1
_SpeedX ("SpeedX", float) = 1
_SpeedY ("SpeedY", float) = 0
/* --------- */
_StencilComp ("Stencil Comparison", Float) = 8
_Stencil ("Stencil ID", Float) = 0
_StencilOp ("Stencil Operation", Float) = 0
_StencilWriteMask ("Stencil Write Mask", Float) = 255
_StencilReadMask ("Stencil Read Mask", Float) = 255
"Queue"="Transparent"
"IgnoreProjector"="True"
"RenderType"="Transparent"
"PreviewType"="Plane"
"CanUseSpriteAtlas"="True"
Lighting Off
ZWrite Off
Blend One OneMinusSrcAlpha
Ref [_Stencil]
Comp [_StencilComp]
Pass [_StencilOp]
ReadMask [_StencilReadMask]
WriteMask [_StencilWriteMask]
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile _ PIXELSNAP_ON
#include "UnityCG.cginc"
struct appdata_t
float4 vertex : POSITION;
float4 color : COLOR;
float2 texcoord : TEXCOORD0;
struct v2f
float4 vertex : SV_POSITION;
fixed4 color : COLOR;
half2 texcoord : TEXCOORD0;
/* Flowlight */
half2 texflowlight : TEXCOORD1;
/* --------- */
/* Flowlight */
fixed4 _FlowlightC
sampler2D _FlowlightT
fixed4 _FlowlightTex_ST;
fixed _SpeedX;
fixed _SpeedY;
/* --------- */
v2f vert(appdata_t IN)
OUT.vertex = mul(UNITY_MATRIX_MVP, IN.vertex);
OUT.texcoord = IN.
/* Flowlight */
OUT.texflowlight = TRANSFORM_TEX(IN.texcoord, _FlowlightTex);
OUT.texflowlight.x += _Time * _SpeedX;
OUT.texflowlight.y += _Time * _SpeedY;
/* --------- */
OUT.color = IN.color * _C
#ifdef PIXELSNAP_ON
OUT.vertex = UnityPixelSnap (OUT.vertex);
return OUT;
sampler2D _MainT
fixed4 frag(v2f IN) : SV_Target
fixed4 c = tex2D(_MainTex, IN.texcoord);
/* Flowlight */
fixed4 cadd = tex2D(_FlowlightTex, IN.texflowlight) * _P
cadd.rgb *= c.
c.rgb += cadd.
c.rgb *= c.a;
/* --------- */
其实博文发出来之后这个改过一次,因为是用的Sprite-Default改的,能用在UI上但没有实现遮罩等等功能,这次补上。
/* UI */里的就是添加上的属于UI shader的部分,如果只是用在Sprite上的话这部分可以删掉。
而/* Flowlight */里的是从Sprite-Default基础上添加的部分,去掉之后就变成Sprite-Default原文了(
其实流程和正常的UV滚动叠加没有什么区别,注意要用UI传入的UV计算纹理坐标。
97  OUT.texflow = TRANSFORM_TEX(IN.texcoord, _FlowlightTex);
之后两张纹理在frag中叠加输出,需要注意的只有一行:
118  cadd.rgb *= c.
很多shader作者在写流光的时候只是把叠加纹理的颜色+=在了主纹理上,但如果先将叠加纹理乘以主纹理的颜色,就会让暗色变得更暗,更符合光吸收的感觉,再配合Power控制光强度可以更好地表现光。
当然这样一来的副作用就是流光纹理本身的颜色就没有用了,因为变成了只用灰度,毕竟本来目的只是在打光。需要颜色的话可以在这行的下一行乘以自定义颜色,这里就不写了。
以上是需要留意的部分。
具体流程上,在vert中先获得流光纹理的纹理坐标OUT.texflow,而后使用_Time时间参数让纹理坐标随时间偏移,注意偏移操作在顶点着色vert部分进行而不是在片段着色frag,这样不会浪费计算量。
之后在frag中进行叠加将流光纹理与主纹理叠加,注意是c.rgb += cadd.rgb,否则c += cadd会导致透明通道也被叠加上去,对下一步c的预乘透明通道产生影响。
在纹理的制作上,因为是循环滚动,所以为了不会让光出现过度频繁,需要在流光纹理的旁边加上合适宽度的黑色区域。
下面是本文开头动图使用的流光纹理:
它在光线纹理(正方形)的左侧加上了等宽的黑色区域,让纹理变为了2x1的宽高,这样再将材质的Tiling改为X:0.5 Y:1就可以让光出现的频率减半了,当然还可以把光线区域在PS再缩小为66%,这样就可以让光线的出现频率变为最初的1/3了(别忘了改Tilling),其他频率以此类推。
下一次会分享一下uGui用的溶解。说是uGui用,其实使用了UI或Sprite Shader的东西都可以用。
阅读(...) 评论()版本:unity 5.4.1& 语言:Unity Shader
Shader Forge版本:1.32
在具体介绍Shader之前准备再写一篇有关于ShaderForge的,虽然我们可能使用代码来直接编写Shader,但拥有ShaderForge这样的可视化编辑工具,简直如虎添翼,方便至极。
想要有什么Shader的想法,直接用ShaderForge来编写,得到shader文件之后,有不满意的地方再改动改动,我们的shader就成型了。也可以参考参考它里面的代码,能让自己对Shader的理解更进一层。
界面说明:
将Shader Forge添加进Unity工程中后,在Unity的Window菜单下就有了Shader Forge的菜单,点击便能打开Shader Forge的编写界面了。
在这边建议一下,Unity在使用时最好使用5.x的版本,因为只有在5以上的版本Unity才支持PBR,也就是Physically Based Rendering,基于物理的渲染。3A级大作大多都会使用这种光照模型的渲染方式提供照片级的画面,Unreal的画面大家有目共睹,正是使用的这样的方式。(不过最近玩的黑魂3,貌似并没有使用,只是打了很多的灯光,如果有这方面的文章,希望大家分享给我一下)
两个按钮:New Shader、Load Shader。不用说了吧,一个创建Shader、一个读取Shader。大家最好不要用自己写的Shader读取到Shader Forge中,Shader Forge会做很多处理,可能会改变Shader效果。
创建界面(4.x版本可能就没有下面的PBR选项了):
我们来创建一个Lit(Basic)的Shader,创建之后的效果是这样的:
? 首先来讲一下Shader Forge标签下,最上面的三个按钮:
Return to menu:返回回创建Shader的界面;
Setting:对Shader Forge的创建界面进行设置,最好勾选Show node browser panel,显示创建节点的窗口;
Compile shader:编译Shader,在改变Shader的一些节点之后,需要点击该按钮进行编译,然后在下面的预览窗口中才会显示效果,当然可以勾选Auto,让它在改变Shader后自动进行编译。
? 接下来是预览窗口的菜单:
sf_sphere:预览窗口中使用的模型,可以在自己的工程中随意选取想要的模型;
Skybox:预览窗口模型的背景是否使用天空盒(只有在当前项目场景中有天空盒才能使用)。不行的话,可以使用前面的颜色改变背景的颜色;
Rotate:是否自动旋转,勾选的话模型会自动旋转,嗯,没毛病。
? 最后是属性窗口:
Shader Setting:Shader的一个总体设置,Path Shader的名称路径,Fallback失败时的回调啊,LOD值,Draw call batching 是否启用批处理(批处理会导致顶点无法操作,在使用顶点动画时一定要关闭),Inspector preview mode 针对的模式2D还是3D的呢,Target renderers渲染的平台;
Properties:用户在使用该Shader时能看到的属性;
Lighting:使用的光照模型,不详细说,感觉说这个展开来说可以写一本书了。需要知道的是Forward是前向渲染适用于手机等移动平台,Deferred延时渲染适用于电脑平台,特别是点光源多的情况下,延时渲染能提升处理性能。光照模型中,Blinn-Phong是最经典的半兰伯特高光光照模型,逻辑其实比较简单,到时候我们也会实现,PBL就是PBR的光照模型,目标3A级请往这边看;
Geometry:几何,大多数选项我也不大清楚,哈哈。不过想要模型双面显示,请将Face Culling设置为Double Sided;
Blend:混合模式,可以设置该物体是透明(Transparent)的,还是实体(Opaque),想要透明效果的话选择Alpha Blended,然后你会发现调整编辑窗口的Color的Alpha值没有效果。嗯,看到Color节点最右边的A了吗,把它连到Main节点下的Opacity就可以了,再试试看吧。
操作说明:
&&&&我们来看看我们的编辑窗口。
在编辑窗口中创建各式各样的节点,然后连接到Main上面,就能输出自己想要的效果,接下来我来说说主要的一些操作。
连接,刚刚说透明效果的时候应该已经试过了吧,点中Color节点上的A,不要松开鼠标左键,将线拖到Main上的Opacity标签上;
断开连接,那我这条连接不想要了怎么办?键盘上按住Alt,按住鼠标右键,可以拖出一条虚线,在松开右键时,虚线碰到的连接会被删除;
创建节点,直接点击右键会出现创建节点的菜单,或者使用我们一开始说的创建窗口,也可以按下属性的开头字母,比如想要创建一个Color,按下键盘上的C,不要松开,用鼠标左键去选区Color就可以了,如下图:
拖动编辑界面,按住鼠标左键即可拖动;
选中多数的节点,按住Alt并按住鼠标左键托出的方框即可选中;
删除节点,选中节点后,按下delete。
好了,上面的基本操作就能满足使用的需求了,顺便值得一提的是,Project标签中的资源(比如图片),可以直接拖动到节点中初始化。
ShaderForge使用方便,便于调试,大家试试就能掌握它的使用方法,但是如果没有Shader的基础知识,想要实现理想的效果还是困难重重,比如实现透明效果一定要在Blend中调整Shader的设置。所以在学习Shader的时候各种理论基础一定要打结实,这样在来看看ShaderForge的各种操作,心中就游刃有余。
最后把自己使用的Shader Forge 1.32提供给大家:。
Unity 2017版都已经有测试版了,引擎越研究越感觉到自己知识的不足,其实有时候也会有疑问,自己学的这些东西到底有没有有用,现在的工作只要会Unity的一些简单操作就可以了,但是记起以前老师说过的一句话:我不知道努力能不能成功,但不努力一定不会成功。以此激励自己,望自己过几年后能成为团队的技术核心!
本文已收录于以下专栏:
相关文章推荐
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》...
记录模型外发光效果shader制作
节点中用到了:加法、乘法、开关、法线方向、UV坐标、菲尼尔节点
今天给大家介绍的是一篇关于基于物理渲染(Physically Based Rendering)的技术论文。PBR是最近游戏渲染领域中比较高级的渲染管线。相比于传统基于Lambert以及Phong模型的...
版本:unity 5.4.1  语言:Unity Shader
今天使用Shader的时候遇到了问题,知道是哪边错了,却不知道怎么改,书又放到家里了,最后还是查到解决的代码,但是这类东西还...
ShaderForge是一款为Unity所用的、基于节点操作的Shader插件。笔者一直想写一篇关于ShaderForge的教程,希望可以分享给想学习Shader的美术。通过该插件,美术不需要编写代码...
各位看官好,今天戳戳为大家介绍一个插件。那就是大名鼎鼎的ShaderForge(以下简称SF),这款插件曾获得UNITE14的最佳技术成就奖。请看戳戳为大家截的图。
那么这是一款什么插件呢,...
本文算是固定功能Shader的最后一篇,下一次更新应该就会开始讲解表面Shader,而讲解完表面Shader,后续文章最终会讲解到顶点着色器和片段着色器(也就是可编程Shader)。文章第一部分复习和...
囧啊。。最近很喜欢用“囧”。。。呵呵
随便找个北京赛区的水题,居然就是线段树(树状数组),囧啊。。。
这题是求以一个点为中点,前面比它小后面比它大的对数 以及 前面比它大后面比它小的对数 的和。
...
Shader Forge翻译
/shaderforge/nodes/?lang=zh_cn
(上面的连接自己懒得截图了,有别人已经截图下来的,下图来自http...
他的最新文章
讲师:王哲涵
讲师:王渊命
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信