Mehrfach das selbe Model mit einem Drawcall und Shader rendern



  • Ich habe mir einiges zu Shadern und HLSL durchgelesen. Ich versuche momentan gedanklich nachzuvollziehen wie man am besten eine Variable Anzahl eines Modells an verschiedene Positionen rendert, indem man nur einen Drawcall und einen Shader benutzt, man kann als Beispiel Panzer in einem Strategie Spiel nehmen, es sind mal mehr mal weniger viele von ihnen da.

    Meine herangehensweise war die, ich habe einen Vertex und Indexbuffer mit dem Modell, wenn ich jetzt 20 Modelle brauche hole ich einen 2. Vertex und Indexbuffer und Kopiere das Model 20 mal hintereinander hinein und passe die Indices an. Dann hole ich einen Constantbuffer in dem ich die 20 Matrizensätze und Zusatzdaten ablege, einen pro Modell. Je nachdem zu welchem Model der Vertex gehört soll eine andere Matrize verwendet werden, wäre ja mit % und der VertexID kein Problem. Mein Problem ist allerdings hier der Constantbuffer.

    So hier bräuchte ich ihn im Shader:

    struct matrizen
    {
        row_major float4x4 matrix1;
        row_major float4x4 matrix2;
    }
    
    cbuffer modelmatrizen : register(b0)
    {
        uint models;//anzahl der Modelle
        matrizen model[models];
    };
    

    Das Funktioniert so natürlich nicht, da das Array statisch sein muß.

    Die einzige Variante die mir einfällt wäre hier den Shader als String zu speichern, den zahlenwert immer passend zu verändern und den Shader neu zu Compilieren, oder das Array entsprechend groß genug zu machen.

    Ein alternativer Ansatz der mir noch kam war einen Vertexbuffer für zB 50 Modelle zu holen (größe jenachdem wie heufig das Model vorkommt), diesen und einen passenden Indexbuffer zu füllen, den Shader entsprechend einrichten und dann das ganze auf mehrere Drawcalls zu verteilen und nur den Constantbuffer zu wechseln.

    Meine Frage dazu ist jetzt, ist dieser Gedankenansatz soweit richtig? Oder wird es ganz anders gehandhabt?



  • Xebov schrieb:

    Ich habe mir einiges zu Shadern und HLSL durchgelesen. Ich versuche momentan gedanklich nachzuvollziehen wie man am besten eine Variable Anzahl eines Modells an verschiedene Positionen rendert, indem man nur einen Drawcall und einen Shader benutzt,

    Ganz einfach: http://msdn.microsoft.com/en-us/library/ee418898(VS.85).aspx und http://msdn.microsoft.com/en-us/library/ee418897(VS.85).aspx



  • Ich weiss nicht wie "es gemacht wird" (von den "grossen 3D Jungs" sozusagen).

    Aber hast du überhaupt mal ausprobiert, wie "teuer" es kommt, wenn du einfach mehrere Draw-Calls verwendest? Ich glaube nicht, dass es sonderlich schlimm wäre.

    Und ... würde es nicht reichen die Indizes mehrfach in den Index-Buffer zu kopieren? So dass man keine Kopien in einem grösseren Vertex-Buffer braucht?



  • @this->that:
    Jo, mit D3D10 geht das so.
    Mit D3D10 gibts ja sogar Geometry-Shader. Wäre wohl interessant zu wissen, ob der OP sich auf D3D10(+) oder D3D9 bezieht.



  • Danke, das von this->that ist genau das was ich wissen wollte.

    hustbaer schrieb:

    Aber hast du überhaupt mal ausprobiert, wie "teuer" es kommt, wenn du einfach mehrere Draw-Calls verwendest? Ich glaube nicht, dass es sonderlich schlimm wäre.

    Ausprobiert hab ichs nicht, es ging mehr darum es mal zu wissen. Schlimm ist relativ, wenn man soetwas mehrfach hat können da schon einige Calls zusammenkommen.

    hustbaer schrieb:

    Und ... würde es nicht reichen die Indizes mehrfach in den Index-Buffer zu kopieren? So dass man keine Kopien in einem grösseren Vertex-Buffer braucht?

    Stimmt das würde auch gehen, da die VertexID ja mitzählt.

    Ich bezog mich auf D3D10(+).



  • Sowas macht man schon ewig. Nennt sich "Geometry Instancing". Geht seit GF6 IIRC. Und rumkopieren muss man dafuer nichts. f'`8k

    Autocogito

    Gruß, TGGC (Was Gamestar sagt...)


Anmelden zum Antworten