D3DContent.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. using SharpDX;
  2. using SharpDX.D3DCompiler;
  3. using SharpDX.Direct3D;
  4. using System;
  5. using System.Linq;
  6. using System.Threading.Tasks;
  7. using SharpDX.Direct2D1;
  8. using SharpDX.Direct3D11;
  9. using SharpDX.DXGI;
  10. using SharpDX.Mathematics.Interop;
  11. using Buffer = SharpDX.Direct3D11.Buffer;
  12. using DeviceContext = SharpDX.Direct2D1.DeviceContext;
  13. using DxgiFactory1 = SharpDX.DXGI.Factory1;
  14. using Matrix = SharpDX.Matrix;
  15. using D3DDevice = SharpDX.Direct3D11.Device;
  16. using DxgiResource = SharpDX.DXGI.Resource;
  17. using FeatureLevel = SharpDX.Direct3D.FeatureLevel;
  18. using InputElement = SharpDX.Direct3D11.InputElement;
  19. namespace GpuInterop.D3DDemo;
  20. public class D3DContent
  21. {
  22. public static Buffer CreateMesh(D3DDevice device)
  23. {
  24. // Compile Vertex and Pixel shaders
  25. var vertexShaderByteCode = ShaderBytecode.CompileFromFile("D3DDemo\\MiniCube.fx", "VS", "vs_4_0");
  26. var vertexShader = new VertexShader(device, vertexShaderByteCode);
  27. var pixelShaderByteCode = ShaderBytecode.CompileFromFile("D3DDemo\\MiniCube.fx", "PS", "ps_4_0");
  28. var pixelShader = new PixelShader(device, pixelShaderByteCode);
  29. var signature = ShaderSignature.GetInputSignature(vertexShaderByteCode);
  30. var inputElements = new[]
  31. {
  32. new InputElement("POSITION", 0, Format.R32G32B32A32_Float, 0, 0),
  33. new InputElement("COLOR", 0, Format.R32G32B32A32_Float, 16, 0)
  34. };
  35. // Layout from VertexShader input signature
  36. var layout = new InputLayout(
  37. device,
  38. signature,
  39. inputElements);
  40. // Instantiate Vertex buffer from vertex data
  41. using var vertices = Buffer.Create(
  42. device,
  43. BindFlags.VertexBuffer,
  44. new[]
  45. {
  46. new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), // Front
  47. new Vector4(-1.0f, 1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f),
  48. new Vector4(1.0f, 1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f),
  49. new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f),
  50. new Vector4(1.0f, 1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f),
  51. new Vector4(1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f),
  52. new Vector4(-1.0f, -1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f), // BACK
  53. new Vector4(1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f),
  54. new Vector4(-1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f),
  55. new Vector4(-1.0f, -1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f),
  56. new Vector4(1.0f, -1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f),
  57. new Vector4(1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f),
  58. new Vector4(-1.0f, 1.0f, -1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f), // Top
  59. new Vector4(-1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f),
  60. new Vector4(1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f),
  61. new Vector4(-1.0f, 1.0f, -1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f),
  62. new Vector4(1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f),
  63. new Vector4(1.0f, 1.0f, -1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f),
  64. new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f), // Bottom
  65. new Vector4(1.0f, -1.0f, 1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f),
  66. new Vector4(-1.0f, -1.0f, 1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f),
  67. new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f),
  68. new Vector4(1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f),
  69. new Vector4(1.0f, -1.0f, 1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f),
  70. new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f), // Left
  71. new Vector4(-1.0f, -1.0f, 1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f),
  72. new Vector4(-1.0f, 1.0f, 1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f),
  73. new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f),
  74. new Vector4(-1.0f, 1.0f, 1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f),
  75. new Vector4(-1.0f, 1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f),
  76. new Vector4(1.0f, -1.0f, -1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f), // Right
  77. new Vector4(1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f),
  78. new Vector4(1.0f, -1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f),
  79. new Vector4(1.0f, -1.0f, -1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f),
  80. new Vector4(1.0f, 1.0f, -1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f),
  81. new Vector4(1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f),
  82. });
  83. // Create Constant Buffer
  84. var constantBuffer = new Buffer(device, Utilities.SizeOf<Matrix>(), ResourceUsage.Default,
  85. BindFlags.ConstantBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0);
  86. var context = device.ImmediateContext;
  87. // Prepare All the stages
  88. context.InputAssembler.InputLayout = layout;
  89. context.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
  90. context.InputAssembler.SetVertexBuffers(0,
  91. new VertexBufferBinding(vertices, Utilities.SizeOf<Vector4>() * 2, 0));
  92. context.VertexShader.SetConstantBuffer(0, constantBuffer);
  93. context.VertexShader.Set(vertexShader);
  94. context.PixelShader.Set(pixelShader);
  95. return constantBuffer;
  96. }
  97. }