BsGLBuiltinMaterialFactory.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  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. initDebugDraw2DClipSpaceShader();
  18. initDebugDraw2DScreenSpaceShader();
  19. initDebugDraw3DShader();
  20. SAMPLER_STATE_DESC ssDesc;
  21. ssDesc.magFilter = FO_POINT;
  22. ssDesc.minFilter = FO_POINT;
  23. ssDesc.mipFilter = FO_POINT;
  24. mGUISamplerState = SamplerState::create(ssDesc);
  25. }
  26. void GLBuiltinMaterialFactory::shutDown()
  27. {
  28. mSpriteTextShader = nullptr;
  29. mSpriteImageShader = nullptr;
  30. mDebugDraw2DClipSpaceShader = nullptr;
  31. mDebugDraw2DScreenSpaceShader = nullptr;
  32. mDebugDraw3DShader = nullptr;
  33. }
  34. const CM::String& GLBuiltinMaterialFactory::getSupportedRenderSystem() const
  35. {
  36. static String renderSystem = "CamelotGLRenderSystem";
  37. return renderSystem;
  38. }
  39. HMaterial GLBuiltinMaterialFactory::createSpriteTextMaterial() const
  40. {
  41. HMaterial newMaterial = Material::create(mSpriteTextShader);
  42. newMaterial->setSamplerState("mainTexSamp", mGUISamplerState);
  43. return newMaterial;
  44. }
  45. HMaterial GLBuiltinMaterialFactory::createSpriteImageMaterial() const
  46. {
  47. HMaterial newMaterial = Material::create(mSpriteImageShader);
  48. newMaterial->setSamplerState("mainTexSamp", mGUISamplerState);
  49. return newMaterial;
  50. }
  51. HMaterial GLBuiltinMaterialFactory::createDebugDraw2DClipSpaceMaterial() const
  52. {
  53. return Material::create(mDebugDraw2DClipSpaceShader);
  54. }
  55. HMaterial GLBuiltinMaterialFactory::createDebugDraw2DScreenSpaceMaterial() const
  56. {
  57. return Material::create(mDebugDraw2DScreenSpaceShader);
  58. }
  59. HMaterial GLBuiltinMaterialFactory::createDebugDraw3DMaterial() const
  60. {
  61. return Material::create(mDebugDraw3DShader);
  62. }
  63. void GLBuiltinMaterialFactory::initSpriteTextShader()
  64. {
  65. String vsCode = "#version 400\n \
  66. \
  67. uniform float invViewportWidth; \
  68. uniform float invViewportHeight; \
  69. uniform mat4 worldTransform; \
  70. \
  71. in vec3 cm_position; \
  72. in vec2 cm_texcoord0; \
  73. out vec2 texcoord0; \
  74. void main() \
  75. { \
  76. vec4 tfrmdPos = worldTransform * vec4(cm_position.xy, 0, 1); \
  77. \
  78. float tfrmdX = -1.0f + (tfrmdPos.x * invViewportWidth); \
  79. float tfrmdY = 1.0f - (tfrmdPos.y * invViewportHeight); \
  80. \
  81. gl_Position = vec4(tfrmdX, tfrmdY, 0, 1); \
  82. texcoord0 = cm_texcoord0; \
  83. } \
  84. ";
  85. String psCode = "#version 400\n \
  86. \
  87. uniform sampler2D mainTexture; \
  88. in vec2 texcoord0; \
  89. out vec4 fragColor; \
  90. \
  91. void main() \
  92. { \
  93. vec4 color = vec4(1.0f, 1.0f, 1.0f, texture2D(mainTexture, texcoord0.st).r); \
  94. fragColor = color; \
  95. }";
  96. HHighLevelGpuProgram vsProgram = HighLevelGpuProgram::create(vsCode, "main", "glsl", GPT_VERTEX_PROGRAM, GPP_VS_4_0);
  97. HHighLevelGpuProgram psProgram = HighLevelGpuProgram::create(psCode, "main", "glsl", GPT_FRAGMENT_PROGRAM, GPP_PS_4_0);
  98. vsProgram.synchronize();
  99. psProgram.synchronize();
  100. mSpriteTextShader = Shader::create("TextSpriteShader");
  101. mSpriteTextShader->addParameter("worldTransform", "worldTransform", GPDT_MATRIX_4X4);
  102. mSpriteTextShader->addParameter("invViewportWidth", "invViewportWidth", GPDT_FLOAT1);
  103. mSpriteTextShader->addParameter("invViewportHeight", "invViewportHeight", GPDT_FLOAT1);
  104. mSpriteTextShader->addParameter("mainTexSamp", "mainTexture", GPOT_SAMPLER2D);
  105. mSpriteTextShader->addParameter("mainTexture", "mainTexture", GPOT_TEXTURE2D);
  106. TechniquePtr newTechnique = mSpriteTextShader->addTechnique("GLRenderSystem", RendererManager::getCoreRendererName());
  107. PassPtr newPass = newTechnique->addPass();
  108. newPass->setVertexProgram(vsProgram);
  109. newPass->setFragmentProgram(psProgram);
  110. BLEND_STATE_DESC desc;
  111. desc.renderTargetDesc[0].blendEnable = true;
  112. desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
  113. desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
  114. desc.renderTargetDesc[0].blendOp = BO_ADD;
  115. HBlendState blendState = BlendState::create(desc);
  116. newPass->setBlendState(blendState);
  117. DEPTH_STENCIL_STATE_DESC depthStateDesc;
  118. depthStateDesc.depthReadEnable = false;
  119. depthStateDesc.depthWriteEnable = false;
  120. HDepthStencilState depthState = DepthStencilState::create(depthStateDesc);
  121. newPass->setDepthStencilState(depthState);
  122. }
  123. void GLBuiltinMaterialFactory::initSpriteImageShader()
  124. {
  125. String vsCode = "#version 400\n \
  126. \
  127. uniform float invViewportWidth; \
  128. uniform float invViewportHeight; \
  129. uniform mat4 worldTransform; \
  130. \
  131. in vec3 cm_position; \
  132. in vec2 cm_texcoord0; \
  133. out vec2 texcoord0; \
  134. void main() \
  135. { \
  136. vec4 tfrmdPos = worldTransform * vec4(cm_position.xy, 0, 1); \
  137. \
  138. float tfrmdX = -1.0f + (tfrmdPos.x * invViewportWidth); \
  139. float tfrmdY = 1.0f - (tfrmdPos.y * invViewportHeight); \
  140. \
  141. gl_Position = vec4(tfrmdX, tfrmdY, 0, 1); \
  142. texcoord0 = cm_texcoord0; \
  143. } \
  144. ";
  145. String psCode = "#version 400\n \
  146. \
  147. uniform sampler2D mainTexture; \
  148. in vec2 texcoord0; \
  149. out vec4 fragColor; \
  150. \
  151. void main() \
  152. { \
  153. vec4 color = texture2D(mainTexture, texcoord0.st); \
  154. fragColor = color; \
  155. }";
  156. HHighLevelGpuProgram vsProgram = HighLevelGpuProgram::create(vsCode, "main", "glsl", GPT_VERTEX_PROGRAM, GPP_VS_4_0);
  157. HHighLevelGpuProgram psProgram = HighLevelGpuProgram::create(psCode, "main", "glsl", GPT_FRAGMENT_PROGRAM, GPP_PS_4_0);
  158. vsProgram.synchronize();
  159. psProgram.synchronize();
  160. mSpriteImageShader = Shader::create("ImageSpriteShader");
  161. mSpriteImageShader->addParameter("worldTransform", "worldTransform", GPDT_MATRIX_4X4);
  162. mSpriteImageShader->addParameter("invViewportWidth", "invViewportWidth", GPDT_FLOAT1);
  163. mSpriteImageShader->addParameter("invViewportHeight", "invViewportHeight", GPDT_FLOAT1);
  164. mSpriteImageShader->addParameter("mainTexSamp", "mainTexture", GPOT_SAMPLER2D);
  165. mSpriteImageShader->addParameter("mainTexture", "mainTexture", GPOT_TEXTURE2D);
  166. TechniquePtr newTechnique = mSpriteImageShader->addTechnique("GLRenderSystem", RendererManager::getCoreRendererName());
  167. PassPtr newPass = newTechnique->addPass();
  168. newPass->setVertexProgram(vsProgram);
  169. newPass->setFragmentProgram(psProgram);
  170. BLEND_STATE_DESC desc;
  171. desc.renderTargetDesc[0].blendEnable = true;
  172. desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
  173. desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
  174. desc.renderTargetDesc[0].blendOp = BO_ADD;
  175. HBlendState blendState = BlendState::create(desc);
  176. newPass->setBlendState(blendState);
  177. DEPTH_STENCIL_STATE_DESC depthStateDesc;
  178. depthStateDesc.depthReadEnable = false;
  179. depthStateDesc.depthWriteEnable = false;
  180. HDepthStencilState depthState = DepthStencilState::create(depthStateDesc);
  181. newPass->setDepthStencilState(depthState);
  182. }
  183. void GLBuiltinMaterialFactory::initDebugDraw2DClipSpaceShader()
  184. {
  185. String vsCode = "#version 400\n \
  186. \
  187. in vec2 cm_position; \
  188. in vec4 cm_color0; \
  189. out vec4 color0; \
  190. \
  191. void main() \
  192. { \
  193. gl_Position = vec4(cm_position.xy, 0, 1); \
  194. color0 = cm_color0; \
  195. }";
  196. String psCode = "#version 400\n \
  197. \
  198. in vec4 color0; \
  199. out vec4 fragColor; \
  200. \
  201. void main() \
  202. { \
  203. fragColor = color0; \
  204. }";
  205. HHighLevelGpuProgram vsProgram = HighLevelGpuProgram::create(vsCode, "vs_main", "glsl", GPT_VERTEX_PROGRAM, GPP_VS_4_0);
  206. HHighLevelGpuProgram psProgram = HighLevelGpuProgram::create(psCode, "ps_main", "glsl", GPT_FRAGMENT_PROGRAM, GPP_PS_4_0);
  207. vsProgram.synchronize();
  208. psProgram.synchronize();
  209. mDebugDraw2DClipSpaceShader = Shader::create("DebugDraw2DClipSpaceShader");
  210. TechniquePtr newTechnique = mDebugDraw2DClipSpaceShader->addTechnique("GLRenderSystem", RendererManager::getCoreRendererName());
  211. PassPtr newPass = newTechnique->addPass();
  212. newPass->setVertexProgram(vsProgram);
  213. newPass->setFragmentProgram(psProgram);
  214. BLEND_STATE_DESC desc;
  215. desc.renderTargetDesc[0].blendEnable = true;
  216. desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
  217. desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
  218. desc.renderTargetDesc[0].blendOp = BO_ADD;
  219. HBlendState blendState = BlendState::create(desc);
  220. newPass->setBlendState(blendState);
  221. DEPTH_STENCIL_STATE_DESC depthStateDesc;
  222. depthStateDesc.depthReadEnable = false;
  223. depthStateDesc.depthWriteEnable = false;
  224. HDepthStencilState depthState = DepthStencilState::create(depthStateDesc);
  225. newPass->setDepthStencilState(depthState);
  226. }
  227. void GLBuiltinMaterialFactory::initDebugDraw2DScreenSpaceShader()
  228. {
  229. String vsCode = "#version 400\n \
  230. \
  231. uniform float invViewportWidth; \
  232. uniform float invViewportHeight; \
  233. \
  234. in vec2 cm_position; \
  235. in vec4 cm_color0; \
  236. out vec4 color0; \
  237. \
  238. void main() \
  239. { \
  240. float tfrmdX = -1.0f + (cm_position.x * invViewportWidth); \
  241. float tfrmdY = 1.0f - (cm_position.y * invViewportHeight); \
  242. \
  243. gl_Position = vec4(tfrmdX, tfrmdY, 0, 1); \
  244. color0 = cm_color0; \
  245. }";
  246. String psCode = "#version 400\n \
  247. \
  248. in vec4 color0; \
  249. out vec4 fragColor; \
  250. \
  251. void main() \
  252. { \
  253. fragColor = color0; \
  254. }";
  255. HHighLevelGpuProgram vsProgram = HighLevelGpuProgram::create(vsCode, "vs_main", "glsl", GPT_VERTEX_PROGRAM, GPP_VS_4_0);
  256. HHighLevelGpuProgram psProgram = HighLevelGpuProgram::create(psCode, "ps_main", "glsl", GPT_FRAGMENT_PROGRAM, GPP_PS_4_0);
  257. vsProgram.synchronize();
  258. psProgram.synchronize();
  259. mDebugDraw2DScreenSpaceShader = Shader::create("DebugDraw2DScreenSpaceShader");
  260. mDebugDraw2DScreenSpaceShader->addParameter("invViewportWidth", "invViewportWidth", GPDT_FLOAT1);
  261. mDebugDraw2DScreenSpaceShader->addParameter("invViewportHeight", "invViewportHeight", GPDT_FLOAT1);
  262. TechniquePtr newTechnique = mDebugDraw2DScreenSpaceShader->addTechnique("GLRenderSystem", RendererManager::getCoreRendererName());
  263. PassPtr newPass = newTechnique->addPass();
  264. newPass->setVertexProgram(vsProgram);
  265. newPass->setFragmentProgram(psProgram);
  266. BLEND_STATE_DESC desc;
  267. desc.renderTargetDesc[0].blendEnable = true;
  268. desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
  269. desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
  270. desc.renderTargetDesc[0].blendOp = BO_ADD;
  271. HBlendState blendState = BlendState::create(desc);
  272. newPass->setBlendState(blendState);
  273. DEPTH_STENCIL_STATE_DESC depthStateDesc;
  274. depthStateDesc.depthReadEnable = false;
  275. depthStateDesc.depthWriteEnable = false;
  276. HDepthStencilState depthState = DepthStencilState::create(depthStateDesc);
  277. newPass->setDepthStencilState(depthState);
  278. }
  279. void GLBuiltinMaterialFactory::initDebugDraw3DShader()
  280. {
  281. String vsCode = "#version 400\n \
  282. \
  283. uniform mat4 matViewProj; \
  284. \
  285. in vec3 cm_position; \
  286. in vec4 cm_color0; \
  287. out vec4 color0; \
  288. \
  289. void main() \
  290. { \
  291. gl_Position = matViewProj * vec4(cm_position.xyz, 1); \
  292. color0 = cm_color0; \
  293. }";
  294. String psCode = "#version 400\n \
  295. \
  296. in vec4 color0; \
  297. out vec4 fragColor; \
  298. \
  299. void main() \
  300. { \
  301. fragColor = color; \
  302. }";
  303. HHighLevelGpuProgram vsProgram = HighLevelGpuProgram::create(vsCode, "vs_main", "glsl", GPT_VERTEX_PROGRAM, GPP_VS_4_0);
  304. HHighLevelGpuProgram psProgram = HighLevelGpuProgram::create(psCode, "ps_main", "glsl", GPT_FRAGMENT_PROGRAM, GPP_PS_4_0);
  305. vsProgram.synchronize();
  306. psProgram.synchronize();
  307. mDebugDraw3DShader = Shader::create("DebugDraw3DShader");
  308. mDebugDraw3DShader->addParameter("matViewProj", "matViewProj", GPDT_MATRIX_4X4);
  309. TechniquePtr newTechnique = mDebugDraw3DShader->addTechnique("GLRenderSystem", RendererManager::getCoreRendererName());
  310. PassPtr newPass = newTechnique->addPass();
  311. newPass->setVertexProgram(vsProgram);
  312. newPass->setFragmentProgram(psProgram);
  313. BLEND_STATE_DESC desc;
  314. desc.renderTargetDesc[0].blendEnable = true;
  315. desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
  316. desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
  317. desc.renderTargetDesc[0].blendOp = BO_ADD;
  318. HBlendState blendState = BlendState::create(desc);
  319. newPass->setBlendState(blendState);
  320. }
  321. }