BsGLBuiltinMaterialFactory.cpp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. #include "BsGLBuiltinMaterialFactory.h"
  2. #include "CmHighLevelGpuProgram.h"
  3. #include "CmShader.h"
  4. #include "CmTechnique.h"
  5. #include "CmPass.h"
  6. #include "CmMaterial.h"
  7. #include "CmBlendState.h"
  8. #include "CmDepthStencilState.h"
  9. #include "CmRendererManager.h"
  10. using namespace CamelotFramework;
  11. namespace BansheeEngine
  12. {
  13. void GLBuiltinMaterialFactory::startUp()
  14. {
  15. initSpriteTextShader();
  16. initSpriteImageShader();
  17. initDebugDrawShader();
  18. SAMPLER_STATE_DESC ssDesc;
  19. ssDesc.magFilter = FO_POINT;
  20. ssDesc.minFilter = FO_POINT;
  21. ssDesc.mipFilter = FO_POINT;
  22. mGUISamplerState = SamplerState::create(ssDesc);
  23. }
  24. void GLBuiltinMaterialFactory::shutDown()
  25. {
  26. mSpriteTextShader = nullptr;
  27. mSpriteImageShader = nullptr;
  28. }
  29. const CM::String& GLBuiltinMaterialFactory::getSupportedRenderSystem() const
  30. {
  31. static String renderSystem = "CamelotGLRenderSystem";
  32. return renderSystem;
  33. }
  34. HMaterial GLBuiltinMaterialFactory::createSpriteTextMaterial() const
  35. {
  36. HMaterial newMaterial = Material::create(mSpriteTextShader);
  37. newMaterial->setSamplerState("mainTexSamp", mGUISamplerState);
  38. return newMaterial;
  39. }
  40. HMaterial GLBuiltinMaterialFactory::createSpriteImageMaterial() const
  41. {
  42. HMaterial newMaterial = Material::create(mSpriteImageShader);
  43. newMaterial->setSamplerState("mainTexSamp", mGUISamplerState);
  44. return newMaterial;
  45. }
  46. HMaterial GLBuiltinMaterialFactory::createDebugDrawMaterial() const
  47. {
  48. return Material::create(mDebugDrawShader);
  49. }
  50. void GLBuiltinMaterialFactory::initSpriteTextShader()
  51. {
  52. String vsCode = "#version 400\n \
  53. \
  54. uniform float invViewportWidth; \
  55. uniform float invViewportHeight; \
  56. uniform mat4 worldTransform; \
  57. \
  58. in vec3 cm_position; \
  59. in vec2 cm_texcoord0; \
  60. out vec2 texcoord0; \
  61. void main() \
  62. { \
  63. vec4 tfrmdPos = worldTransform * vec4(cm_position.xy, 0, 1); \
  64. \
  65. float tfrmdX = -1.0f + (tfrmdPos.x * invViewportWidth); \
  66. float tfrmdY = 1.0f - (tfrmdPos.y * invViewportHeight); \
  67. \
  68. gl_Position = vec4(tfrmdX, tfrmdY, 0, 1); \
  69. texcoord0 = cm_texcoord0; \
  70. } \
  71. ";
  72. String psCode = "#version 400\n \
  73. \
  74. uniform sampler2D mainTexture; \
  75. in vec2 texcoord0; \
  76. out vec4 fragColor; \
  77. \
  78. void main() \
  79. { \
  80. vec4 color = vec4(1.0f, 1.0f, 1.0f, texture2D(mainTexture, texcoord0.st).r); \
  81. fragColor = color; \
  82. }";
  83. HHighLevelGpuProgram vsProgram = HighLevelGpuProgram::create(vsCode, "main", "glsl", GPT_VERTEX_PROGRAM, GPP_VS_4_0);
  84. HHighLevelGpuProgram psProgram = HighLevelGpuProgram::create(psCode, "main", "glsl", GPT_FRAGMENT_PROGRAM, GPP_PS_4_0);
  85. vsProgram.waitUntilLoaded();
  86. psProgram.waitUntilLoaded();
  87. mSpriteTextShader = Shader::create("TextSpriteShader");
  88. mSpriteTextShader->addParameter("worldTransform", "worldTransform", GPDT_MATRIX_4X4);
  89. mSpriteTextShader->addParameter("invViewportWidth", "invViewportWidth", GPDT_FLOAT1);
  90. mSpriteTextShader->addParameter("invViewportHeight", "invViewportHeight", GPDT_FLOAT1);
  91. mSpriteTextShader->addParameter("mainTexSamp", "mainTexture", GPOT_SAMPLER2D);
  92. mSpriteTextShader->addParameter("mainTexture", "mainTexture", GPOT_TEXTURE2D);
  93. TechniquePtr newTechnique = mSpriteTextShader->addTechnique("GLRenderSystem", RendererManager::getCoreRendererName());
  94. PassPtr newPass = newTechnique->addPass();
  95. newPass->setVertexProgram(vsProgram);
  96. newPass->setFragmentProgram(psProgram);
  97. BLEND_STATE_DESC desc;
  98. desc.renderTargetDesc[0].blendEnable = true;
  99. desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
  100. desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
  101. desc.renderTargetDesc[0].blendOp = BO_ADD;
  102. HBlendState blendState = BlendState::create(desc);
  103. newPass->setBlendState(blendState);
  104. DEPTH_STENCIL_STATE_DESC depthStateDesc;
  105. depthStateDesc.depthReadEnable = false;
  106. depthStateDesc.depthWriteEnable = false;
  107. HDepthStencilState depthState = DepthStencilState::create(depthStateDesc);
  108. newPass->setDepthStencilState(depthState);
  109. }
  110. void GLBuiltinMaterialFactory::initSpriteImageShader()
  111. {
  112. String vsCode = "#version 400\n \
  113. \
  114. uniform float invViewportWidth; \
  115. uniform float invViewportHeight; \
  116. uniform mat4 worldTransform; \
  117. \
  118. in vec3 cm_position; \
  119. in vec2 cm_texcoord0; \
  120. out vec2 texcoord0; \
  121. void main() \
  122. { \
  123. vec4 tfrmdPos = worldTransform * vec4(cm_position.xy, 0, 1); \
  124. \
  125. float tfrmdX = -1.0f + (tfrmdPos.x * invViewportWidth); \
  126. float tfrmdY = 1.0f - (tfrmdPos.y * invViewportHeight); \
  127. \
  128. gl_Position = vec4(tfrmdX, tfrmdY, 0, 1); \
  129. texcoord0 = cm_texcoord0; \
  130. } \
  131. ";
  132. String psCode = "#version 400\n \
  133. \
  134. uniform sampler2D mainTexture; \
  135. in vec2 texcoord0; \
  136. out vec4 fragColor; \
  137. \
  138. void main() \
  139. { \
  140. vec4 color = texture2D(mainTexture, texcoord0.st); \
  141. fragColor = color; \
  142. }";
  143. HHighLevelGpuProgram vsProgram = HighLevelGpuProgram::create(vsCode, "main", "glsl", GPT_VERTEX_PROGRAM, GPP_VS_4_0);
  144. HHighLevelGpuProgram psProgram = HighLevelGpuProgram::create(psCode, "main", "glsl", GPT_FRAGMENT_PROGRAM, GPP_PS_4_0);
  145. vsProgram.waitUntilLoaded();
  146. psProgram.waitUntilLoaded();
  147. mSpriteImageShader = Shader::create("ImageSpriteShader");
  148. mSpriteImageShader->addParameter("worldTransform", "worldTransform", GPDT_MATRIX_4X4);
  149. mSpriteImageShader->addParameter("invViewportWidth", "invViewportWidth", GPDT_FLOAT1);
  150. mSpriteImageShader->addParameter("invViewportHeight", "invViewportHeight", GPDT_FLOAT1);
  151. mSpriteImageShader->addParameter("mainTexSamp", "mainTexture", GPOT_SAMPLER2D);
  152. mSpriteImageShader->addParameter("mainTexture", "mainTexture", GPOT_TEXTURE2D);
  153. TechniquePtr newTechnique = mSpriteImageShader->addTechnique("GLRenderSystem", RendererManager::getCoreRendererName());
  154. PassPtr newPass = newTechnique->addPass();
  155. newPass->setVertexProgram(vsProgram);
  156. newPass->setFragmentProgram(psProgram);
  157. BLEND_STATE_DESC desc;
  158. desc.renderTargetDesc[0].blendEnable = true;
  159. desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
  160. desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
  161. desc.renderTargetDesc[0].blendOp = BO_ADD;
  162. HBlendState blendState = BlendState::create(desc);
  163. newPass->setBlendState(blendState);
  164. DEPTH_STENCIL_STATE_DESC depthStateDesc;
  165. depthStateDesc.depthReadEnable = false;
  166. depthStateDesc.depthWriteEnable = false;
  167. HDepthStencilState depthState = DepthStencilState::create(depthStateDesc);
  168. newPass->setDepthStencilState(depthState);
  169. }
  170. void GLBuiltinMaterialFactory::initDebugDrawShader()
  171. {
  172. // TODO - Not implemented
  173. }
  174. }