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

24.08.2010, 22:05

Fragen zu meheren Constantbuffers

Guten Abend,

in mein Shader hab ich mehere Constantbuffer angelegt, einen für die Matrizen, einen für Licht und einen für die Materialeigentschaften. Wenn ich in mein Programm mit meheren Constantbuffer erstellen will, werden die 2 letzen Constantbuffer nicht erzeugt, die Funktion wirft als Fehlercode "E_INVALIDARG". Ich erstelle alle 3 Constantbuffer gleich und der erste wird auch erstellt, deswegen wundert mich die Fehlermeldung. Den Constantbuffer erstelle ich als dynamischen Buffer. Nun zu meiner Frage, muss man irgentwas bei Constantbuffer beachten oder was mache ich da falsch?

Vielen Dank im voraus
Mfg male

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

24.08.2010, 23:08

Zeig mal was genau du machst...

3

24.08.2010, 23:38

Also erstellen tu ich den Constantbuffer so:

C-/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
struct MatrixBuffer
{
    CMatrix WorldViewProjection;
};

struct Material
{
    CColor Ambient;
    CColor Diffuse;
};

struct Light
{
    CColor Ambient;
    CColor Diffuse;
    CVector3 Direction;
};

void CreateConstantbuffer(Device* pDevice, unsigned int Size) 
{
    D3D11_BUFFER_DESC Desc
    ZeroMemory(&Desc, sizeof(Desc));

    Desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
    Desc.ByteWidth = Size;
    Desc.Usage = D3D11_USAGE_DYNAMIC;
    Desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;

    pDevice->GetDevice()->CreateBuffer(&Desc, NULL, &cBuffer);
}

void Fuu()
{
    CreateConstantbuffer(Device, sizeof(MatrixBuffer));
    CreateConstantbuffer(Device, sizeof(Material)); // <- E_INVALIDARG
    CreateConstantbuffer(Device, sizeof(Light)); // <- E_INVALIDARG
}
}


Ungefähr so erstelle ich mein Constantbuffer, der erste Constantbuffer wird erstellt, ab dem zweiten nicht mehr

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

24.08.2010, 23:53

Zitat von »DX SDK Doku«

If the bind flag is D3D11_BIND_CONSTANT_BUFFER then the ByteWidth value must be in multiples of 16, and less than or equal to D3D11_REQ_CONSTANT_BUFFER_ELEMENT_COUNT.

;)

5

25.08.2010, 16:43

Ah ok, vielen Dank :) , wenn ich es mal 16 nehme klappt es, aber ne frage, warum klappt es beim ersten Constantbuffer ohne das ich ihn mal 16 nehme?

Mfg male

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

25.08.2010, 16:46

Weil der zufällig genau ne Größe von 16 Byte hat ;)

7

25.08.2010, 17:10

Müssten die nicht eher einer Größe von 192 Bytes haben, weil doch 3 Matrizen in der Struktur sind, die jeweil eine Größe von 64 Bytes haben? Oder hab ich da ein Denkfehler drinne? ^^

Mfg male

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

25.08.2010, 17:14

Eine 4x4 Matrix aus floats hat genau 16 Byte ;)

9

28.08.2010, 13:59

Noch eine Frage, muss der Constantbuffer genauso viel Bytes haben wie der in Shader? Ich kann den Constantbuffer nämlich nur einmal aktualisieren und dann bricht er das mit einer Fehlermeldung ab, und die Werte kommen auch in Shader nicht an.

Mfg male

BlazeX

Alter Hase

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

Werbeanzeige