CmD3D11BuiltinMaterialManager.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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. \
  30. void vs_main( \
  31. in float3 inPos : POSITION, \
  32. in float2 uv : TEXCOORD0, \
  33. out float4 oPosition : SV_Position, \
  34. out float2 oUv : TEXCOORD0) \
  35. { \
  36. float tfrmdX = (inPos.x / halfViewportWidth) - 1.0f; \
  37. float tfrmdY = (inPos.y / halfViewportHeight) + 1.0f; \
  38. \
  39. oPosition = float4(tfrmdX, tfrmdY, 0, 1); \
  40. oUv = uv; \
  41. } \
  42. ";
  43. String psCode = " \
  44. SamplerState mainTexSamp : register(s0); \
  45. Texture2D mainTexture : register(t0); \
  46. \
  47. float4 ps_main(in float4 inPos : SV_Position, float2 uv : TEXCOORD0) : SV_Target \
  48. { \
  49. float4 color = float4(1.0f, 1.0f, 1.0f, mainTexture.Sample(mainTexSamp, uv).r); \
  50. return color; \
  51. }";
  52. HHighLevelGpuProgram vsProgram = HighLevelGpuProgram::create(vsCode, "vs_main", "hlsl", GPT_VERTEX_PROGRAM, GPP_VS_4_0);
  53. HHighLevelGpuProgram psProgram = HighLevelGpuProgram::create(psCode, "ps_main", "hlsl", GPT_FRAGMENT_PROGRAM, GPP_PS_4_0);
  54. vsProgram.waitUntilLoaded();
  55. psProgram.waitUntilLoaded();
  56. mSpriteTextShader = Shader::create("TextShader");
  57. mSpriteTextShader->addParameter("halfViewportWidth", "halfViewportWidth", GPDT_FLOAT1);
  58. mSpriteTextShader->addParameter("halfViewportHeight", "halfViewportHeight", GPDT_FLOAT1);
  59. mSpriteTextShader->addParameter("mainTexSamp", "mainTexSamp", GPOT_SAMPLER2D);
  60. mSpriteTextShader->addParameter("mainTexture", "mainTexture", GPOT_TEXTURE2D);
  61. TechniquePtr newTechnique = mSpriteTextShader->addTechnique("D3D11RenderSystem", RendererManager::getCoreRendererName());
  62. PassPtr newPass = newTechnique->addPass();
  63. newPass->setVertexProgram(vsProgram);
  64. newPass->setFragmentProgram(psProgram);
  65. BLEND_STATE_DESC desc;
  66. desc.renderTargetDesc[0].blendEnable = true;
  67. desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
  68. desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
  69. desc.renderTargetDesc[0].blendOp = BO_ADD;
  70. HBlendState blendState = BlendState::create(desc);
  71. newPass->setBlendState(blendState);
  72. }
  73. void D3D11BuiltinMaterialManager::initSpriteImageShader()
  74. {
  75. // TODO
  76. }
  77. }