1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
class Triangle
{
private ShaderBytecode vertexShaderByteCode;
private ShaderBytecode pixelShaderByteCode;
private VertexShader vertexShader;
private PixelShader pixelShader;
private SharpDX.Direct3D11.Buffer vertexBuffer;
private InputLayout inputLayout;
private SharpDX.Direct3D11.Buffer constBuffer;
private ConstBufferData constData;
public void Initialize(Device device, DeviceContext context)
{
// Kompiliere den vertex und den pixelshader
vertexShaderByteCode = ShaderBytecode.CompileFromFile("shaders.hlsl", "VShader", "vs_4_0");
pixelShaderByteCode = ShaderBytecode.CompileFromFile("shaders.hlsl", "PShader", "ps_4_0");
// Weise den generierten bytecode den jeweiligen shader zu
vertexShader = new VertexShader(device, vertexShaderByteCode);
pixelShader = new PixelShader(device, pixelShaderByteCode);
// Setze den Vertex und den Pixel Shader in den DeviceContext
context.VertexShader.Set(vertexShader);
context.PixelShader.Set(pixelShader);
// erstelle die jeweiligen elemente für die POSITION variable und die COLOR variable
InputElement[] elements = new InputElement[]
{
new InputElement("POSITION", 0, SharpDX.DXGI.Format.R32G32B32A32_Float, 0, 0),
new InputElement("COLOR", 0, SharpDX.DXGI.Format.R32G32B32A32_Float, 16, 0)
};
// erstelle einen vertex array
Vertex[] vertices = new Vertex[]
{
new Vertex(0.0f, 1f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f),
new Vertex(1f, -1f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f),
new Vertex(-1f, -1f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f)
};
// Erstelle eine buffer description. diese besagt den buffer den er zugewiesen wird was er sein soll und wie er mit den daten umgehen soll
BufferDescription description = new BufferDescription(3 * 32, ResourceUsage.Dynamic, BindFlags.VertexBuffer, CpuAccessFlags.Write, ResourceOptionFlags.None, 0);
// Erstelle den VertexBuffer mit der angegebenen description
vertexBuffer = SharpDX.Direct3D11.Buffer.Create<Vertex>(device, vertices, description);
// Erstelle einen inputLayout diese verbindet die input elemente mit den jeweiligen shader bytecode
inputLayout = new InputLayout(device, vertexShaderByteCode, elements);
constData.world = Matrix.Translation(new Vector3(0, 0, 20));
constData.view = Matrix.LookAtLH(new Vector3(0, 0, 0), new Vector3(0, 0, 1), Vector3.Up);
constData.projection = Matrix.PerspectiveFovLH(MathUtil.PiOverFour, 800f / 600f, 0.1f, 1000f);
BufferDescription constBufferDescription = new BufferDescription(Marshal.SizeOf(constData), ResourceUsage.Dynamic, BindFlags.ConstantBuffer, CpuAccessFlags.Write, ResourceOptionFlags.None, 0);
constBuffer = SharpDX.Direct3D11.Buffer.Create(device, ref constData, constBufferDescription);
context.VertexShader.SetConstantBuffer(0, constBuffer);
}
public void Render(DeviceContext context)
{
context.UpdateSubresource(ref constData, constBuffer);
context.InputAssembler.InputLayout = inputLayout;
context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(vertexBuffer, 32, 0));
context.InputAssembler.PrimitiveTopology = SharpDX.Direct3D.PrimitiveTopology.TriangleList;
context.Draw(3, 0);
}
}
|