CmD3D11BuiltinMaterialManager.cpp 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #include "CmD3D11BuiltinMaterialManager.h"
  2. #include "CmRendererManager.h"
  3. #include "CmHighLevelGpuProgram.h"
  4. #include "CmShader.h"
  5. #include "CmTechnique.h"
  6. #include "CmPass.h"
  7. #include "CmMaterial.h"
  8. #include "CmBlendState.h"
  9. namespace CamelotEngine
  10. {
  11. HMaterial D3D11BuiltinMaterialManager::createSpriteTextMaterial() const
  12. {
  13. return Material::create(mSpriteTextShader);
  14. }
  15. HMaterial D3D11BuiltinMaterialManager::createSpriteImageMaterial() const
  16. {
  17. return Material::create(mSpriteImageShader);
  18. }
  19. void D3D11BuiltinMaterialManager::onStartUp()
  20. {
  21. initSpriteTextShader();
  22. initSpriteImageShader();
  23. }
  24. void D3D11BuiltinMaterialManager::initSpriteTextShader()
  25. {
  26. String vsCode = " \
  27. float halfViewportWidth; \
  28. float halfViewportHeight; \
  29. float4x4 worldTransform; \
  30. \
  31. void vs_main( \
  32. in float3 inPos : POSITION, \
  33. in float2 uv : TEXCOORD0, \
  34. out float4 oPosition : SV_Position, \
  35. out float2 oUv : TEXCOORD0) \
  36. { \
  37. float4 tfrmdPos = mul(worldTransform, float4(inPos.xy, 0, 1)); \
  38. \
  39. float tfrmdX = (tfrmdPos.x / halfViewportWidth) - 1.0f; \
  40. float tfrmdY = (tfrmdPos.y / halfViewportHeight) + 1.0f; \
  41. \
  42. oPosition = float4(tfrmdX, tfrmdY, 0, 1); \
  43. oUv = uv; \
  44. } \
  45. ";
  46. String psCode = " \
  47. SamplerState mainTexSamp : register(s0); \
  48. Texture2D mainTexture : register(t0); \
  49. \
  50. float4 ps_main(in float4 inPos : SV_Position, float2 uv : TEXCOORD0) : SV_Target \
  51. { \
  52. float4 color = float4(1.0f, 1.0f, 1.0f, mainTexture.Sample(mainTexSamp, uv).r); \
  53. return color; \
  54. }";
  55. HHighLevelGpuProgram vsProgram = HighLevelGpuProgram::create(vsCode, "vs_main", "hlsl", GPT_VERTEX_PROGRAM, GPP_VS_4_0);
  56. HHighLevelGpuProgram psProgram = HighLevelGpuProgram::create(psCode, "ps_main", "hlsl", GPT_FRAGMENT_PROGRAM, GPP_PS_4_0);
  57. vsProgram.waitUntilLoaded();
  58. psProgram.waitUntilLoaded();
  59. mSpriteTextShader = Shader::create("TextSpriteShader");
  60. mSpriteTextShader->addParameter("worldTransform", "worldTransform", GPDT_MATRIX_4X4);
  61. mSpriteTextShader->addParameter("halfViewportWidth", "halfViewportWidth", GPDT_FLOAT1);
  62. mSpriteTextShader->addParameter("halfViewportHeight", "halfViewportHeight", GPDT_FLOAT1);
  63. mSpriteTextShader->addParameter("mainTexSamp", "mainTexSamp", GPOT_SAMPLER2D);
  64. mSpriteTextShader->addParameter("mainTexture", "mainTexture", GPOT_TEXTURE2D);
  65. TechniquePtr newTechnique = mSpriteTextShader->addTechnique("D3D11RenderSystem", RendererManager::getCoreRendererName());
  66. PassPtr newPass = newTechnique->addPass();
  67. newPass->setVertexProgram(vsProgram);
  68. newPass->setFragmentProgram(psProgram);
  69. BLEND_STATE_DESC desc;
  70. desc.renderTargetDesc[0].blendEnable = true;
  71. desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
  72. desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
  73. desc.renderTargetDesc[0].blendOp = BO_ADD;
  74. HBlendState blendState = BlendState::create(desc);
  75. newPass->setBlendState(blendState);
  76. }
  77. void D3D11BuiltinMaterialManager::initSpriteImageShader()
  78. {
  79. String vsCode = " \
  80. float halfViewportWidth; \
  81. float halfViewportHeight; \
  82. float4x4 worldTransform; \
  83. \
  84. void vs_main( \
  85. in float3 inPos : POSITION, \
  86. in float2 uv : TEXCOORD0, \
  87. out float4 oPosition : SV_Position, \
  88. out float2 oUv : TEXCOORD0) \
  89. { \
  90. float4 tfrmdPos = mul(worldTransform, float4(inPos.xy, 0, 1)); \
  91. \
  92. float tfrmdX = (tfrmdPos.x / halfViewportWidth) - 1.0f; \
  93. float tfrmdY = (tfrmdPos.y / halfViewportHeight) + 1.0f; \
  94. \
  95. oPosition = float4(tfrmdX, tfrmdY, 0, 1); \
  96. oUv = uv; \
  97. } \
  98. ";
  99. String psCode = " \
  100. SamplerState mainTexSamp : register(s0); \
  101. Texture2D mainTexture : register(t0); \
  102. \
  103. float4 ps_main(in float4 inPos : SV_Position, float2 uv : TEXCOORD0) : SV_Target \
  104. { \
  105. float4 color = mainTexture.Sample(mainTexSamp, uv); \
  106. return color; \
  107. }";
  108. HHighLevelGpuProgram vsProgram = HighLevelGpuProgram::create(vsCode, "vs_main", "hlsl", GPT_VERTEX_PROGRAM, GPP_VS_4_0);
  109. HHighLevelGpuProgram psProgram = HighLevelGpuProgram::create(psCode, "ps_main", "hlsl", GPT_FRAGMENT_PROGRAM, GPP_PS_4_0);
  110. vsProgram.waitUntilLoaded();
  111. psProgram.waitUntilLoaded();
  112. mSpriteImageShader = Shader::create("ImageSpriteShader");
  113. mSpriteImageShader->addParameter("worldTransform", "worldTransform", GPDT_MATRIX_4X4);
  114. mSpriteImageShader->addParameter("halfViewportWidth", "halfViewportWidth", GPDT_FLOAT1);
  115. mSpriteImageShader->addParameter("halfViewportHeight", "halfViewportHeight", GPDT_FLOAT1);
  116. mSpriteImageShader->addParameter("mainTexSamp", "mainTexSamp", GPOT_SAMPLER2D);
  117. mSpriteImageShader->addParameter("mainTexture", "mainTexture", GPOT_TEXTURE2D);
  118. TechniquePtr newTechnique = mSpriteImageShader->addTechnique("D3D11RenderSystem", RendererManager::getCoreRendererName());
  119. PassPtr newPass = newTechnique->addPass();
  120. newPass->setVertexProgram(vsProgram);
  121. newPass->setFragmentProgram(psProgram);
  122. BLEND_STATE_DESC desc;
  123. desc.renderTargetDesc[0].blendEnable = true;
  124. desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
  125. desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
  126. desc.renderTargetDesc[0].blendOp = BO_ADD;
  127. HBlendState blendState = BlendState::create(desc);
  128. newPass->setBlendState(blendState);
  129. }
  130. }