Seite 1 von 1

[HLSL] cbuffer deklarieren

Verfasst: 09.08.2018, 06:17
von Krishty
Ich möchte den selben Constant Buffer in zwei Shadern verwenden, in unterschiedlichen Slots:

  // Vertex shader:
  cbuffer Light : register(b0) {
    float3 pos   : packoffset(c0);
    float3 color : packoffset(c1);
  };

  // Pixel Shader:
  cbuffer Light : register(b7) {
    float3 pos   : packoffset(c0);
    float3 color : packoffset(c1);
  };


Kriege ich das hin, ohne das Layout doppelt hinzuschreiben? Ich habe versucht, ihn zu deklarieren, aber ohne Erfolg:

  // Gemeinsamer Header:
  cbuffer Light {
    float3 pos   : packoffset(c0);
    float3 color : packoffset(c1);
  };

  // Vertex Shader:
  cbuffer Light : b0; // error

  Pixel Shader:
  cbuffer Light: b7; // error


grrrrnnnngh

Re: [HLSL] cbuffer deklarieren

Verfasst: 09.08.2018, 16:35
von unbird
Sollte laut Doku mittels optionalem shader_profile/target möglich sein. Sollte. Nur kriegt man z.B. für sowas:

Code: Alles auswählen

cbuffer SomeBuffer :  register( ps, b0 ) : register( vs, b1 )
{
   // whatever
};
dann diese Fehlermeldung:

error X3515: User defined constant buffer slots cannot be target specific

Gurgelt man nach dieser Fehlermeldung kommt man auch nicht weiter.

In der Tat grrr. Sehe für einen workaround lediglich irgend einen Makro-Murks :/

Re: [HLSL] cbuffer deklarieren

Verfasst: 09.08.2018, 22:53
von Krishty
Wow, die Syntax war mir nicht aufgefallen! Unter bestimmten Umständen ist die sicher nützlich. Bringt mich hier nicht weiter, aber ich habe zumindest was gelernt. Ich dupliziere die verdammten structs einfach … was soll’s … :(

Re: [HLSL] cbuffer deklarieren

Verfasst: 10.08.2018, 04:14
von Zudomon
Mir ist gerade eingefallen, dass ich damals ja auch mal kurze Zeit DX10 gemacht habe.
Also habe ich nun mal in meinem alten Projekt gestöbert: Tatsächlich hatte ich auch cbuffer genutzt. Jetzt weiß ich allerdings nicht, ob die Situation die gleiche ist. Ich hatte die in einem Effektfile.

Also scheinbar sind cbuffer gar nicht als Structs anzusehen, sondern eher als Gruppenname für eine Menge an Variablen.
Ich hatte da die Slots gar nicht spezifiziert...

Code: Alles auswählen

cbuffer cbObject
{
    matrix World;
    matrix WorldNor;
    matrix WorldNorm;
    float4 vMeshColor;
    float4 Campos;
    float4 Thickness;
    bool bSingleColor;
    bool bLighttrans;
    bool bLight;
    bool bAlphatest;
    bool bFog;
    bool bObjNor;
    bool bNewTex;
    float4 ObjNor;
    float4 Time;
};
Und später im Code wurden die Variablen direkt angesprochen... also da hieß es dann z.B. float4 col = vMeshColor;

Arrays:

Code: Alles auswählen

cbuffer cbLight
{
   float4 Light_Pos[256];
   float4 Light_Color[256];
};
Ich hoffe mal, das bringt dich weiter.

Re: [HLSL] cbuffer deklarieren

Verfasst: 10.08.2018, 07:24
von Krishty
Nein, leider nicht – so bindest du die Buffer immer nur an den ersten Slot (b0). Ich möchte den selben Buffer je nach Verwendung an unterschiedliche Slots binden …