[HLSL] cbuffer deklarieren

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
Krishty
Establishment
Beiträge: 6739
Registriert: 26.02.2009, 12:18
Benutzertext: state is the enemy
Kontaktdaten:

[HLSL] cbuffer deklarieren

Beitrag von Krishty » 09.08.2018, 06:17

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
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne

Benutzeravatar
unbird
Beiträge: 6
Registriert: 17.12.2015, 09:35

Re: [HLSL] cbuffer deklarieren

Beitrag von unbird » 09.08.2018, 16:35

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 :/

Benutzeravatar
Krishty
Establishment
Beiträge: 6739
Registriert: 26.02.2009, 12:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [HLSL] cbuffer deklarieren

Beitrag von Krishty » 09.08.2018, 22:53

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 … :(
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne

Benutzeravatar
Zudomon
Establishment
Beiträge: 2112
Registriert: 25.03.2009, 08:20
Kontaktdaten:

Re: [HLSL] cbuffer deklarieren

Beitrag von Zudomon » 10.08.2018, 04:14

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.

Benutzeravatar
Krishty
Establishment
Beiträge: 6739
Registriert: 26.02.2009, 12:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [HLSL] cbuffer deklarieren

Beitrag von Krishty » 10.08.2018, 07:24

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 …
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne

Antworten