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

18.08.2005, 10:05

[GELÖST] VertexDecl. in EffectFiles

Hallo Leute

Ich hab n'paar EffectFiles mit verschiedenen Shadern drin. jeder von denen braucht eine eigene VertexDecl. meine Frage: Wie macht ihr das? Schließlich kann man die Decl. nicht im EffectFile speichern :( - wie ich es ursprünglich machen wollte...

mfg Markus-Lanner

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

18.08.2005, 12:10

Zitat

Schließlich kann man die Decl. nicht im EffectFile speichern


nicht direkt speichern...

üblicherweise macht man das z.B. so in der art:

Quellcode

1
2
3
4
5
6
7
struct VertexIN
{

    float4  pos : POSITION;
    float4  normal : NORMAL;

} vertex : VERTEXDECL;


über die semantic VERTEXDECL kannst du die struktur identifizieren und dir dann aus den struct members eine vertex decl bauen.
wichtig ist, dass es von dem struct eine instanz geben muss (wie vertex in diesem bsp), sonst kannst du nicht drauf zugreifen...

3

18.08.2005, 13:58

Meine Effectdatei sieht so aus:

C-/C++-Quelltext

1
2
3
4
5
6
struct VS_INPUT
{
    float4 Pos: POSITION;
    float2 TexCoords : TEXCOORD0;
    float4 Proportion : COLOR0;
} Vertex : VERTEXDECL;


Mein Programm so

C-/C++-Quelltext

1
2
3
4
5
6
7
8
    // VertexDecl speichern

    char *pchBuffer = (char*)WM_ALLOC(10);
    D3DXHANDLE Handle;
    Handle = this->pEffect->GetParameterBySemantic(NULL, "VERTEXDECL");
    hResult = this->pEffect->(Handle, pchBuffer, 10);
    if (FAILED(hResult)) {
        WM_ERROR_DIRECTX("GetValue", hResult, wmGraphic_ERROR);
    }


Er bekommt ein Handle, allerdings bekomm ich mit GetValue nur den Fehler INVALID_CALL - Woran liegt das?

mfg Markus

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

18.08.2005, 14:07

1. Du prüfst nicht, ob Handle != NULL
2. Warum gerade 10 Bytes?

5

18.08.2005, 14:10

habs mir im Debugger angeschaut --> Das Handle bekommt einen Wert... Warum 10Bytes? - einfach nur um zu Testen ob ich überhaupt was bekomme (30 sollte es haben (glaub ich))

6

18.08.2005, 16:24

@Dot: Die Theorie hab ich ja verstanden, doch hab ich keine Ahnung, wie das zu realisieren ist...

1. Wie krieg ich die Größe der Struktur herraus?
2. Wie lese ich diese "unbekannte" Struktur aus?

Hast du vielleicht ne Demo, in Doku und INet konnte ich nichts finden

mfg Markus

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

18.08.2005, 16:40

ich denke

ID3DXEffect::GetParameterDesc()

und

ID3DXEffect::GetParameter()

sollten helfen

8

18.08.2005, 17:19

Schön langsam komm ich mir echt blöd vor...

Deine Kommandos funzen wunderbar: Er sagt es sind 40Bytes, 3 Zeilen, es ist eine Struktur (alles okay) vom Typ !! VOID* !! Kennt zufällig jemand die Struktur in die ich diese Daten (oder halt eine Zeile davon)

Quellcode

1
2
3
4
5
6
struct VS_INPUT
{
    float4 Pos: POSITION;
    float2 TexCoords : TEXCOORD0;
    float4 Proportion : COLOR0;
} Vertex : VERTEXDECL;


speichern kann?

mfg Markus

9

18.08.2005, 17:55

ich mag effect-files nicht und ich kenn mich damit auch nicht wirklich aus
aber sollte des id3dx-interface für die effekte nicht
automatisch die vertex-dekleration erzeugen/setzen die
ihr in den files drin habt????

10

18.08.2005, 19:34

Danke an Dot für die Hilfe...

Sollte mal jemand zufällig dasselbe Problem haben wie ich, so folgt der komplette Auslesecode:

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
    D3DXHANDLE HandleStruct;
    D3DXHANDLE HandleStructMember;
    D3DXPARAMETER_DESC ParameterDesc;
    D3DXPARAMETER_DESC ParameterDescMember;

    // Handle auf Struktur holen

    HandleStruct = this->pEffect->GetParameterBySemantic(NULL, "VERTEXDECL");
    if (HandleStruct == NULL) {
        WM_ERROR("GetParameterBySemantic() ist NULL", wmGraphic_ERROR);
    }
    // b eschreibung der Struktur holen

    hResult = this->pEffect->GetParameterDesc(HandleStruct, &ParameterDesc);
    if (FAILED(hResult)) {
        WM_ERROR_DIRECTX("GetParameterDesc", hResult, wmGraphic_ERROR);
    }
    // Jeden Member (Variable) der Struktur durchlaufen

    for (int iMember = 0; iMember < (int)ParameterDesc.StructMembers; iMember++) {
        // Handle auf Member holen

        HandleStructMember = this->pEffect->GetParameter(HandleStruct, iMember);
        if (HandleStructMember == NULL) {
            WM_ERROR("GetParameter() ist NULL", wmGraphic_ERROR);
        }
        // Beschreibung auf Member holen

        hResult = this->pEffect->GetParameterDesc(HandleStructMember, &ParameterDescMember);
        if (FAILED(hResult)) {
            WM_ERROR_DIRECTX("GetParameterDesc", hResult, wmGraphic_ERROR);
        }
        // ParameterDescMember enthält die Infos über die Variable (Typ, Größe, ...)

        // Damit kann man optimal die VertexDeclaration erstellen

    }


zu diesem Effect:

Quellcode

1
2
3
4
5
6
struct VS_INPUT
{
    float4 Pos: POSITION;
    float2 TexCoords : TEXCOORD0;
    float4 Proportion : COLOR0;
} Vertex : VERTEXDECL;


mfg Markus[/code]

Werbeanzeige