CustomLitSolid.hlsl 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #include "Uniforms.hlsl"
  2. #include "Samplers.hlsl"
  3. #include "Transform.hlsl"
  4. #include "ScreenPos.hlsl"
  5. // parameters for PS
  6. // defined in materials (see Materials/Earth.xml)
  7. #ifdef COMPILEPS
  8. uniform float cCloudsFactor;
  9. uniform float4 cSpecColor;
  10. uniform float2 cCloudsOffset;
  11. #endif
  12. void PS(
  13. float4 iTexCoord : TEXCOORD0,
  14. float4 iTangent : TEXCOORD3,
  15. float3 iNormal : TEXCOORD1,
  16. float4 iWorldPos : TEXCOORD2,
  17. float4 iScreenPos : TEXCOORD5,
  18. out float4 oColor : OUTCOLOR0)
  19. {
  20. float4 earthDiff = Sample2D(DiffMap, iTexCoord.xy);
  21. float4 clouds = Sample2D(EnvMap, iTexCoord.xy + cCloudsOffset);
  22. float4 night = Sample2D(EmissiveMap, iTexCoord.xy);
  23. float3 spec = Sample2D(SpecMap, iTexCoord.xy);
  24. float3x3 tbn = float3x3(iTangent.xyz, float3(iTexCoord.zw, iTangent.w), iNormal);
  25. float3 normal = normalize(mul(DecodeNormal(Sample2D(NormalMap, iTexCoord.xy)), tbn));
  26. // Earth texture
  27. float3 finalColor = earthDiff.rgb;
  28. // Specular map
  29. finalColor += cSpecColor.rgb * spec.rgb * cLightColor.a;
  30. // Normal map & directional light (we use only this kind of light in this shader, no Ambient, Spot, etc)
  31. finalColor *= saturate(dot(normal, cLightDirPS));
  32. // Clouds:
  33. finalColor += clouds.rgb * (dot(iNormal, cLightDirPS) + 0.5);
  34. // Nigth lamps (only for the dark side)
  35. finalColor += night.rgb * (1 - dot(iNormal, cLightDirPS));
  36. // Return final color
  37. oColor = float4(finalColor, 1.0);
  38. }
  39. // Default LitSolid Vertex Shader impl:
  40. void VS(float4 iPos : POSITION,
  41. float3 iNormal : NORMAL,
  42. float2 iTexCoord : TEXCOORD0,
  43. float4 iTangent : TANGENT,
  44. out float4 oTexCoord : TEXCOORD0,
  45. out float4 oTangent : TEXCOORD3,
  46. out float3 oNormal : TEXCOORD1,
  47. out float4 oWorldPos : TEXCOORD2,
  48. out float4 oScreenPos : TEXCOORD5,
  49. out float4 oPos : OUTPOSITION)
  50. {
  51. float3 worldPos = GetWorldPos(iModelMatrix);
  52. oPos = GetClipPos(worldPos);
  53. oNormal = GetWorldNormal(iModelMatrix);
  54. oWorldPos = float4(worldPos, GetDepth(oPos));
  55. float3 tangent = GetWorldTangent(iModelMatrix);
  56. float3 bitangent = cross(tangent, oNormal) * iTangent.w;
  57. oTexCoord = float4(GetTexCoord(iTexCoord), bitangent.xy);
  58. oTangent = float4(tangent, bitangent.z);
  59. }