您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
140 行
3.4 KiB
140 行
3.4 KiB
Shader "VFXToolbox/ImageSequencer/HeightToNormal"
|
|
{
|
|
Properties
|
|
{
|
|
[Enum(Red,0,Green,1,Blue,2,Alpha,3)] _HeightSource("Input Channel for Height Source", Int) = 3
|
|
[Enum(Red,0,Green,1,Blue,2,Alpha,3,None,4)] _AlphaChannel("Input Channel for Alpha Output", Int) = 3
|
|
_HeightScale("Height Scale", Range(0.0,150.0)) = 25
|
|
_Radius("Radius", Range(1.0,5.0)) = 1.0
|
|
_Spherize("Spherize", Range(0.0,1.0)) = 0.0
|
|
[Enum(Low,4,Medium,8,High,16)] _NumSamples("Sample Count", Int) = 8
|
|
|
|
}
|
|
SubShader
|
|
{
|
|
Tags { "RenderType"="Opaque" }
|
|
LOD 100
|
|
|
|
// No culling or depth
|
|
Cull Off ZWrite Off ZTest Always
|
|
|
|
Pass
|
|
{
|
|
CGPROGRAM
|
|
#pragma vertex vert
|
|
#pragma fragment frag
|
|
|
|
#include "UnityCG.cginc"
|
|
|
|
struct appdata
|
|
{
|
|
float4 vertex : POSITION;
|
|
float2 uv : TEXCOORD0;
|
|
};
|
|
|
|
struct v2f
|
|
{
|
|
float2 uv : TEXCOORD0;
|
|
float4 vertex : SV_POSITION;
|
|
};
|
|
|
|
// ImageSequencer CustomMaterial uniforms
|
|
// ======================================
|
|
//
|
|
// sampler2D _InputFrame; // Input Frame (from previous sequence)
|
|
//
|
|
// float4 _FrameData; // Frame Data
|
|
// // x, y : width (x) and height (y) in pixels
|
|
// // z, w : sequence index (z) and length (w)
|
|
//
|
|
// float4 _FlipbookData; // Flipbook Data
|
|
// // x, y : number of columns (x) and rows (y)
|
|
// // z, w : (unused)
|
|
|
|
sampler2D _InputFrame;
|
|
float4 _FrameData;
|
|
float4 _FlipbookData;
|
|
|
|
int _HeightSource;
|
|
int _AlphaChannel;
|
|
int _NumSamples;
|
|
float _HeightScale;
|
|
float _Radius;
|
|
float _Spherize;
|
|
|
|
v2f vert (appdata v)
|
|
{
|
|
v2f o;
|
|
o.vertex = UnityObjectToClipPos(v.vertex);
|
|
o.uv = v.uv;
|
|
return o;
|
|
}
|
|
|
|
half3 position(sampler2D s, float2 t)
|
|
{
|
|
half4 w = tex2D(s,t);
|
|
float h;
|
|
if(_HeightSource == 0) h = w.r;
|
|
if(_HeightSource == 1) h = w.g;
|
|
if(_HeightSource == 2) h = w.b;
|
|
if(_HeightSource == 3) h = w.a;
|
|
|
|
float x = t.x *_FrameData.x;
|
|
float y = t.y *_FrameData.y;
|
|
float z = h *_HeightScale;
|
|
|
|
// Spherize
|
|
float2 ssc = float2(t.x - 0.5f , t.y - 0.5f) * 1.414213562373095f;
|
|
z += _Spherize * (1.0f - dot(ssc, ssc)) * 200;
|
|
|
|
return float3(x, y, z);
|
|
}
|
|
|
|
half3 normal(sampler2D s, float2 t, float r)
|
|
{
|
|
float2 invSize = 1.0f/_FrameData.xy;
|
|
float3 pos = position(s,t);
|
|
float3 nrm = float3(0,0,0);
|
|
|
|
float step = UNITY_PI*2*(1.0/(_NumSamples*2));
|
|
int numRings = ceil(r);
|
|
|
|
for(int j = 1; j <= numRings ; j++)
|
|
{
|
|
float rad = r * ((float)j/numRings);
|
|
|
|
for(int i = 0; i < (_NumSamples*2); i+=2)
|
|
{
|
|
float angle = i*step;
|
|
float2 offset = float2(cos(angle),sin(angle)) * invSize * rad;
|
|
float3 sampleA = position(s, t+offset);
|
|
|
|
angle = (i+1)*step;
|
|
offset = float2(cos(angle),sin(angle)) * invSize * rad;
|
|
float3 sampleB = position(s, t+offset);
|
|
|
|
nrm += normalize(cross(sampleA-pos, sampleB-pos));
|
|
}
|
|
}
|
|
nrm = normalize(nrm);
|
|
//nrm += float3(_Spherize * pow(float2(t - 0.5f)*2.0f,5.0f),0.0f);
|
|
return nrm;
|
|
}
|
|
|
|
half4 frag (v2f input) : SV_Target
|
|
{
|
|
float alpha;
|
|
half4 col = tex2D(_InputFrame,input.uv);
|
|
if(_AlphaChannel == 0) alpha = col.r;
|
|
if(_AlphaChannel == 1) alpha = col.g;
|
|
if(_AlphaChannel == 2) alpha = col.b;
|
|
if(_AlphaChannel == 3) alpha = col.a;
|
|
if(_AlphaChannel == 4) alpha = 1.0f;
|
|
|
|
half3 nrml = normal(_InputFrame, input.uv, _Radius);
|
|
return half4((nrml * 0.5)+0.5,alpha);
|
|
}
|
|
ENDCG
|
|
}
|
|
}
|
|
}
|