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

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

1

08.07.2010, 12:50

Direct3D11 Shader & Buffer

Hallo,
ich schreibe gerade einen Direct3D11 VideoDriver für meine 3D Engine. Da ab DX10 nichts mehr ohne Shader zu machen ist, habe ich natürlich auch gleich mit dem Shader support für DX11 angefangen.
Kennt sich jemand von euch mit DX11 und den Shader Constant Tables bzw. dem Constant Buffer aus, der zum Manipulieren der Shader Variablen benötigt wird?
Der muss erstellt werden und eine Größe (in Bytes) erhalten. Wie kann man ermitteln, wie viel Bytes dieser Constant Buffer groß sein muss, damit alle manipulierbaren Shader Variablen (bzw. Shader Konstanten) da rein passen?
Oder kann man einfach eine bestimmte Größe angeben, damit da möglichst alles rein passt? z.B. 1024 als standard Wert?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »LukasBanana« (08.07.2010, 16:25)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

08.07.2010, 13:00

D3DReflect() ist was du suchst. Das liefert dir ein ID3D11ShaderReflection Interface mit dem du alle Informationen über den Shader abfragen kannst die du so brauchst.

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

3

08.07.2010, 13:16

Okay danke =)
Du scheinst dich mit DX11 ja schon gut aus zu kennen. Hätte nicht gedacht, dass mir dazu gleich jemand helfen kann.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

08.07.2010, 13:21

Naja, hab schon ein wenig damit gebastelt ;)

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

5

08.07.2010, 15:35

Kann es sein, dass das Format DXGI_FORMAT_R8G8B8A8_UINT für Vertex Colors nicht erlaubt ist??
Im Moment funktioniert das bei mir nur mit DXGI_FORMAT_R32G32B32_FLOAT bzw. DXGI_FORMAT_R32G32B32A32_FLOAT.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

08.07.2010, 15:54

Inwiefern nicht erlaubt? Sowas wie fixe Vertex Colors gibts doch in D3D11 sowieso nichtmehr, das is doch alles nur eine Frage wie dein Shader die Daten interpretiert. Zeig mal was du treibst (Shader, Input Layout, ...)

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

7

08.07.2010, 16:05

Meine Vertex Struktur:

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
static const s32 MAX_COUNT_OF_TEXTURES = 8;

struct Vertex3D
{
        //! Coordination (X, Y, Z)
        dim::vector3df Position;
        
        //! Normal (NX, NY, NZ)
        dim::vector3df Normal;
        
        //! Direct3D9 Color (A, R, G, B)
        u32 d3d9Color;
        
        //! Texture coordinates [8 for multi-texturing] (U, V, W)
        dim::vector3df TexCoord[MAX_COUNT_OF_TEXTURES];
        
        //! OpenGL Color (R, G, B, A)
        video::color oglColor;
        
        //! Fog coordinate (0.0 - 1.0)
        f32 Fog;
};


Vertex Layout:

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
    /* Internal nacros */
    #define SETUP_VERTEXLAYOUT(vert, name, index, fmt, slot, offset, stride)    \
        vert.SemanticName           = name;                                     \
        vert.SemanticIndex          = index;                                    \
        vert.Format                 = fmt;                                      \
        vert.InputSlot              = slot;                                     \
        vert.AlignedByteOffset      = offset;                                   \
        vert.InputSlotClass         = D3D11_INPUT_PER_VERTEX_DATA;              \
        vert.InstanceDataStepRate   = 0;                                        \
        offset += stride;
    
    /* Create the mesh vertex layout */
    D3D11_INPUT_ELEMENT_DESC* VertexLayout3D = new D3D11_INPUT_ELEMENT_DESC[11];
    
    s32 Offset = 0;
    
    SETUP_VERTEXLAYOUT(VertexLayout3D[0], "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, Offset, 12);
    SETUP_VERTEXLAYOUT(VertexLayout3D[1], "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, Offset, 16);
    
    for (s32 i = 0; i < 8; ++i)
    {
        SETUP_VERTEXLAYOUT(
            VertexLayout3D[2 + i], "TEXCOORD", i, DXGI_FORMAT_R32G32B32_FLOAT, 0, Offset, 12
        );
    }
    
    SETUP_VERTEXLAYOUT(VertexLayout3D[10], "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UINT, 0, Offset, 4);


Shader Programm:

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
// Vertex Shader

struct VertexOutput
{
    float4 Pos : SV_POSITION;
    float4 Color : COLOR0;
};

VertexOutput VertexMain(float4 Pos : POSITION, float4 Color : COLOR)
{
    VertexOutput Output;
    
    Output.Pos = Pos;
    Output.Color = Color;
    
    return Output;
}

// Pixel Shader

float4 PixelMain(VertexOutput Input) : SV_Target
{
    return Input.Color;
}


EDIT:
Neben bei würde mich noch interessieren, ob man einen Vertex bzw. Index Buffer (ID3D11Buffer) mit der Funktion "SetPrivateData" aktualisiert?
Wenn nicht, mit welcher Funktion dann?

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »LukasBanana« (08.07.2010, 17:07)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

08.07.2010, 16:29

Komisch, also ich geh mal davon aus dass das n Tippfehler is weil DXGI_FORMAT_R8G8B8A8_FLOAT kenn ich nicht. Angenommen da wär DXGI_FORMAT_R8G8B8A8_UINT sollte das aber eigentlich schon ok sein!?

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

9

08.07.2010, 16:41

Jo Tipfehler. Soll UINT sein :lol:

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

08.07.2010, 16:42

Ok, aber was genau geht jetzt dann nicht?

Werbeanzeige