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
|
struct VS_out {
float4 Position : POSITION;
float3 TexCoord0 : TEXCOORD0;
float2 TexCoord1 : TEXCOORD1;
float2 ReflData : TEXCOORD2;
float4 Color : COLOR0;
};
#define NdotV (input.ReflData.x)
#define lightingCont (input.ReflData.y)
sampler2D diffTex : register(s0);
sampler2D envTex : register(s1);
float4 fogColor : register(c0);
float4 fxparams : register(c2);
float3 skyTop : register(c3);
float3 skyBot : register(c4);
#define shininess (fxparams.x)
#define power (4.0)
#define preMult (1.0)
#define postMult (1.0)
#define minRefl (0.25)
#define maxRefl (3.0)
#define minOpacity (1.0)
#define maxOpacity (1.0)
float4 main(VS_out input) : COLOR
{
float4 pass1 = input.Color*tex2D(diffTex, input.TexCoord0.xy);
float3 envtex = tex2D(envTex, float2(input.TexCoord1.x, 1.0-input.TexCoord1.y)).rgb; // V flipped
float3 skyColour = lerp(skyBot, skyTop, envtex.g);
float3 envOut = lerp(envtex.rrr, skyColour, envtex.b);
float fresnel = lerp(shininess, shininess * 2.0, NdotV);
fresnel = pow(NdotV * preMult, power);
fresnel = clamp(fresnel * postMult, 0.0, 1.0);
float reflectivity = lightingCont * lerp(minRefl, maxRefl, fresnel)*shininess;
float opacity = lerp(minOpacity, maxOpacity, fresnel)*pass1.a;
float4 color = pass1 + float4(reflectivity * envOut, 0.0);
color.a = opacity;
color.rgb = lerp(fogColor.rgb, color.rgb, input.TexCoord0.z);
return color;
}
|