DX11PixelShader.hlsl 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /////////////
  2. // GLOBALS //
  3. /////////////
  4. Texture2D shaderTexture : register(t0);
  5. SamplerState SampleType;
  6. // The position of the kamera
  7. cbuffer Kamera : register(b0)
  8. {
  9. float4 kPosition;
  10. }
  11. // these values should sum up to 1
  12. cbuffer Material : register(b1)
  13. {
  14. float ambientFactor;
  15. float diffusFactor;
  16. float specularFactor;
  17. };
  18. cbuffer LightCount : register(b2)
  19. {
  20. int diffuseLightCount;
  21. int pointLightCount;
  22. int effectCount;
  23. }
  24. // lights
  25. struct DiffuseLight
  26. {
  27. float3 direction;
  28. float3 color;
  29. };
  30. struct PointLight
  31. {
  32. float3 position;
  33. float3 color;
  34. float radius;
  35. };
  36. cbuffer TexturEffect : register(b3)
  37. {
  38. bool effectEnabled;
  39. float effectPercentage;
  40. };
  41. StructuredBuffer< DiffuseLight > difuseLights : register(t1);
  42. StructuredBuffer< PointLight > pointLights : register(t2);
  43. Texture2D additionalTexture : register(t3);
  44. //////////////
  45. // TYPEDEFS //
  46. //////////////
  47. struct PixelInputType
  48. {
  49. float4 worldPos : POSITION;
  50. float4 position : SV_POSITION;
  51. float2 tex : TEXCOORD0;
  52. float3 normal : TEXCOORD1;
  53. };
  54. ////////////////////////////////////////////////////////////////////////////////
  55. // Pixel Shader
  56. ////////////////////////////////////////////////////////////////////////////////
  57. float4 TexturePixelShader( PixelInputType input ) : SV_TARGET
  58. {
  59. float3 diffuseLight = float3(0, 0, 0);
  60. float3 specularLight = float3(0, 0, 0);
  61. for( int j = 0; j < diffuseLightCount; j++ )
  62. {
  63. if( dot( input.normal, -difuseLights[ j ].direction ) < 0 )
  64. continue;
  65. diffuseLight += difuseLights[ j ].color * dot( input.normal, -difuseLights[ j ].direction );
  66. }
  67. for( int i = 0; i < pointLightCount; i++ )
  68. {
  69. float3 lightDir = pointLights[ i ].position - input.worldPos.xyz;
  70. float factor;
  71. if( length( lightDir ) < 1 )
  72. factor = 1;
  73. else
  74. factor = pointLights[ i ].radius / length( lightDir );
  75. float f = dot( input.normal, normalize( lightDir ) );
  76. if( f > 0 )
  77. {
  78. diffuseLight += pointLights[ i ].color * f * factor;
  79. f = dot( normalize( reflect( normalize( -lightDir ), input.normal ) ), normalize( kPosition.xyz - input.worldPos.xyz ) );
  80. if( f > 0 )
  81. specularLight += pointLights[ i ].color * f * factor;
  82. }
  83. }
  84. //if (!(diffuseLight.x >= 0 && diffuseLight.x <= 1))
  85. // diffuseLight.x = 0;
  86. float4 materialColor = shaderTexture.Sample( SampleType, input.tex );
  87. if( effectEnabled )
  88. {
  89. float dist = sqrt( (input.tex.x - 0.5f) * (input.tex.x - 0.5f) + (input.tex.y - 0.5f) * (input.tex.y - 0.5f) ) / sqrt( 0.5f );
  90. if( dist < effectPercentage )
  91. {
  92. float alphaMultiplier = (effectPercentage - dist) / 0.2f;
  93. if( alphaMultiplier > 1 )
  94. alphaMultiplier = 1.f;
  95. float4 effectColor = additionalTexture.Sample( SampleType, input.tex );
  96. materialColor = effectColor * (effectColor.a * alphaMultiplier) + materialColor * (1 - effectColor.a * alphaMultiplier);
  97. }
  98. }
  99. float4 textureColor = saturate( (materialColor * ambientFactor) + (float4(diffuseLight.x, diffuseLight.y, diffuseLight.z, 0) * diffusFactor) + (float4(specularLight.x, specularLight.y, specularLight.z, 0) * specularFactor) );
  100. textureColor.a = materialColor.a;
  101. if( isnan( diffuseLight.x * diffusFactor ) )
  102. textureColor = materialColor;
  103. return textureColor;
  104. //return textureColor;
  105. //if (diffusFactor == 0)
  106. // return float4(1, 1, 0, 1);
  107. /*if (isnan(diffuseLight.x) || isnan(diffusFactor) || isinf(diffuseLight.x) || isinf(-diffuseLight.x))
  108. return float4(0, 1, 1, 1);
  109. if (isnan(diffuseLight.x - diffuseLight.x) && isnan(diffuseLight.x * diffusFactor) )
  110. return float4(1, 1, 1, 1);
  111. if ((diffuseLight.x * diffusFactor) != 0 && (diffuseLight.x * diffusFactor) != -0)
  112. return float4(0, 0, 1, 1);
  113. return float4(0, 1, 0, 1);*/
  114. }