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
|
//TEST_IGNORE_FILE:
//
// Constant Buffer Variables
//
Texture2D g_txDiffuse;
SamplerState samLinear
{
Filter = MIN_MAG_MIP_LINEAR;
AddressU = Wrap;
AddressV = Wrap;
};
TextureCube g_txEnvMap;
SamplerState samLinearClamp
{
Filter = MIN_MAG_MIP_LINEAR;
AddressU = Clamp;
AddressV = Clamp;
};
cbuffer cbConstant
{
float3 vLightDir = float3(-0.577,0.577,-0.577);
};
cbuffer cbChangesEveryFrame
{
matrix World;
matrix View;
matrix Projection;
float Time;
};
cbuffer cbUserChanges
{
float Waviness;
};
struct VS_INPUT
{
float3 Pos : POSITION; //position
float3 Norm : NORMAL; //normal
float2 Tex : TEXCOORD0; //texture coordinate
};
struct PS_INPUT
{
float4 Pos : SV_POSITION;
float3 Norm : TEXCOORD0;
float2 Tex : TEXCOORD1;
float3 ViewR : TEXCOORD2;
};
//--------------------------------------------------------------------------------------
// DepthStates
//--------------------------------------------------------------------------------------
DepthStencilState EnableDepth
{
DepthEnable = TRUE;
DepthWriteMask = ALL;
DepthFunc = LESS_EQUAL;
};
BlendState NoBlending
{
AlphaToCoverageEnable = FALSE;
BlendEnable[0] = FALSE;
};
//
// Vertex Shader
//
PS_INPUT VS( VS_INPUT input )
{
PS_INPUT output = (PS_INPUT)0;
output.Pos = mul( float4(input.Pos,1), World );
output.Pos.x += sin( output.Pos.y*0.1f + Time )*Waviness;
output.Pos = mul( output.Pos, View );
output.Pos = mul( output.Pos, Projection );
output.Norm = mul( input.Norm, (float3x3)World );
output.Tex = input.Tex;
// Calculate the reflection vector
float3 viewNorm = mul( output.Norm, (float3x3)View );
output.ViewR = reflect( viewNorm, float3(0,0,-1.0) );
return output;
}
//
// Pixel Shader
//
float4 PS( PS_INPUT input) : SV_Target
{
// Calculate lighting assuming light color is <1,1,1,1>
float fLighting = saturate( dot( input.Norm, vLightDir ) );
// Load the environment map texture
float4 cReflect = g_txEnvMap.Sample( samLinearClamp, input.ViewR );
// Load the diffuse texture and multiply by the lighting amount
float4 cDiffuse = g_txDiffuse.Sample( samLinear, input.Tex ) * fLighting;
// Add diffuse to reflection and go
float4 cTotal = cDiffuse + cReflect;
cTotal.a = 1;
return cTotal;
}
//
// Technique
//
technique11 Render
{
pass P0
{
SetVertexShader( CompileShader( vs_4_0, VS() ) );
SetGeometryShader( NULL );
SetPixelShader( CompileShader( ps_4_0, PS() ) );
SetDepthStencilState( EnableDepth, 0 );
SetBlendState( NoBlending, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF );
}
}
|