Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

01.04.2014, 23:34

[SharpDX] Dreieck wird nicht gerendert

Hi,
Ich bin neu hier im Forum, habe mich eigentlich auch nur Registriert weil ich nirgends wo eine lösung für mein
Problem gefunden habe. Ich wollte mich ja eigentlich erst vorstellen, habe aber keinen passenden unterordner hier im Forum gefunden.
In anderen Foren gibt es nämlich meistens einen Unterordner "Vorstellung neue Mitglieder im Forum" oder so.

egal nun zum eigentlichen Thema...

Ich arbeite seit ungefähr 3 Tagen mit SharpDX.
Da es dafür nicht viele Tutorials im Internet gibt habe ich mich mit DX11 Tutorials schlau gelesen und in SharpDX angewendet.
Nun bin ich bei meinem ersten Dreieck am verzweifeln, ich kann selber nicht genau sagen was da fehlt darum Poste ich hier erst mal den Code:

Hier habe ich eine Struktur mit der world, view und projection Matrizen definiert die ich nachher in den ConstantBuffer schreibe.

C#-Quelltext

1
2
3
4
5
6
public struct ConstBufferData
    {
        public Matrix world;
        public Matrix view;
        public Matrix projection;
    }


Dann habe ich mir eine Klasse Namens Triangle erstellt, die so aussieht:

C#-Quelltext

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);
        }
    }


Die habe ich dann in meiner selbst geschrienen Game Klasse instanziert und die beiden Methoden aufgerufen (Render natürlich im GameLoop).

Dann habe ich noch ein passenden HLSL Shader geschrieben der so aussieht:

HLSL-Quelltext

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
cbuffer matrixBuffer : register(b0)
{
    matrix world;
    matrix view;
    matrix projection;
};

struct VOut
{
    float4 position : SV_POSITION;
    float4 color    : COLOR;
};

VOut VShader(float4 position : POSITION, float4 color : COLOR)
{
    VOut output;

    output.position = mul(position, world);
    output.position = mul(output.position, view);
    output.position = mul(output.position, projection);
    output.color = color;

    return output;
}

float4 PShader(float4 position : SV_POSITION, float4 color : COLOR) : SV_TARGET
{
    return color;
}


Wenn ich das Programm jetzt ausführe wird nichts gerendert.
Aber wenn ich das Dreieck ohne Matrizen rendere, also im Shader die output position nur auf die position des Vertex setze,
funktioniert alles wunderbar.
Ich habe gestern und heute mit meinem momentanen SharpDX wissen nach dem fehler gesucht aber keinen gefunden.

Vielleicht könnt ihr mir ja helfen.

Edit: hab gerade bemerkt das, das Thema besser im "2D- und 3D-Grafik" bereich gepasst hätte, tut mir leid.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Grashaufen« (01.04.2014, 23:46)


FSA

Community-Fossil

  • Private Nachricht senden

2

02.04.2014, 09:03

Transponiere mal die Matrizen in deinem Code, bevor du sie in den ConstantBuffer schreibst.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

3

02.04.2014, 14:27

Danke! Hat funktioniert!

Werbeanzeige