1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
#ifndef POI_PARALLAX
#define POI_PARALLAX
UNITY_DECLARE_TEX2D_NOSAMPLER(_ParallaxHeightMap); float4 _ParallaxHeightMap_ST;
POI_TEXTURE_NOSAMPLER(_ParallaxHeightMapMask);
float2 _ParallaxHeightMapPan;
float _ParallaxStrength;
float _ParallaxHeightMapEnabled;
uint _ParallaxUV;
//Internal
float _ParallaxInternalMapEnabled;
UNITY_DECLARE_TEX2D_NOSAMPLER(_ParallaxInternalMap); float4 _ParallaxInternalMap_ST;
POI_TEXTURE_NOSAMPLER(_ParallaxInternalMapMask);
float _ParallaxInternalIterations;
float _ParallaxInternalMinDepth;
float _ParallaxInternalMaxDepth;
float _ParallaxInternalMinFade;
float _ParallaxInternalMaxFade;
float4 _ParallaxInternalMinColor;
float4 _ParallaxInternalMaxColor;
float4 _ParallaxInternalPanSpeed;
float4 _ParallaxInternalPanDepthSpeed;
float _ParallaxInternalHeightmapMode;
float _ParallaxInternalHeightFromAlpha;
float GetParallaxHeight(float2 uv)
{
return clamp(UNITY_SAMPLE_TEX2D_SAMPLER(_ParallaxHeightMap, _MainTex, TRANSFORM_TEX(uv, _ParallaxHeightMap) + _Time.x * _ParallaxHeightMapPan).g, 0, .99999);
}
/*
float2 ParallaxOffset(float2 viewDir)
{
float height = GetParallaxHeight();
height -= 0.5;
height *= _ParallaxStrength;
return viewDir * height;
}
*/
float2 ParallaxRaymarching(float2 viewDir)
{
float2 uvOffset = 0;
float stepSize = 0.1;
float2 uvDelta = viewDir * (stepSize * _ParallaxStrength);
float stepHeight = 1;
float surfaceHeight = GetParallaxHeight(poiMesh.uv[_ParallaxUV]);
float2 prevUVOffset = uvOffset;
float prevStepHeight = stepHeight;
float prevSurfaceHeight = surfaceHeight;
for (int i = 1; i < 10 && stepHeight > surfaceHeight; i ++)
{
prevUVOffset = uvOffset;
prevStepHeight = stepHeight;
prevSurfaceHeight = surfaceHeight;
uvOffset -= uvDelta;
stepHeight -= stepSize;
surfaceHeight = GetParallaxHeight(poiMesh.uv[_ParallaxUV] + uvOffset);
}
float prevDifference = prevStepHeight - prevSurfaceHeight;
float difference = surfaceHeight - stepHeight;
float t = prevDifference / (prevDifference + difference);
uvOffset = prevUVOffset -uvDelta * t;
return uvOffset *= POI2D_SAMPLER_PAN(_ParallaxHeightMapMask, _MainTex, poiMesh.uv[_ParallaxHeightMapMaskUV], _ParallaxHeightMapMaskPan).r;
}
void calculateandApplyParallax()
{
UNITY_BRANCH
if (_ParallaxHeightMapEnabled)
{
float2 parallaxOffset = ParallaxRaymarching(poiCam.tangentViewDir.xy);
UNITY_BRANCH
if(_ParallaxUV == 0)
{
poiMesh.uv[0] += parallaxOffset;
}
UNITY_BRANCH
if(_ParallaxUV == 1)
{
poiMesh.uv[1] += parallaxOffset;
}
UNITY_BRANCH
if(_ParallaxUV == 2)
{
poiMesh.uv[2] += parallaxOffset;
}
UNITY_BRANCH
if(_ParallaxUV == 3)
{
poiMesh.uv[3] += parallaxOffset;
}
}
}
void calculateAndApplyInternalParallax(inout float4 finalColor)
{
#if defined(_PARALLAXMAP)
UNITY_BRANCH
if(_ParallaxInternalMapEnabled)
{
float3 parallax = 0;
for (int j = _ParallaxInternalIterations; j > 0; j --)
{
float ratio = (float)j / _ParallaxInternalIterations;
float2 parallaxOffset = _Time.y * (_ParallaxInternalPanSpeed + (1 - ratio) * _ParallaxInternalPanDepthSpeed);
float fade = lerp(_ParallaxInternalMinFade, _ParallaxInternalMaxFade, ratio);
float4 parallaxColor = UNITY_SAMPLE_TEX2D_SAMPLER(_ParallaxInternalMap, _MainTex, TRANSFORM_TEX(poiMesh.uv[0], _ParallaxInternalMap) + lerp(_ParallaxInternalMinDepth, _ParallaxInternalMaxDepth, ratio) * - poiCam.tangentViewDir.xy + parallaxOffset);
float3 parallaxTint = lerp(_ParallaxInternalMinColor, _ParallaxInternalMaxColor, ratio);
float parallaxHeight;
if(_ParallaxInternalHeightFromAlpha)
{
parallaxTint *= parallaxColor.rgb;
parallaxHeight = parallaxColor.a;
}
else
{
parallaxHeight = parallaxColor.r;
}
//float parallaxColor *= lerp(_ParallaxInternalMinColor, _ParallaxInternalMaxColor, 1 - ratio);
UNITY_BRANCH
if (_ParallaxInternalHeightmapMode == 1)
{
parallax = lerp(parallax, parallaxTint * fade, parallaxHeight >= 1 - ratio);
}
else
{
parallax += parallaxTint * parallaxHeight * fade;
}
}
//parallax /= _ParallaxInternalIterations;
finalColor.rgb += parallax * POI2D_SAMPLER_PAN(_ParallaxInternalMapMask, _MainTex, poiMesh.uv[_ParallaxInternalMapMaskUV], _ParallaxInternalMapMaskPan).r;
}
#endif
}
#endif
|