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

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

1

03.08.2009, 21:00

diverse shader fragen

moinmoin :)

ich bin grade dabei mich entgültig von der FFP zu verabschieden.

dazu habe aber noch einige fragen, damit ich es auch richtig mache :)

wenn ich werte für die ID3DXConstantTable setze, geht das nur wenn der
dazugehörige shader aktiv ist, oder werden die werte intern gespeichert?

wenn ich mehrere lämpchen unterstützen will, schreibt man da besser
für jede anzahl einen spezialshader oder lässt man das einen shader
machen?

lohnt es sich, bestimmte aufwändige befehle mit if zu versehen?

Quellcode

1
val *= pow(x, y);


vs.

Quellcode

1
2
if (y != 0.f)
    val *= pow(x, y);


ist das setzen eines neuen shaders viel aufwändiger als z.b. eine textur,
oder sind diese ops nur wegen dem call (und evtl. flush) teuer?

das wärs erstmal, würde mich freuen wenn da einer klarheit schaffen könnte.
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

Beiträge: 774

Beruf: Student

  • Private Nachricht senden

2

03.08.2009, 22:45

zu meheren Lichtern:
Ab Shader 2.0 hast du die Möglichkeit Schleifen mit einer als konstante angegebenen Anzahl von Iterationen zu erstellen - das dürfte die Sache erleichtern :)

zu if:
Mit if sollte man in Shadern grundsätzlich sehr sehr vorsichtig umgehen.
Man unterscheidet Static und Dynamic Branching:
- Static Branching ist ab Shader 2.0 verfügbar; Static bedeutet, dass der geprüfte wert vor durchführen des Shaders festgesetzt wird. Du kannst damit ein bestimmtes Feature/Eigenschaft des Shaders vor dem rendern verändern, ohne einen neuen Shader einzusetzen.

- Dynamic Branching ist aber Shader 3.0 verfügbar: Hier kannst du nach Werten die je Pixel unterschiedlich sind prüfen. Das ganze ist allerdings mit höchster Vorsicht zugenießen und lohnt sich erst, wenn du wirklich sehr komplexe Rechnungen zum weglassen hast und - ohne Vorwissen vllt etwas verwirrend - die if-Bedingung möglichst flächenweise true oder false ist.
Ein Beispiel wo es sich meistens lohnt wären die geglätteten Kanten eins Softshadows: Die Kanten sind wesentlich komplexer zu berechnen als die unschattierte und die vollkommen schattierte Fläche. In deinem Beispiel solltest du das auf keinen Fall einsetzen - es sei den "y" ist eine Konstante die vor der Ausführung gesetzt wurde ;)

hier findest du sehr nützliche Tipps zu diesem und auch anderen Themen:
http://ati.amd.com/developer/brighton/04…er%20Tricks.pdf
Dynamic Branching findest du da unter "Dynamic Flow Control"

Beim Rest deiner Fragen kenne ich mich jetzt zugegebenermaßen nicht so gut aus :?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

03.08.2009, 22:54

Was die Constant Table angeht: Wird afair nix gespeichert -> geht nur wenn der Shader grad gesetzt is...

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

4

03.08.2009, 23:10

der wert wird von außen gesetzt. das hieße ja, dass das if "optimiert"
werden kann. zusammen mit schleifen würde mir das sehr helfen.

die frage ist jetzt nurnoch, wie die lichter gespeichert werden.

würde eine static-branched-if abfrage sinn machen? (point, spot...)

sollte man einfach z.b. 8 lichter hardcoded in den shader einbauen, oder
gibt es sowas wie dynamische arrays (größe vor dem durchlauf bekannt).
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

5

05.08.2009, 23:02

eine frage habe ich da noch. wenn ich im vertexshader einen wert
garnicht benutze, z.b. POSITION. wird dieser fehlende wert dann von
der gpu mitberechnet oder ist er uninitialisiert?
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

06.08.2009, 09:10

Ich versteh nicht ganz wie du das meinst!?

Gerade POSITION ist ein Ausnahmefall weil der Vertex Shader in jedem Fall eine POSITION zurückgeben muss.

Bleibt noch übrig:

a) Dein Shader verwendet POSITION aber deine VertexDeclaration stellt keine bereit.

b) Dein Shader verwendet keine POSITION aber deine VertexDeclaration stellt eine bereit.

c) Weder Shader noch VertexDeclaration wissen was von ner POSITION.

Zu a) kann ich sagen dass afair in dem Fall POSITION den Default-Wert (0, 0, 0, 1) haben sollte. Ohne jetzt Details der entsprechenden Grafiktreiber zu kennen wirds schwer eine genaue Aussage für die übrigen Fälle zu treffen. Ich denke aber dass du davon ausgehen kannst dass in den übrigen Fällen der einzige Overhead darin bestehen wird dass deine Vertices scheinbar eine POSITION haben die Speicher braucht aber nicht verwendet wird...

Falls es dir drum geht zu wissen ob die GPU auch TEXCOORD6 interpoliert wenn der Pixel Shader diese nicht verwendet: afaik sollte nur interpoliert werden was auch verwendet wird...

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

7

06.08.2009, 13:08

dachte man könnte sich so eine berechnung im shader sparen. dem scheint
aber nicht so zu sein. die D3DX***Shader funktion sagt mir auch, dass ich
alle 4 werte von POSITION schreiben müsste.

naja war nur ne idee :)

auf jeden fall tuts es jetzt.

thx@ all
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

8

08.08.2009, 21:59

(ich nutze den thread mal weiter :) )

wieder ein paar fragen von mir (hoffe ich nerfe nicht)

wie kann ich per ID3DXConstantTable an die texturstage kommen, die
die textur verwendet? ich verstehe "GetSamplerIndex" nicht wirklich,
und die erklärung ist auch nicht mehr als eine verschriftlchung des namens.

2tens:

ich habe ein

D3DPOOL_DEFAULT (was sonst)
D3DFMT_X8R8G8B8
D3DUSAGE_RENDERTARGET

rendertarget. (:) )

in das rendere ich die szene. danach rendere ich das berühmte
fullscreenquad:

C-/C++-Quelltext

1
2
3
4
5
device->GetDevice()->SetTexture(0, t1->GetTexture());
device->GetDevice()->SetVertexShader(0);
device->GetDevice()->SetPixelShader(0);
device->GetDevice()->SetFVF(quad[0].fvf);
device->GetDevice()->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, quad, sizeof(quad[0]));


ergebniss: grau (oder was grade so im backbuffer rumliegt)

jetzt speichere ich dieselbe textur ohne änderung in einer
bmp-datei mit D3DXSaveTextureToFile. das ergebniss sieht so aus wie
es soll.

2ter run: ich lade nun die einmal gespeicherte textur in eine

D3DFMT_X8R8G8B8
D3DPOOL_MANAGED
(kein rendertarget)

textur. das teil kommt wieder aufs quad. (selber rendercode) siehe da:
es funzt.

kann es sein, dass man eine D3DUSAGE_RENDERTARGET textur
nicht als normale textur verwenden kann? (shader sind aus)

EDIT: problem 2 ist gelöst. ein ID3DXMesh setzt intern ein neues FVF.
davon bekam meine engine ja nix mit und hat prompt das alte genommen
und damit eine änderung verworfen (aus ihrer sicht unnötig).
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

08.08.2009, 22:25

Zitat von »"Gotbread"«

(ich nutze den thread mal weiter :) )

wieder ein paar fragen von mir (hoffe ich nerfe nicht)


Eigentlich isses ja so gedacht dass man einen Thread pro Problem/Frage macht (obwohl bei dem Threadtitel isses eh schon egal ;) )

Zitat von »"Gotbread"«

wie kann ich per ID3DXConstantTable an die texturstage kommen, die
die textur verwendet? ich verstehe "GetSamplerIndex" nicht wirklich,
und die erklärung ist auch nicht mehr als eine verschriftlchung des namens.


TextureStages waren Teil der FFP, jener Teil der FFP der sich drum kümmerte die Farbwerte aus einzelnen Texturen zu verrechnen, also genau was durch PixelShader ersetzt wurde. Das was du meinst sind Sampler. Ein Sampler ist im Prinzip jenes Ding dass einen Farbwert an bestimmten Texturkoordinaten aus einer Textur liest (die Textur "sampled"). Ein Sampler hat verschiedene Einstellungen wie z.B. den zu verwendenden Texturfilter oder den Adressierungsmodus die du mit SetSamplerState() setzen kannst. Bei SetTexture() gibst duch auch den Index des Samplers an an den die Textur gebunden werden soll...

Zitat von »"Gotbread"«

[...] kann es sein, dass man eine D3DUSAGE_RENDERTARGET textur
nicht als normale textur verwenden kann? (shader sind aus)


Doch kann man schon. Der Grund hierfür kann alles mögliche sein. Wird dein Quad vielleicht weggeclipped oder vom z-Buffer gekillt? schwer zu sagen...

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

10

09.08.2009, 14:02

d.h. einfach GetSamplerIndex mit dem textur-handle füttern?
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

Werbeanzeige