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

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

1

07.06.2006, 17:18

Allgemeine Shader Fragen

Hallo!

Ich arbeite in letzter Zeit vermehrt mit Shadern, nun hab ich aber einige Probleme bzw. (Verständnis-)Fragen!

1) Kann man Shader irgendwie zur Laufzeit debuggen? Also so wie C++, mit Breakpoints usw...?

2) Wenn nicht, hat man irgendwie die Möglichkeit Daten auszugeben, in Dateien o.ä. oder kann man (was ich befürchte) nur die Funktionalität anhand des Resultats erkennen?!

3) Wenn ich einen Vertex transformier (mit der World-View-Projection-Matrix), dann sind seine xy Koords zwischen -1 und 1, oder? Demnach müsste ich ein gesamtes gerendertes Bild mit diesem Vertexshader nach linksoben verschieben können, oder?

C-/C++-Quelltext

1
2
3
4
//Vertex transformieren

float4 vTPos = mul(vInPos, mTransformation);
Out.vPosition.x = vTPos.x * 0.5f - 0.5f;
Out.vPosition.y = vTPos.y * 0.5f + 0.5f;


--> Funktioniert aber nicht!! :(

4) Wo kann man auf die Pixelkoordinaten zugreifen und diese manipulieren? Im Pixelshader?

5) Wenn man einen Vertex ignorieren will, und verwerfen, wie macht man das, gibt es da einen Befehl? Oder muss man dies einfach umgehen?

6) Mir ist der Übergang zwischen Vertex und Pixelshader noch nicht ganz klar. Wir jetzt erst der Vertexshader auf ALLE Vertize angewand, und danach interpoliert der Prozess (Rasterizer?) die TextureCoords schickt diese an den Pixelshader und dieser gibt dem Pixel dann eine Farbe, oder wird das für jeden Vertex separat gemacht?!

Einige Fragen werden sicherlich banal und blöd sein, sry!
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

2

07.06.2006, 22:16

Hey

Vorweg sorry für die Phrasenantwort, hab grad net viel Zeit :roll:

Such mal nach dem Programm "fxc.exe" in http://www.google.at.
Das ist ein Programm zum kompilieren von Shader. Außerdem kann man damit auch eine Debugdatei ausgeben. Gespeichert ist die gute Datei bei mir in diesem Verzeichnis: ".\DirectX SDK April 2006\Utilities\Bin\x86"

Ich hoffe ich konnte helfen

mfg Markus

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

08.06.2006, 03:52

Wenn Du den Zusammenhang zwischen Vertex- und Pixel-Shader noch nicht so ganz begriffen hast, solltest Du Dich vielleicht erstmal damit befassen, obwohl Dein Gedankengang nicht ganz verkehrt ist...
Vielleicht erübrigen sich die anderen Punkte dann ja...?
Verstehst Du den Sinn bzw. die Funktionalität der World-View-Projection-Matrix; oder einer der Matrizen "World", "View" und "Projection"?
Pixelkoordinaten kannst Du nicht manipulieren. Jedes Pixel hat seine feste Position innerhalb des Render-Targets. Du kannst lediglich die "Werte" beeinflussen, die ein bestimmtes Pixel annehmen kann.

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

4

08.06.2006, 13:19

Zitat von »"Steven77"«

Verstehst Du den Sinn bzw. die Funktionalität der World-View-Projection-Matrix; oder einer der Matrizen "World", "View" und "Projection"?

Der ist mir vollkommen klar. Hab sogar alles selbst hergeleitet...

Zitat von »"Steven77"«

Pixelkoordinaten kannst Du nicht manipulieren. Jedes Pixel hat seine feste Position innerhalb des Render-Targets. Du kannst lediglich die "Werte" beeinflussen, die ein bestimmtes Pixel annehmen kann.

Ich meinte damit nicht die Hardwarepixel, sondern zum Beispiel so eine Art Post-Screen-Shader, der mir einfach das fertig gerenderte Bild vor dem Rasterizer verkleinert (zB * 0.5) und dann in eine Ecke des Bildschirms schiebt! Geht das, weil wie ich oben erwäht habe, funktioniert das mit dem VertexShader irgendwie nicht (oder ist da was falsch?)

edit:
Also, hab mich jetzt informiert was den Ablauf bzw Übergang zwischen Vertex und Pixelshader angeht... Passt...
Dass man im Pixelshader keine Koords mehr verändern kann, ist jetzt auch klar, unklar ist mir aber immer noch, wieso der oben beschriebene "Algorithmus" nicht funktioniert!?
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

08.06.2006, 16:28

1. anhand deines FVF bzw. deiner VertexDeclaration werden die einzelnen komponenten von den streams in die input register der vertex ALU gemappt.

2. dein vertex is jetzt in den registern, der shader macht was damit.

3. das ergebnis is in den output registern.

4. culling etc.

5. aus den vertices werden die dreicke gemacht und gerastert, der pixel shader wird für jeden pixel des dreiecks ausgeführt

6. blending etc.

das is jetzt ziemlich grob was in der pipeline vorgeht :D

genauer: http://www.gamasutra.com/features/200304…3Dpipeline9.gif

allgemein gilt:

du kannst mit einem shader keine vertices erzeugen oder verwerfen.
du kannst mit einem shader keine pixel erzeugen
du kannst mit einem shader keine pixel verschieben^^

es gibt aber in manchen pixel shader versionen den befehl texkill, damit kannst du einen pixel verwerfen, kann aber mehr performance killen als bringen.

mit DirectX 10 und shader model 4.0 wird alles anders :)
dann kann ein shader z.b. geometrie erzeugen (Geometry Shader...)

-> dx10 rocks :D


es gab mal einen shader debugger von nvidia, aber das is schon ewig her (dx8 zeiten...), ka obs den noch gibt.

nützlich:

http://developer.nvidia.com/object/fx_composer_home.html <- !!!
http://www.ati.com/developer/rendermonkey/index.html

zieh dir einmal den render monkey und vor allem den fxcomposer :)

6

08.06.2006, 16:38

.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »FOGX« (15.09.2010, 18:14)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

08.06.2006, 16:39

sicher kann man das, is genau was er versucht zu machen.

8

08.06.2006, 16:42

.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »FOGX« (15.09.2010, 18:14)


Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

9

08.06.2006, 19:16

danke @ dot!

Ich arbeite schon mit dem FX-Composer, aber irgendwie schaff ichs da nicht, den Shader zu testen, nur zu kompilieren und zu wissen, dass keine Fehler vorhanden sind (sprachlich und syntaktisch!)!

Hast du zufällig auch eine Ahnung wieso das mit dem Vertexverschieben nicht funktioniert!?
Ich stell besser mal mein Problem dar...:
Im VertexShader durchläuft der Vertex einige Tests und dann soll er abhängig vom Resultat in die linke obere, linke untere, rechte obere oder rechte untere Ecke verschoben werden. Das bedeutet, dass das Endbild dann in 4 Quadranten aufgeteilt ist (quadratisches Rendertarget)!

Jetzt hab ich aber auch ein Überlegungsproblem. Wenn ich nur einzelne Vertize verschiebe, dann stimmen die Polygone nicht mehr! Kann man dieses Problem irgendwie umgehen, zB den Test nicht für jeden Vertex sondern für jedes Dreieck machen!? Weils sonst passieren kann, dass ein Vertex eines Dreiecks in den 1. Qudranten verschoben wird, und der 2. in den 3. und der 3. in den 2., dann kommt ganz ein komisches Bild heraus!
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

10

09.06.2006, 12:13

Re: Allgemeine Shader Fragen

Zitat von »"Black-Panther"«


1) Kann man Shader irgendwie zur Laufzeit debuggen? Also so wie C++, mit Breakpoints usw...?


Mit VS2003 ja
Mit VS 2005 nein :( :x

Zitat


2) Wenn nicht, hat man irgendwie die Möglichkeit Daten auszugeben, in Dateien o.ä. oder kann man (was ich befürchte) nur die Funktionalität anhand des Resultats erkennen?!


Das ist recht aufwändig. Du musst die Daten in den Framebuffer, ZBuffer oder ein Rendertarget schreiben und dann auslesen.

Zitat


C-/C++-Quelltext

1
2
3
4
//Vertex transformieren

float4 vTPos = mul(vInPos, mTransformation);
Out.vPosition.x = vTPos.x * 0.5f - 0.5f;
Out.vPosition.y = vTPos.y * 0.5f + 0.5f;



Muss IMHO gehen. Ich schätze, Dein Drumherum ("Pixel verschieben") klappt nicht. Mach mal folgendes:
Simpelapllikation die einen Würfel in der Bildschirmmitte malt und meinetwegen dreht. PS simpelst, kann z.B. einfach die Farbe auf Rot setzen. Jetzt fügst Du die obigen Zeulen hinzu und m.E. muss sich der Würfel jetzt in derEcke drehen.

Zitat


4) Wo kann man auf die Pixelkoordinaten zugreifen und diese manipulieren? Im Pixelshader?


Schreibend sicher nicht, wie Steven77 ja schon sagte, aber ich denke Du meinst "lesend". Da bin ich mir nicht 100% sicher. Ein Workaround wäre per CPU den Texturkoordinaten die x, y Koordinaten zu geben.

Zitat


5) Wenn man einen Vertex ignorieren will, und verwerfen, wie macht man das, gibt es da einen Befehl? Oder muss man dies einfach umgehen?


Eine Möglichkeit ist Alphatest aktivieren und das Alpha im Shader zu setzen.
"Games are algorithmic entertainment."

Werbeanzeige