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
|
float4x4 world : World;
float4x4 worldInverseTranspose : WorldInverseTranspose;
float4x4 worldViewProj : WorldViewProjection;
float4x4 viewInverse : ViewInverse;
////////////////
// tweakables //
////////////////
float BumpHeight <
string UIName = "Bump Factor";
float UIMin = 0.0;
float UIMax = 2.0;
float UIStep = 0.1;
> = 0.2;
texture normalMap : Normal <
string UIName = "Normal Map";
string name = "NMP_Ripples2_512.dds";
string type = "2D";
>;
sampler2D NormalSampler = sampler_state {
Texture = <normalMap>;
MinFilter = Linear;
MagFilter = Linear;
MipFilter = Linear;
};
texture envMap : Environment <
string UIName = "Cube Map";
string type = "CUBE";
string name = "sunol_cubemap.dds";
>;
samplerCUBE EnvSampler = sampler_state {
Texture = <envMap>;
MinFilter = Linear;
MipFilter = Linear;
MagFilter = Linear;
// WrapS = ClampToEdge;
// WrapT = ClampToEdge;
};
////////////////
// structures //
////////////////
struct a2v
{
float4 Position : POSITION; //in object space
float3 TexCoord : TEXCOORD0;
float3 Tangent : TANGENT; // TANGENT; // ATTR14; // in object space
float3 Binormal : BINORMAL; // BINORMAL; // ATTR15; // in object space
float3 Normal : NORMAL; //in object space
};
struct v2f
{
float4 Position : POSITION; //in projection space
float2 TexCoord : TEXCOORD0;
float3 worldEyeVec : TEXCOORD1;
float3 WorldNormal : TEXCOORD2;
float3 WorldTangent : TEXCOORD3;
float3 WorldBinorm : TEXCOORD4;
};
/////////////
// shaders //
/////////////
v2f BumpReflectVS(a2v IN)
{
v2f OUT;
OUT.Position = mul(IN.Position, worldViewProj);
OUT.TexCoord.xy = IN.TexCoord.xy;
OUT.WorldNormal = mul(float4(IN.Normal, 0), worldInverseTranspose).xyz;
OUT.WorldTangent = mul(float4(IN.Tangent, 0), worldInverseTranspose).xyz;
OUT.WorldBinorm = mul(float4(IN.Binormal, 0), worldInverseTranspose).xyz;
float3 worldPos = mul(IN.Position, world).xyz;
OUT.worldEyeVec = normalize(worldPos - viewInverse[3].xyz);
return OUT;
}
float4 BumpReflectPS(v2f IN) : COLOR {
float2 bump = (tex2D(NormalSampler, IN.TexCoord.xy).xy * 2 - 1) * BumpHeight;
float3 normal = normalize(IN.WorldNormal);
float3 tangent = normalize(IN.WorldTangent);
float3 binormal = normalize(IN.WorldBinorm);
float3 nb = normal + bump.x * tangent + bump.y * binormal;
nb = normalize(nb);
float3 worldEyeVec = normalize(IN.worldEyeVec);
float3 lookup = reflect(worldEyeVec, nb);
return texCUBE(EnvSampler, float4(lookup, 1).xyz);
}
// #o3d VertexShaderEntryPoint BumpReflectVS
// #o3d PixelShaderEntryPoint BumpReflectPS
|