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
|
Shader "Hidden/IndirectSpecularLight"
{
Properties
{
_Skybox("_Skybox", CUBE) = "white" {}
_A ("Normal", 2D) = "white" {}
_B ("Smoothness", 2D) = "white" {}
_C ("Occlusion", 2D) = "white" {}
}
SubShader
{
Pass // not connected
{
CGPROGRAM
#pragma vertex vert_img
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc"
#include "UnityPBSLighting.cginc"
uniform samplerCUBE _Skybox;
sampler2D _A;
sampler2D _B;
sampler2D _C;
float4 frag(v2f_img i) : SV_Target
{
float2 xy = 2 * i.uv - 1;
float z = -sqrt(1-saturate(dot(xy,xy)));
float3 worldNormal = normalize(float3(xy, z));
float3 vertexPos = float3(xy, z);
float3 worldViewDir = normalize(float3(0,0,-5) - vertexPos);
float3 worldRefl = -worldViewDir;
worldRefl = normalize(reflect( worldRefl, worldNormal ));
float3 sky = texCUBElod( _Skybox, float4(worldRefl, (1-saturate(tex2D(_B,i.uv).r)) * 6) ).rgb;
return float4(sky * tex2D(_C,i.uv).r, 1);
}
ENDCG
}
Pass // connected tangent
{
CGPROGRAM
#pragma vertex vert_img
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc"
#include "UnityPBSLighting.cginc"
uniform samplerCUBE _Skybox;
sampler2D _A;
sampler2D _B;
sampler2D _C;
float4 frag(v2f_img i) : SV_Target
{
float2 xy = 2 * i.uv - 1;
float z = -sqrt(1-saturate(dot(xy,xy)));
float3 vertexPos = float3(xy, z);
float3 normal = normalize(vertexPos);
float3 worldNormal = UnityObjectToWorldNormal(normal);
float3 tangent = normalize(float3( -z, xy.y*0.01, xy.x ));
float3 worldPos = mul(unity_ObjectToWorld, float4(vertexPos,1)).xyz;
float3 worldViewDir = normalize(float3(0,0,-5) - vertexPos);
float3 worldTangent = UnityObjectToWorldDir(tangent);
float tangentSign = -1;
float3 worldBinormal = normalize( cross(worldNormal, worldTangent) * tangentSign);
float4 tSpace0 = float4(worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x);
float4 tSpace1 = float4(worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y);
float4 tSpace2 = float4(worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z);
float3 worldRefl = -worldViewDir;
float2 sphereUVs = i.uv;
sphereUVs.x = atan2(vertexPos.x, -vertexPos.z) / (UNITY_PI) + 0.5;
// Needs further checking
//float3 tangentNormal = tex2Dlod(_A, float4(sphereUVs,0,0)).xyz;
float3 tangentNormal = tex2D(_A, sphereUVs).xyz;
worldRefl = reflect( worldRefl, half3( dot( tSpace0.xyz, tangentNormal ), dot( tSpace1.xyz, tangentNormal ), dot( tSpace2.xyz, tangentNormal ) ) );
float3 sky = texCUBElod( _Skybox, float4(worldRefl, (1-saturate(tex2D(_B,i.uv).r)) * 6) ).rgb;
return float4(sky * tex2D(_C,i.uv).r, 1);
}
ENDCG
}
Pass // connected world
{
CGPROGRAM
#pragma vertex vert_img
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc"
#include "UnityPBSLighting.cginc"
uniform samplerCUBE _Skybox;
sampler2D _A;
sampler2D _B;
sampler2D _C;
float4 frag(v2f_img i) : SV_Target
{
float2 xy = 2 * i.uv - 1;
float z = -sqrt(1-saturate(dot(xy,xy)));
float3 vertexPos = float3(xy, z);
float3 normal = normalize(vertexPos);
float3 worldNormal = tex2D( _A, i.uv );
float3 worldViewDir = normalize(float3(0,0,-5) - vertexPos);
float3 worldRefl = reflect( -worldViewDir, worldNormal );
float3 sky = texCUBElod( _Skybox, float4(worldRefl, (1-saturate(tex2D(_B,i.uv).r)) * 6) ).rgb;
return float4(sky * tex2D(_C,i.uv).r, 1);
}
ENDCG
}
}
}
|