source: GTP/trunk/App/Demos/Vis/FriendlyCulling/src/shaders/sky_preetham.cg @ 3041

Revision 3041, 2.7 KB checked in by mattausch, 16 years ago (diff)
Line 
1struct vtxin
2{
3        float4 position: POSITION;
4        float3 normal: NORMAL;
5        float3 color: COLOR;
6        float2 texcoord: TEXCOORD0;
7};
8
9
10// vtx output
11struct vtxout
12{
13        float4 color: COLOR0; 
14        float4 position: POSITION;
15
16        float4 texCoord: TEXCOORD0;   
17        float3 normal: TEXCOORD1;
18        float4 hdrColor: TEXCOORD2;
19};
20
21
22// fragment input
23struct fragin
24{
25        float4 color: COLOR0; 
26        //float4 projPos: WPOS;
27        //float4 position: POSITION;
28
29        float4 texCoord: TEXCOORD0;   
30        float3 normal: TEXCOORD1;
31        float4 hdrColor: TEXCOORD2;
32};
33
34
35struct pixel
36{
37        float4 col: COLOR0;
38        float3 norm: COLOR1;
39        float3 pos: COLOR2;
40};
41
42
43
44//--------------------------------------------------------------------------------------
45// Vertex Shaders
46//--------------------------------------------------------------------------------------
47
48
49vtxout default_vs(vtxin IN,
50                                  uniform float3 lightDir,
51                                  uniform float2 thetaSun,
52                                  uniform float3 zenithColor,
53                                  uniform float3 aColor,
54                                  uniform float3 bColor,
55                                  uniform float3 cColor,
56                                  uniform float3 dColor,
57                                  uniform float3 eColor,
58                                  uniform float multiplier)
59{
60        vtxout OUT;
61
62        OUT.position = mul(glstate.matrix.mvp, IN.position);
63
64        const float dotLN = dot(lightDir, IN.normal);   
65        const float cos2gamma = dotLN * dotLN;
66
67        const float gamma = acos(dotLN);   
68        const float theta = dot(float3(.0f, .0f, 1.0f), IN.normal);
69
70    float3 num = (1.0f + aColor * exp(bColor / theta)) * (1.0f + cColor * exp(dColor * gamma) + eColor * cos2gamma);   
71        float3 den = (1.0f + aColor * exp(bColor)) * (1.0f + cColor * exp(dColor * thetaSun.x) + eColor * thetaSun.y);   
72    float3 xyY = (num / den) * zenithColor;   
73   
74    float3 XYZ;                                                                                             
75                                                                                                           
76    XYZ.x = (xyY.x / xyY.y) * xyY.z;                                                                       
77        XYZ.y = xyY.z;                                                                                         
78        XYZ.z = ((1.0f - xyY.x - xyY.y) / xyY.y) * xyY.z;   
79       
80    const static float3x3 conv_Mat =
81                float3x3( 3.240479f, -1.537150f, -0.498535f,
82                         -0.969256f,  1.875992f,  0.041556f,
83                              0.055648f, -0.204043f,  1.057311f);
84
85        float3 hcol = mul(conv_Mat, XYZ);
86        OUT.color = float4(hcol, 1.0f);
87
88        OUT.color.rgb *= multiplier;
89        /// put out color into different color channel to avoid clamping
90        OUT.hdrColor  = OUT.color;
91
92        OUT.normal = IN.normal;
93
94        return OUT;
95}
96
97
98pixel frag_skydome(fragin IN)
99{
100        pixel pix;
101
102        pix.col = IN.hdrColor;
103        pix.col.w = 1e20f;
104        pix.norm = IN.normal;
105       
106        return pix;
107}
Note: See TracBrowser for help on using the repository browser.