struct vtxin { float4 position: POSITION; float3 normal: NORMAL; float3 color: COLOR; float2 texcoord: TEXCOORD0; }; // vtx output struct vtxout { float4 color: COLOR0; float4 position: POSITION; float4 texCoord: TEXCOORD0; float3 normal: TEXCOORD1; float4 hdrColor: TEXCOORD2; }; // fragment input struct fragin { float4 color: COLOR0; //float4 projPos: WPOS; //float4 position: POSITION; float4 texCoord: TEXCOORD0; float3 normal: TEXCOORD1; float4 hdrColor: TEXCOORD2; }; struct pixel { float4 col: COLOR0; float3 norm: COLOR1; float3 id: COLOR2; }; //-------------------------------------------------------------------------------------- // Vertex Shaders //-------------------------------------------------------------------------------------- vtxout default_vs(vtxin IN, uniform float3 lightDir, uniform float2 thetaSun, uniform float3 zenithColor, uniform float3 aColor, uniform float3 bColor, uniform float3 cColor, uniform float3 dColor, uniform float3 eColor, uniform float multiplier) { vtxout OUT; OUT.position = mul(glstate.matrix.mvp, IN.position); const float dotLN = dot(lightDir, IN.normal); const float cos2gamma = dotLN * dotLN; const float gamma = acos(dotLN); const float theta = dot(float3(.0f, .0f, 1.0f), IN.normal); float3 num = (1.0f + aColor * exp(bColor / theta)) * (1.0f + cColor * exp(dColor * gamma) + eColor * cos2gamma); float3 den = (1.0f + aColor * exp(bColor)) * (1.0f + cColor * exp(dColor * thetaSun.x) + eColor * thetaSun.y); float3 xyY = (num / den) * zenithColor; float3 XYZ; XYZ.x = (xyY.x / xyY.y) * xyY.z; XYZ.y = xyY.z; XYZ.z = ((1.0f - xyY.x - xyY.y) / xyY.y) * xyY.z; const static float3x3 conv_Mat = float3x3( 3.240479f, -1.537150f, -0.498535f, -0.969256f, 1.875992f, 0.041556f, 0.055648f, -0.204043f, 1.057311f); OUT.color = float4(mul(conv_Mat, XYZ), 1.0f); OUT.color.rgb *= multiplier; /// put out color into different color channel to avoid clamping OUT.hdrColor = OUT.color; OUT.normal = IN.normal; return OUT; } pixel frag_skydome(fragin IN) { pixel pix; pix.col = IN.hdrColor; //pix.col.xyz = float3(0.3f, 0.6f, 1.0f); // set depth to large value pix.col.w = 1e20f; pix.norm = IN.normal; // the scene entity id pix.id = glstate.fog.color.xyz; return pix; }