BsD3D11BuiltinMaterialFactory.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493
  1. #include "BsD3D11BuiltinMaterialFactory.h"
  2. #include "BsRendererManager.h"
  3. #include "BsGpuProgram.h"
  4. #include "BsShader.h"
  5. #include "BsTechnique.h"
  6. #include "BsPass.h"
  7. #include "BsMaterial.h"
  8. #include "BsBlendState.h"
  9. #include "BsDepthStencilState.h"
  10. namespace BansheeEngine
  11. {
  12. void D3D11BuiltinMaterialFactory::startUp()
  13. {
  14. initSpriteTextShader();
  15. initSpriteImageShader();
  16. initDebugDraw2DClipSpaceShader();
  17. initDebugDraw2DScreenSpaceShader();
  18. initDebugDraw3DShader();
  19. initDockDropOverlayShader();
  20. initDummyShader();
  21. SAMPLER_STATE_DESC ssDesc;
  22. ssDesc.magFilter = FO_POINT;
  23. ssDesc.minFilter = FO_POINT;
  24. ssDesc.mipFilter = FO_POINT;
  25. mGUISamplerState = SamplerState::create(ssDesc);
  26. }
  27. void D3D11BuiltinMaterialFactory::shutDown()
  28. {
  29. mSpriteTextShader = nullptr;
  30. mSpriteImageShader = nullptr;
  31. mDebugDraw2DClipSpaceShader = nullptr;
  32. mDebugDraw2DScreenSpaceShader = nullptr;
  33. mDebugDraw3DShader = nullptr;
  34. mDockDropOverlayShader = nullptr;
  35. mDummyShader = nullptr;
  36. }
  37. const String& D3D11BuiltinMaterialFactory::getSupportedRenderSystem() const
  38. {
  39. static String renderSystem = "BansheeD3D11RenderSystem";
  40. return renderSystem;
  41. }
  42. HMaterial D3D11BuiltinMaterialFactory::createSpriteTextMaterial() const
  43. {
  44. HMaterial newMaterial = Material::create(mSpriteTextShader);
  45. newMaterial->setSamplerState("mainTexSamp", mGUISamplerState);
  46. return newMaterial;
  47. }
  48. HMaterial D3D11BuiltinMaterialFactory::createSpriteImageMaterial() const
  49. {
  50. HMaterial newMaterial = Material::create(mSpriteImageShader);
  51. newMaterial->setSamplerState("mainTexSamp", mGUISamplerState);
  52. return newMaterial;
  53. }
  54. HMaterial D3D11BuiltinMaterialFactory::createDebugDraw2DClipSpaceMaterial() const
  55. {
  56. return Material::create(mDebugDraw2DClipSpaceShader);
  57. }
  58. HMaterial D3D11BuiltinMaterialFactory::createDebugDraw2DScreenSpaceMaterial() const
  59. {
  60. return Material::create(mDebugDraw2DScreenSpaceShader);
  61. }
  62. HMaterial D3D11BuiltinMaterialFactory::createDebugDraw3DMaterial() const
  63. {
  64. return Material::create(mDebugDraw3DShader);
  65. }
  66. HMaterial D3D11BuiltinMaterialFactory::createDockDropOverlayMaterial() const
  67. {
  68. return Material::create(mDockDropOverlayShader);
  69. }
  70. HMaterial D3D11BuiltinMaterialFactory::createDummyMaterial() const
  71. {
  72. return Material::create(mDummyShader);
  73. }
  74. void D3D11BuiltinMaterialFactory::initSpriteTextShader()
  75. {
  76. String vsCode = " \
  77. float invViewportWidth; \
  78. float invViewportHeight; \
  79. float4x4 worldTransform; \
  80. \
  81. void vs_main( \
  82. in float3 inPos : POSITION, \
  83. in float2 uv : TEXCOORD0, \
  84. out float4 oPosition : SV_Position, \
  85. out float2 oUv : TEXCOORD0) \
  86. { \
  87. float4 tfrmdPos = mul(worldTransform, float4(inPos.xy, 0, 1)); \
  88. \
  89. float tfrmdX = -1.0f + (tfrmdPos.x * invViewportWidth); \
  90. float tfrmdY = 1.0f - (tfrmdPos.y * invViewportHeight); \
  91. \
  92. oPosition = float4(tfrmdX, tfrmdY, 0, 1); \
  93. oUv = uv; \
  94. } \
  95. ";
  96. String psCode = " \
  97. SamplerState mainTexSamp : register(s0); \
  98. Texture2D mainTexture : register(t0); \
  99. float4 tint; \
  100. \
  101. float4 ps_main(in float4 inPos : SV_Position, float2 uv : TEXCOORD0) : SV_Target \
  102. { \
  103. float4 color = float4(tint.rgb, mainTexture.Sample(mainTexSamp, uv).r * tint.a); \
  104. return color; \
  105. }";
  106. HGpuProgram vsProgram = GpuProgram::create(vsCode, "vs_main", "hlsl", GPT_VERTEX_PROGRAM, GPP_VS_4_0);
  107. HGpuProgram psProgram = GpuProgram::create(psCode, "ps_main", "hlsl", GPT_FRAGMENT_PROGRAM, GPP_PS_4_0);
  108. vsProgram.synchronize();
  109. psProgram.synchronize();
  110. mSpriteTextShader = Shader::create("TextSpriteShader");
  111. mSpriteTextShader->addParameter("worldTransform", "worldTransform", GPDT_MATRIX_4X4);
  112. mSpriteTextShader->addParameter("invViewportWidth", "invViewportWidth", GPDT_FLOAT1);
  113. mSpriteTextShader->addParameter("invViewportHeight", "invViewportHeight", GPDT_FLOAT1);
  114. mSpriteTextShader->addParameter("mainTexSamp", "mainTexSamp", GPOT_SAMPLER2D);
  115. mSpriteTextShader->addParameter("mainTexture", "mainTexture", GPOT_TEXTURE2D);
  116. mSpriteTextShader->addParameter("tint", "tint", GPDT_FLOAT4);
  117. TechniquePtr newTechnique = mSpriteTextShader->addTechnique("D3D11RenderSystem", RendererManager::getCoreRendererName());
  118. PassPtr newPass = newTechnique->addPass();
  119. newPass->setVertexProgram(vsProgram);
  120. newPass->setFragmentProgram(psProgram);
  121. BLEND_STATE_DESC desc;
  122. desc.renderTargetDesc[0].blendEnable = true;
  123. desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
  124. desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
  125. desc.renderTargetDesc[0].blendOp = BO_ADD;
  126. desc.renderTargetDesc[0].renderTargetWriteMask = 0x7; // Don't write to alpha
  127. HBlendState blendState = BlendState::create(desc);
  128. newPass->setBlendState(blendState);
  129. DEPTH_STENCIL_STATE_DESC depthStateDesc;
  130. depthStateDesc.depthReadEnable = false;
  131. depthStateDesc.depthWriteEnable = false;
  132. HDepthStencilState depthState = DepthStencilState::create(depthStateDesc);
  133. newPass->setDepthStencilState(depthState);
  134. }
  135. void D3D11BuiltinMaterialFactory::initSpriteImageShader()
  136. {
  137. String vsCode = " \
  138. float invViewportWidth; \
  139. float invViewportHeight; \
  140. float4x4 worldTransform; \
  141. \
  142. void vs_main( \
  143. in float3 inPos : POSITION, \
  144. in float2 uv : TEXCOORD0, \
  145. out float4 oPosition : SV_Position, \
  146. out float2 oUv : TEXCOORD0) \
  147. { \
  148. float4 tfrmdPos = mul(worldTransform, float4(inPos.xy, 0, 1)); \
  149. \
  150. float tfrmdX = -1.0f + (tfrmdPos.x * invViewportWidth); \
  151. float tfrmdY = 1.0f - (tfrmdPos.y * invViewportHeight); \
  152. \
  153. oPosition = float4(tfrmdX, tfrmdY, 0, 1); \
  154. oUv = uv; \
  155. } \
  156. ";
  157. String psCode = " \
  158. SamplerState mainTexSamp : register(s0); \
  159. Texture2D mainTexture : register(t0); \
  160. float4 tint; \
  161. \
  162. float4 ps_main(in float4 inPos : SV_Position, float2 uv : TEXCOORD0) : SV_Target \
  163. { \
  164. float4 color = mainTexture.Sample(mainTexSamp, uv); \
  165. return color * tint; \
  166. }";
  167. HGpuProgram vsProgram = GpuProgram::create(vsCode, "vs_main", "hlsl", GPT_VERTEX_PROGRAM, GPP_VS_4_0);
  168. HGpuProgram psProgram = GpuProgram::create(psCode, "ps_main", "hlsl", GPT_FRAGMENT_PROGRAM, GPP_PS_4_0);
  169. vsProgram.synchronize();
  170. psProgram.synchronize();
  171. mSpriteImageShader = Shader::create("ImageSpriteShader");
  172. mSpriteImageShader->addParameter("worldTransform", "worldTransform", GPDT_MATRIX_4X4);
  173. mSpriteImageShader->addParameter("invViewportWidth", "invViewportWidth", GPDT_FLOAT1);
  174. mSpriteImageShader->addParameter("invViewportHeight", "invViewportHeight", GPDT_FLOAT1);
  175. mSpriteImageShader->addParameter("mainTexSamp", "mainTexSamp", GPOT_SAMPLER2D);
  176. mSpriteImageShader->addParameter("mainTexture", "mainTexture", GPOT_TEXTURE2D);
  177. mSpriteImageShader->addParameter("tint", "tint", GPDT_FLOAT4);
  178. TechniquePtr newTechnique = mSpriteImageShader->addTechnique("D3D11RenderSystem", RendererManager::getCoreRendererName());
  179. PassPtr newPass = newTechnique->addPass();
  180. newPass->setVertexProgram(vsProgram);
  181. newPass->setFragmentProgram(psProgram);
  182. BLEND_STATE_DESC desc;
  183. desc.renderTargetDesc[0].blendEnable = true;
  184. desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
  185. desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
  186. desc.renderTargetDesc[0].blendOp = BO_ADD;
  187. desc.renderTargetDesc[0].renderTargetWriteMask = 0x7; // Don't write to alpha
  188. HBlendState blendState = BlendState::create(desc);
  189. newPass->setBlendState(blendState);
  190. DEPTH_STENCIL_STATE_DESC depthStateDesc;
  191. depthStateDesc.depthReadEnable = false;
  192. depthStateDesc.depthWriteEnable = false;
  193. HDepthStencilState depthState = DepthStencilState::create(depthStateDesc);
  194. newPass->setDepthStencilState(depthState);
  195. }
  196. void D3D11BuiltinMaterialFactory::initDebugDraw2DClipSpaceShader()
  197. {
  198. String vsCode = " \
  199. void vs_main( \
  200. in float2 inPos : POSITION, \
  201. in float4 color : COLOR0, \
  202. out float4 oPosition : SV_Position, \
  203. out float4 oColor : COLOR0) \
  204. { \
  205. oPosition = float4(inPos.xy, 0, 1); \
  206. oColor = color; \
  207. }";
  208. String psCode = " \
  209. float4 ps_main(in float4 inPos : SV_Position, in float4 color : COLOR0) : SV_Target \
  210. { \
  211. return color; \
  212. } \
  213. ";
  214. HGpuProgram vsProgram = GpuProgram::create(vsCode, "vs_main", "hlsl", GPT_VERTEX_PROGRAM, GPP_VS_4_0);
  215. HGpuProgram psProgram = GpuProgram::create(psCode, "ps_main", "hlsl", GPT_FRAGMENT_PROGRAM, GPP_PS_4_0);
  216. vsProgram.synchronize();
  217. psProgram.synchronize();
  218. mDebugDraw2DClipSpaceShader = Shader::create("DebugDraw2DClipSpaceShader");
  219. TechniquePtr newTechnique = mDebugDraw2DClipSpaceShader->addTechnique("D3D11RenderSystem", RendererManager::getCoreRendererName());
  220. PassPtr newPass = newTechnique->addPass();
  221. newPass->setVertexProgram(vsProgram);
  222. newPass->setFragmentProgram(psProgram);
  223. BLEND_STATE_DESC desc;
  224. desc.renderTargetDesc[0].blendEnable = true;
  225. desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
  226. desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
  227. desc.renderTargetDesc[0].blendOp = BO_ADD;
  228. HBlendState blendState = BlendState::create(desc);
  229. newPass->setBlendState(blendState);
  230. DEPTH_STENCIL_STATE_DESC depthStateDesc;
  231. depthStateDesc.depthReadEnable = false;
  232. depthStateDesc.depthWriteEnable = false;
  233. HDepthStencilState depthState = DepthStencilState::create(depthStateDesc);
  234. newPass->setDepthStencilState(depthState);
  235. }
  236. void D3D11BuiltinMaterialFactory::initDebugDraw2DScreenSpaceShader()
  237. {
  238. String vsCode = " \
  239. float invViewportWidth; \
  240. float invViewportHeight; \
  241. \
  242. void vs_main( \
  243. in float2 inPos : POSITION, \
  244. in float4 color : COLOR0, \
  245. out float4 oPosition : SV_Position, \
  246. out float4 oColor : COLOR0) \
  247. { \
  248. float tfrmdX = -1.0f + (inPos.x * invViewportWidth); \
  249. float tfrmdY = 1.0f - (inPos.y * invViewportHeight); \
  250. \
  251. oPosition = float4(tfrmdX, tfrmdY, 0, 1); \
  252. oColor = color; \
  253. }";
  254. String psCode = " \
  255. float4 ps_main(in float4 inPos : SV_Position, in float4 color : COLOR0) : SV_Target \
  256. { \
  257. return color; \
  258. } \
  259. ";
  260. HGpuProgram vsProgram = GpuProgram::create(vsCode, "vs_main", "hlsl", GPT_VERTEX_PROGRAM, GPP_VS_4_0);
  261. HGpuProgram psProgram = GpuProgram::create(psCode, "ps_main", "hlsl", GPT_FRAGMENT_PROGRAM, GPP_PS_4_0);
  262. vsProgram.synchronize();
  263. psProgram.synchronize();
  264. mDebugDraw2DScreenSpaceShader = Shader::create("DebugDraw2DScreenSpaceShader");
  265. mDebugDraw2DScreenSpaceShader->addParameter("invViewportWidth", "invViewportWidth", GPDT_FLOAT1);
  266. mDebugDraw2DScreenSpaceShader->addParameter("invViewportHeight", "invViewportHeight", GPDT_FLOAT1);
  267. TechniquePtr newTechnique = mDebugDraw2DScreenSpaceShader->addTechnique("D3D11RenderSystem", RendererManager::getCoreRendererName());
  268. PassPtr newPass = newTechnique->addPass();
  269. newPass->setVertexProgram(vsProgram);
  270. newPass->setFragmentProgram(psProgram);
  271. BLEND_STATE_DESC desc;
  272. desc.renderTargetDesc[0].blendEnable = true;
  273. desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
  274. desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
  275. desc.renderTargetDesc[0].blendOp = BO_ADD;
  276. HBlendState blendState = BlendState::create(desc);
  277. newPass->setBlendState(blendState);
  278. DEPTH_STENCIL_STATE_DESC depthStateDesc;
  279. depthStateDesc.depthReadEnable = false;
  280. depthStateDesc.depthWriteEnable = false;
  281. HDepthStencilState depthState = DepthStencilState::create(depthStateDesc);
  282. newPass->setDepthStencilState(depthState);
  283. }
  284. void D3D11BuiltinMaterialFactory::initDebugDraw3DShader()
  285. {
  286. String vsCode = "float4x4 matViewProj; \
  287. \
  288. void vs_main( \
  289. in float3 inPos : POSITION, \
  290. in float4 color : COLOR0, \
  291. out float4 oPosition : SV_Position, \
  292. out float4 oColor : COLOR0) \
  293. { \
  294. oPosition = mul(matViewProj, float4(inPos.xyz, 1)); \
  295. oColor = color; \
  296. }";
  297. String psCode = " \
  298. float4 ps_main(in float4 inPos : SV_Position, in float4 color : COLOR0) : SV_Target \
  299. { \
  300. return color; \
  301. } \
  302. ";
  303. HGpuProgram vsProgram = GpuProgram::create(vsCode, "vs_main", "hlsl", GPT_VERTEX_PROGRAM, GPP_VS_4_0);
  304. HGpuProgram psProgram = GpuProgram::create(psCode, "ps_main", "hlsl", 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("D3D11RenderSystem", 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. void D3D11BuiltinMaterialFactory::initDockDropOverlayShader()
  322. {
  323. String vsCode = " \
  324. float invViewportWidth; \
  325. float invViewportHeight; \
  326. \
  327. float4 tintColor; \
  328. float4 highlightColor; \
  329. float4 highlightActive; \
  330. \
  331. void vs_main( \
  332. in float2 inPos : POSITION, \
  333. in float4 color : COLOR0, \
  334. out float4 oPosition : SV_Position, \
  335. out float4 oColor : COLOR0) \
  336. { \
  337. float tfrmdX = -1.0f + (inPos.x * invViewportWidth); \
  338. float tfrmdY = 1.0f - (inPos.y * invViewportHeight); \
  339. \
  340. oPosition = float4(tfrmdX, tfrmdY, 0, 1); \
  341. \
  342. float4 highlight = highlightActive * color; \
  343. float highlightSum = highlight.x + highlight.y + \
  344. highlight.z + highlight.a; \
  345. \
  346. oColor = (1.0f - highlightSum) * tintColor + \
  347. highlightSum * highlightColor; \
  348. }";
  349. String psCode = " \
  350. float4 ps_main(in float4 inPos : SV_Position, in float4 color : COLOR0) : SV_Target \
  351. { \
  352. return color; \
  353. } \
  354. ";
  355. HGpuProgram vsProgram = GpuProgram::create(vsCode, "vs_main", "hlsl", GPT_VERTEX_PROGRAM, GPP_VS_4_0);
  356. HGpuProgram psProgram = GpuProgram::create(psCode, "ps_main", "hlsl", GPT_FRAGMENT_PROGRAM, GPP_PS_4_0);
  357. vsProgram.synchronize();
  358. psProgram.synchronize();
  359. mDockDropOverlayShader = Shader::create("DockDropOverlayShader");
  360. mDockDropOverlayShader->addParameter("invViewportWidth", "invViewportWidth", GPDT_FLOAT1);
  361. mDockDropOverlayShader->addParameter("invViewportHeight", "invViewportHeight", GPDT_FLOAT1);
  362. mDockDropOverlayShader->addParameter("tintColor", "tintColor", GPDT_FLOAT4);
  363. mDockDropOverlayShader->addParameter("highlightColor", "highlightColor", GPDT_FLOAT4);
  364. mDockDropOverlayShader->addParameter("highlightActive", "highlightActive", GPDT_FLOAT4);
  365. TechniquePtr newTechnique = mDockDropOverlayShader->addTechnique("D3D11RenderSystem", RendererManager::getCoreRendererName());
  366. PassPtr newPass = newTechnique->addPass();
  367. newPass->setVertexProgram(vsProgram);
  368. newPass->setFragmentProgram(psProgram);
  369. BLEND_STATE_DESC desc;
  370. desc.renderTargetDesc[0].blendEnable = true;
  371. desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
  372. desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
  373. desc.renderTargetDesc[0].blendOp = BO_ADD;
  374. HBlendState blendState = BlendState::create(desc);
  375. newPass->setBlendState(blendState);
  376. DEPTH_STENCIL_STATE_DESC depthStateDesc;
  377. depthStateDesc.depthReadEnable = false;
  378. depthStateDesc.depthWriteEnable = false;
  379. HDepthStencilState depthState = DepthStencilState::create(depthStateDesc);
  380. newPass->setDepthStencilState(depthState);
  381. }
  382. void D3D11BuiltinMaterialFactory::initDummyShader()
  383. {
  384. String vsCode = "float4x4 matWorldViewProj; \
  385. \
  386. void vs_main( \
  387. in float3 inPos : POSITION, \
  388. out float4 oPosition : SV_Position) \
  389. { \
  390. oPosition = mul(matWorldViewProj, float4(inPos.xyz, 1)); \
  391. }";
  392. String psCode = "float4 ps_main() : SV_Target \
  393. { \
  394. return float4(0.5f, 0.5f, 0.5f, 0.5f); \
  395. }";
  396. HGpuProgram vsProgram = GpuProgram::create(vsCode, "vs_main", "hlsl", GPT_VERTEX_PROGRAM, GPP_VS_4_0);
  397. HGpuProgram psProgram = GpuProgram::create(psCode, "ps_main", "hlsl", GPT_FRAGMENT_PROGRAM, GPP_PS_4_0);
  398. vsProgram.synchronize();
  399. psProgram.synchronize();
  400. mDummyShader = Shader::create("DummyShader");
  401. mDummyShader->addParameter("matWorldViewProj", "matWorldViewProj", GPDT_MATRIX_4X4);
  402. TechniquePtr newTechnique = mDummyShader->addTechnique("D3D11RenderSystem", RendererManager::getCoreRendererName());
  403. PassPtr newPass = newTechnique->addPass();
  404. newPass->setVertexProgram(vsProgram);
  405. newPass->setFragmentProgram(psProgram);
  406. }
  407. }