[HLSL] cbuffer deklarieren

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.

[HLSL] cbuffer deklarieren

Beitragvon 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
Krishty
Establishment
 
Beiträge: 6591
Registriert: 26.02.2009, 12:18
Benutzertext: state is the enemy

Re: [HLSL] cbuffer deklarieren

Beitragvon 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: Ansicht erweitern :: 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
unbird
 
Beiträge: 6
Registriert: 17.12.2015, 09:35

Re: [HLSL] cbuffer deklarieren

Beitragvon 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
Krishty
Establishment
 
Beiträge: 6591
Registriert: 26.02.2009, 12:18
Benutzertext: state is the enemy

Re: [HLSL] cbuffer deklarieren

Beitragvon 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: Ansicht erweitern :: 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: Ansicht erweitern :: Alles auswählen
cbuffer cbLight
{
float4 Light_Pos[256];
float4 Light_Color[256];
};


Ich hoffe mal, das bringt dich weiter.
Benutzeravatar
Zudomon
Establishment
 
Beiträge: 2108
Registriert: 25.03.2009, 08:20

Re: [HLSL] cbuffer deklarieren

Beitragvon 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
Benutzeravatar
Krishty
Establishment
 
Beiträge: 6591
Registriert: 26.02.2009, 12:18
Benutzertext: state is the enemy


Zurück zu Grafikprogrammierung

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 3 Gäste