CmD3D11BuiltinMaterialManager.cpp 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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("TextShader");
  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. // TODO
  80. }
  81. }