FontShaderClass.cs 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. using System;
  2. using System.Threading.Tasks;
  3. using System.Windows.Forms;
  4. using SlimDX;
  5. using SlimDX.D3DCompiler;
  6. using SlimDX.Direct3D11;
  7. using SlimDX.DXGI;
  8. using SlimDX.Windows;
  9. using Device = SlimDX.Direct3D11.Device;
  10. using Resource = SlimDX.Direct3D11.Resource;
  11. using Buffer = SlimDX.Direct3D11.Buffer;
  12. namespace EQ2ModelViewer
  13. {
  14. public class FontShaderClass
  15. {
  16. private struct MatrixBufferType
  17. {
  18. public Matrix world;
  19. public Matrix view;
  20. public Matrix projection;
  21. }
  22. private struct PixelBufferType
  23. {
  24. public Vector4 pixelColor;
  25. }
  26. private VertexShader m_VertexShader;
  27. private PixelShader m_PixelShader;
  28. private InputLayout m_Layout;
  29. private Buffer m_MatrixBuffer;
  30. private SamplerState m_SamplerState;
  31. private Buffer m_PixelBuffer;
  32. public bool Initialize(Device device)
  33. {
  34. return InitializeShader(device, "Font.vs", "Font.ps");
  35. }
  36. private bool InitializeShader(Device device, string vertexShader, string pixelShader)
  37. {
  38. ShaderSignature inputSignature;
  39. string error;
  40. // load and compile the vertex shader
  41. using (var bytecode = ShaderBytecode.CompileFromFile(vertexShader, "FontVertexShader", "vs_5_0", ShaderFlags.EnableStrictness, EffectFlags.None, null, null, out error))
  42. {
  43. inputSignature = ShaderSignature.GetInputSignature(bytecode);
  44. m_VertexShader = new VertexShader(device, bytecode);
  45. }
  46. if (m_VertexShader == null)
  47. {
  48. Console.WriteLine("InitializeShader: Error creating vertex shader: " + error);
  49. return false;
  50. }
  51. // load and compile the pixel shader
  52. using (var bytecode = ShaderBytecode.CompileFromFile(pixelShader, "FontPixelShader", "ps_5_0", ShaderFlags.EnableStrictness, EffectFlags.None, null, null, out error))
  53. m_PixelShader = new PixelShader(device, bytecode);
  54. if (m_PixelShader == null)
  55. {
  56. Console.WriteLine("InitializeShader: Error creating pixel shader: " + error);
  57. return false;
  58. }
  59. var elements = new[] {
  60. new InputElement("POSITION", 0, Format.R32G32B32_Float, 0, 0, InputClassification.PerVertexData, 0),
  61. new InputElement("TEXCOORD", 0, Format.R32G32_Float, -1, 0, InputClassification.PerVertexData, 0) };
  62. m_Layout = new InputLayout(device, inputSignature, elements);
  63. m_MatrixBuffer = new Buffer(device, System.Runtime.InteropServices.Marshal.SizeOf(typeof(MatrixBufferType)), ResourceUsage.Dynamic, BindFlags.ConstantBuffer, CpuAccessFlags.Write, ResourceOptionFlags.None, 0);
  64. if (m_MatrixBuffer == null)
  65. {
  66. Console.WriteLine("InitializeShader: Unable to create the matrix buffer.");
  67. return false;
  68. }
  69. SamplerDescription samplerDesc = new SamplerDescription();
  70. samplerDesc.Filter = Filter.MinMagMipLinear;
  71. samplerDesc.AddressU = TextureAddressMode.Wrap;
  72. samplerDesc.AddressV = TextureAddressMode.Wrap;
  73. samplerDesc.AddressW = TextureAddressMode.Wrap;
  74. samplerDesc.MipLodBias = 0.0f;
  75. samplerDesc.MaximumAnisotropy = 1;
  76. samplerDesc.ComparisonFunction = Comparison.Always;
  77. samplerDesc.BorderColor = new Color4(0.0f, 0.0f, 0.0f, 0.0f);
  78. samplerDesc.MinimumLod = 0;
  79. samplerDesc.MaximumLod = 3.402823466e+38f; // from d3d11.h, #define D3D11_FLOAT32_MAX ( 3.402823466e+38f )
  80. m_SamplerState = SamplerState.FromDescription(device, samplerDesc);
  81. if (m_SamplerState == null)
  82. {
  83. Console.WriteLine("InitializeShader: Unable to create the sampler state.");
  84. return false;
  85. }
  86. m_PixelBuffer = new Buffer(device, System.Runtime.InteropServices.Marshal.SizeOf(typeof(PixelBufferType)), ResourceUsage.Dynamic, BindFlags.ConstantBuffer, CpuAccessFlags.Write, ResourceOptionFlags.None, 0);
  87. if (m_PixelBuffer == null)
  88. {
  89. Console.WriteLine("InitializeShader: Unable to create the pixel buffer.");
  90. return false;
  91. }
  92. return true;
  93. }
  94. public void ShutDown()
  95. {
  96. m_VertexShader.Dispose();
  97. m_PixelShader.Dispose();
  98. m_Layout.Dispose();
  99. m_MatrixBuffer.Dispose();
  100. m_SamplerState.Dispose();
  101. m_PixelBuffer.Dispose();
  102. }
  103. private bool SetShaderParameters(DeviceContext context, Matrix worldMatrix, Matrix viewMatrix, Matrix projectionMatrix, ShaderResourceView texture, Vector4 PixelColor)
  104. {
  105. Matrix.Transpose(ref worldMatrix, out worldMatrix);
  106. Matrix.Transpose(ref viewMatrix, out viewMatrix);
  107. Matrix.Transpose(ref projectionMatrix, out projectionMatrix);
  108. var mappedResource = context.MapSubresource(m_MatrixBuffer, 0, MapMode.WriteDiscard, SlimDX.Direct3D11.MapFlags.None);
  109. MatrixBufferType data = new MatrixBufferType();
  110. data.world = worldMatrix;
  111. data.view = viewMatrix;
  112. data.projection = projectionMatrix;
  113. mappedResource.Data.Write<MatrixBufferType>(data);
  114. context.UnmapSubresource(m_MatrixBuffer, 0);
  115. context.VertexShader.SetConstantBuffer(m_MatrixBuffer, 0);
  116. context.PixelShader.SetShaderResource(texture, 0);
  117. mappedResource = context.MapSubresource(m_PixelBuffer, 0, MapMode.WriteDiscard, SlimDX.Direct3D11.MapFlags.None);
  118. PixelBufferType data2 = new PixelBufferType();
  119. data2.pixelColor = PixelColor;
  120. mappedResource.Data.Write<PixelBufferType>(data2);
  121. context.UnmapSubresource(m_PixelBuffer, 0);
  122. context.PixelShader.SetConstantBuffer(m_PixelBuffer, 0);
  123. return true;
  124. }
  125. public bool Render(DeviceContext context, int indexCount, Matrix worldMatrix, Matrix viewMatrix, Matrix projectionMatrix, ShaderResourceView texture, Vector4 PixelColor)
  126. {
  127. if (!SetShaderParameters(context, worldMatrix, viewMatrix, projectionMatrix, texture, PixelColor))
  128. return false;
  129. RenderShader(context, indexCount);
  130. return true;
  131. }
  132. private void RenderShader(DeviceContext context, int indexCount)
  133. {
  134. // Set the vertex input layout
  135. context.InputAssembler.InputLayout = m_Layout;
  136. // Set the vertex and pixel shaders that will be used to render
  137. context.VertexShader.Set(m_VertexShader);
  138. context.PixelShader.Set(m_PixelShader);
  139. // Set the sampler state in the pixel shader
  140. context.PixelShader.SetSampler(m_SamplerState, 0);
  141. // Render
  142. context.DrawIndexed(indexCount, 0, 0);
  143. }
  144. }
  145. }