ZFX
ZFX Neu
Home
Community
Neueste Posts
Chat
FAQ
IOTW
Tutorials
Bücher
zfxCON
ZFXCE
Mathlib
ASSIMP
NES
Wir über uns
Impressum
Regeln
Suchen
Mitgliederliste
Membername:
Passwort:
Besucher:
4442160
Jetzt (Chat):
14 (0)
Mitglieder:
5239
Themen:
24223
Nachrichten:
234554
Neuestes Mitglied:
-insane-

ZFX
Coding-Foren
Algorithmen und Datenstrukturen
Stencil Shadows mit Vertex-Shader
NormalSeite: 1 2 >
AutorThema
Jack the Ripper Sorry - lasse mich grade von ner geilen Domina auspeitschen .... jaaaahh
ZFX'ler


Registriert seit:
06.02.2003

Baden-Württemberg
192808767
Stencil Shadows mit Vertex-ShaderNach oben.
Hi,

ich habe mal wieder ein Stencil Shadow Volume problem:

Ich bin gerade dabei meine 3D-Engine so umzuschreiben, dass sie meine ShadowVolumes mit der GPU (Vertex-Shader) und nicht mehr mit der CPU berechnet.

Ich habe bist jetzt versucht das ganze mit hilfe eines Beispiels von ATI zu lernen (Link), bin grade aber am verzweifeln.....
Ich habe zwar Shadows (die von der GPU berechnet werden), diese sehen aber ziemlich scheiße aus:
Je nach dem wo der Spieler sich befindet ist der Schatten nur teilweise zu sehen (ist kein ZPass/ZFail Problem!)(wenn jmd. möchte kann ich auch noch nen screenshot machen).

Ich finde den Fehler aber einfach nicht...

Kann mir jmd. der das schon hinbekommen hat tips, links etc. geben?!!!!!!!

MfG
02.06.2003, 18:15:25 Uhr
Ripper-Software
Stefan Zerbst Offline
Administrator


Registriert seit:
25.02.2002

Deutschland
Re: Stencil Shadows mit Vertex-ShaderNach oben.
Hi,

das ATI Sample ist auch ein Musterbeispiel für schön verschachtelte Programmierung. Daran etwas zu lernen ist hoffnungslos.

Besser ist es, einen Shadow-Volume erst mal ohne Shader zu implementieren und diesen dann so zu erweitern, dass er wie der Shader funktioniert.

Allerdings halte ich es nicht für sehr sinnvoll, überhaupt Shader für einen SV zu verwenden. Dabei muss ein riesen Overhead an Vertex-Daten produziert werden. Das frisst Speicher und kostet viel unnötige Zeit beim Transformieren. Wenn man den Volume statisch im VRAM hält ist es nur Speicherverschwendung. Wenn man den Volume auch in jedem Frame neu berechnen muss, weil sich die zugehörige Geometrie verändert (Stichwort Character Animation) ist das auch noch eine große Belastung für den Bus.

Ciao,
Stefan
02.06.2003, 18:58:14 Uhr
ZFX - 3D Entertainment
Jack the Ripper Sorry - lasse mich grade von ner geilen Domina auspeitschen .... jaaaahh
ZFX'ler


Registriert seit:
06.02.2003

Baden-Württemberg
192808767
Re: Stencil Shadows mit Vertex-ShaderNach oben.
Dass das ATI Sample nicht so einfach ist, habe ich schon gemerkt

Ich habe bereits ein Shadow-Volume ohne Shader implementiert (dabei hattest du mir auch schon geholfen ) und bin jetzt gerade dabei es "umzubauen", dass er wie ein Shader funktioniert (DA liegt ja mein Problem)

Zum Speicherplatz muss ich jedoch sagen, dass ich da anderer meinung bin: Mit den Heutigen rechner sind diese par Vertex-Daten kein Problem mehr...außerdem, wenn ich das ganze mit der CPU berechnen lassen, habe ich auch zusätzliche Vertex-Daten im speicher - ich habe mit der GPU nur zusätzlich die Normalvectoren.
Das ich das ganze bei animierten objekten nicht lohnt, erklärt sich von selbt, datauf musst mich net hinweisen.

Aber beim rest brauche ich einfach die CPU Power.... nach dem was mir grad so im Gehirn rumzigeunert habe ich noch viel vor mit der CPU (KI usw.)......

Deshalb wäre es net wenn mir jmd vieleicht doch helfen könnte mir SV duch VS ( ).

MfG

03.06.2003, 14:34:46 Uhr
Ripper-Software
Stefan Zerbst Offline
Administrator


Registriert seit:
25.02.2002

Deutschland
Re: Stencil Shadows mit Vertex-ShaderNach oben.
Hi,

klar hast Du bei den CPU Volumes auch zusäzliche Daten im Speicher, allerdings nur eine Seite der Caps die man sonst nicht hätte.

Wenn Du den Volume über einen Shader erstellen willst, dann brauchst Du die komplette ursprüngliche Geometrie, und zusätzlich für jede Kante wo zwei Tris sich treffen ein degeneriertes Quad, spricht zwei zusätzliche Tris.

Ein Objekt aus 1000 Tris braucht dann zusätzlich 1500 Quads, also 3000 Tris und hat letzten Endes 4000 Tris für das Modell aus 1000 Tris. Hier verbraucht man deutlich mehr Speicher als bei der Non-Shader Version. Auf den Speed wirkt sich das auch aus, weil nun die Vierfache Menge an Vertices durch den Shader gehen muss. Und zu guter Letzt ist das Speicher auf der Grafikkarte, wo Texturen u.U. besser aufgehoben sind im Gegensatz zum RAM.

Aber das nur als kleiner Denkanstoss, wenn Du die CPU noch extrem belasten willst kann das im Endeffekt wirklich die bessere Alternative sein. Aber es schadet ja nie, den Geist mal ein wenig zum Denken anzuregen

Was den Shader angeht, so muss der eigentlich nicht viel machen. Man muss nur die Normalenvektoren der Vertices mit dem Lichtvektor multiplizieren und alles was mehr als 90 Grad vom Lichtvektor wegschaut wird entlang des Lichtvektors ausgezogen.

Dazu ist es aber notwendig, die Geometrie wie oben beschrieben mit degenerierten Quads zu erweitern. Sprich ein Rechteck für jede Kante des Modells.

Ciao,
Stefan
03.06.2003, 15:22:22 Uhr
ZFX - 3D Entertainment
Jack the Ripper Sorry - lasse mich grade von ner geilen Domina auspeitschen .... jaaaahh
ZFX'ler


Registriert seit:
06.02.2003

Baden-Württemberg
192808767
Re: Stencil Shadows mit Vertex-ShaderNach oben.
Du hast schon recht was deine Rechnung mit den Vertices angeht, habe mir das auch schon durch den Kopfgehen lassen und habe auch so meine Bedenken (auch wenn ich an sich glaube, das heutige rechner das schaffen - aber man kann ja nie wissen)......aber wie schon gesagt, ich brauche die CPU-Power....und wenn sich am schluss rausstellt, dass es ohne GPU - mit der CPU - doch schneller ist, dann kann ich es ja immer noch wieder abändern (ich lösche meine alten Funktionen ja nicht ).

Zum Vertex-Shader:
Gut.... N*L und >90Grad mitm Lichtvector verschieben.......aber ein Teil des ShadowVolumes darf ja nicht verschoben werden und der der Winkel an diesen Stellen zum Licht muss trotzdem >90Grad sein....das ist dann der Teil des ShadowVolumes, der an der Schattenseite des occular sitzt.... und wie erreiche ich das im Vertex-Shader?
Ich stelle mir das ShadowVolume jetzt immer noch genauso vor, wie wenn ich es mit der CPU berechen (occular + reflektion + siluette) ich hoffe ich mache HIER keinen großen Denkfehler.

Wobei ich langsamm Denke, dass ich hierbei WIRKLICH einen großen Denkfehler mache: Das passt nicht so ganz mit den "degenerierten Quads" zusammen

Und nun noch zu den "degenerierten Quads:
Ist das so richtig:
Nehmen wir an wir haben ein Triangle mit den Vertices v0, v1, v2.
Nun muss ich also ein Rechteck an die Geraden v0-v1, v1-v2 und v0-v2 setzten.......und das wars?
Haben die neuen Vertices dann die selben koordinaten wie v0, v1 und v2? Oder setzt ich die nebendrann?

MfG

PS: man sieht, ich habe das noch nicht so verstanden ....aber nur das mit der GPU.....mit der CPU klappt alles perfekt! da bestehe ich drauf!
03.06.2003, 16:57:03 Uhr
Ripper-Software
Stefan Zerbst Offline
Administrator


Registriert seit:
25.02.2002

Deutschland
Re: Stencil Shadows mit Vertex-ShaderNach oben.
Hi,

der Shader dafür ist einfacher als die CPU Version, weil man keine Silihette berechnen muss. Alles was zum Licht hinschaut bleibt wo es ist, alles andere wird ausgezogen.

Durch die degenerierten Quads wird daraus ein korrekter, geschlossener Volume. Vorausgesetzt das Mesh dazu war auch geschlossen.

Was das Triangle angeht so ist das richtig was Du sagst, mit der Einschränkung dass man jede Kante nur einmal generieren muss, aber die vier Verts des Quads von den beiden diese Kante teilenden Dreiecken kommen.

Es seien T1(v0,v1,v2) und T2(v3,v4,v5) Dreiecke die eine gemeinsame Kante haben, welche durch (v0,v1) und (v4,v5) dargestellt ist. Dann brauchst Du für diese Kante ein degenriertes Quad aus den Vertices (v0,v1,v4,v5). Degenriert ist es deshalb, weil die Vertex-Positionen paarweise identisch sind. Wichtig ist aber, dass sich die Normalenvektoren unterscheiden. Folglich wird das Quad dann bei Bedarf durch den Shader zu einem vollwertigen Quad ausgezogen.

Ciao,
Stefan
03.06.2003, 23:53:51 Uhr
ZFX - 3D Entertainment
Jack the Ripper Sorry - lasse mich grade von ner geilen Domina auspeitschen .... jaaaahh
ZFX'ler


Registriert seit:
06.02.2003

Baden-Württemberg
192808767
Re: Stencil Shadows mit Vertex-ShaderNach oben.
Sehr schön....dann habe ich ja schon einen Teil verstanden! *freu*

Nun zum 2. Teil:

Der Vertex-Shader! Ist das so richtig?
Code:
nl = N*L
w = dp3(nl, N(L) )
if(w<0) -> vOut = vPos + ( N(L) * dist )
else     -> vOut = vPos

ich hoffe man versteht was ich geschrieben habe

und das if(...) und else setze ich dann so ungefähr um:
Code:
// v0   = Position des Vertex
// r1.x = das ergebnis von dp3
// r1.y = die \"Länge\" des Schatten
// r2   = Normalisierter Lichtvector
slt r1.w, r1.x, 0
mad r3, r2, r1.y, v0


MfG
04.06.2003, 00:35:23 Uhr
Ripper-Software
Stefan Zerbst Offline
Administrator


Registriert seit:
25.02.2002

Deutschland
Re: Stencil Shadows mit Vertex-ShaderNach oben.
Hi,

ja das ist vom Prinzip her richtig so

Ciao,
STefan
04.06.2003, 07:00:29 Uhr
ZFX - 3D Entertainment
Jack the Ripper Sorry - lasse mich grade von ner geilen Domina auspeitschen .... jaaaahh
ZFX'ler


Registriert seit:
06.02.2003

Baden-Württemberg
192808767
Re: Stencil Shadows mit Vertex-ShaderNach oben.
UND DAS FUNKTIONIERT?

Dann werd ichs mal testen - wobei ich mich immernoch frage, wie es so mögich ist, dass der Schatten nur auftaucht wo der Occular Backface zum Licht ist - nur weil wir die Vertices nicht verschiebern..........

Noch eine letzte kurze Frage: Wie errechne ich die Normalvekrotern der degenerierten Quads, bzw. in welche Richtung müssen diese Zeigen?

MfG
04.06.2003, 07:56:11 Uhr
Ripper-Software
Stefan Zerbst Offline
Administrator


Registriert seit:
25.02.2002

Deutschland
Re: Stencil Shadows mit Vertex-ShaderNach oben.
Hi,

was zur Hölle ist ein Occular Backface?

Das Prinzip ist, dass alles in Laufrichtung des Lichts ausgezogen wird, was mehr als 90 Grad vom Licht wegschaut. Damit wird das Modell quasi halbiert. Die Front Facing Tris bleiben wie sie sind, die BackFacing Tris werden verschoben. Damit das Mesh aber geschlossen bleibt sind die Degenerierten Quads da die die Sollbruchstelle des Modells ausfüllen.

Die Normalenvektoren brauchst Du nicht zu berechnen, denn Du verwendest die der vier Vertices einer Kante zweier zusammentreffender Dreiecke.

Ciao,
Stefan
04.06.2003, 08:09:05 Uhr
ZFX - 3D Entertainment
Jack the Ripper Sorry - lasse mich grade von ner geilen Domina auspeitschen .... jaaaahh
ZFX'ler


Registriert seit:
06.02.2003

Baden-Württemberg
192808767
Re: Stencil Shadows mit Vertex-ShaderNach oben.
Sorry .... man bin ich bescheuert!!!!

Ich meinte occluder - zur Hölle! ..... frage mich, wie ich auf den Stuss gekommen bin.

Also noch mal zusammenfassen:

Tri1(v0,v1,v2) + Tri2(v3,v4,v5)

v0 = v4
v2 = v5

Quad(v0,v2,v4,v5)

--> Und Natürlich.....die Normalvektoren habe ich ja schon (wenn man ein bischen drüber nachdenkt :-> )

Ok.....ich glaube ich weis jetzt vorerst genug um das Ganze ein wenig auszuprobieren....

.....Vielen dank für dein Bemühen (wobei dir die Community ruhig auch ein bisele hät helfen können!!!)

MfG
04.06.2003, 08:31:13 Uhr
Ripper-Software
DarkAngel Offline
ZFX'ler


Registriert seit:
12.05.2002

Deutschland
91217570
Re: Stencil Shadows mit Vertex-ShaderNach oben.
Hi, funktioniert es denn schon komplett? Oder gibt es noch Probleme mit dem Volume ohne degenerated quads?
10.06.2003, 13:25:53 Uhr
Jack the Ripper Sorry - lasse mich grade von ner geilen Domina auspeitschen .... jaaaahh
ZFX'ler


Registriert seit:
06.02.2003

Baden-Württemberg
192808767
Re: Stencil Shadows mit Vertex-ShaderNach oben.
Hi,

ivh war seit letzten Donnerstag nicht mehr Zuhause und bin erst gestern wiedergekommen (war bei Rock im Park!!!!)......hab es also noch nicht ausprobiert.

Ohne degenerated quads (mit der CPU berechnette Volumes) gibt es aber keine Probleme.

MfG
10.06.2003, 13:58:05 Uhr
Ripper-Software
DarkAngel Offline
ZFX'ler


Registriert seit:
12.05.2002

Deutschland
91217570
Re: Stencil Shadows mit Vertex-ShaderNach oben.
Hi, mit ohne degenerated quads meinte ich aber nicht die CPU Variante sondern Vertexshader nur ohne den Quads. Mit einer Sphere sollte ein korrektes Shadowvolume bei rauskommen.
10.06.2003, 18:02:08 Uhr
Jack the Ripper Sorry - lasse mich grade von ner geilen Domina auspeitschen .... jaaaahh
ZFX'ler


Registriert seit:
06.02.2003

Baden-Württemberg
192808767
Re: Stencil Shadows mit Vertex-ShaderNach oben.
habe ich nicht getestet...........aber ich werds mal machen.

MfG
11.06.2003, 01:21:29 Uhr
Ripper-Software
Stefan Zerbst Offline
Administrator


Registriert seit:
25.02.2002

Deutschland
Re: Stencil Shadows mit Vertex-ShaderNach oben.
Hi,

ohne DegQuads kommt nur ein korrekter Volume bei heraus, wenn man keine redundaten Vertices hat. Sprich benachbarte Faces müssen exakt dieselben Vertices und nicht nur Vertices mit derselben Textur verwenden.

Andererseits zieht man die BackCap weg und hat dann ein grosses Loch zwischen Front- und BackCap.

Ciao,
Stefan
11.06.2003, 10:10:52 Uhr
ZFX - 3D Entertainment
DarkAngel Offline
ZFX'ler


Registriert seit:
12.05.2002

Deutschland
91217570
Re: Stencil Shadows mit Vertex-ShaderNach oben.
Das ist schon klar, aber man kann bei einer Sphere (wie ich ja auch geschrieben habe) schonmal sehen ob der Vertexshader funktioniert.
11.06.2003, 16:19:24 Uhr
Stefan Zerbst Offline
Administrator


Registriert seit:
25.02.2002

Deutschland
Re: Stencil Shadows mit Vertex-ShaderNach oben.
Hi,

jein, denn Sphere ist nicht gleich Sphere. Nur unter der von mir oben genannten Bedingung wird das funktionieren. Verwendet man einzelne Faces mit redundanten Vertices für die Sphere so wird es nicht funktionieren

Ciao,
Stefan
11.06.2003, 19:00:49 Uhr
ZFX - 3D Entertainment
DarkAngel Offline
ZFX'ler


Registriert seit:
12.05.2002

Deutschland
91217570
Re: Stencil Shadows mit Vertex-ShaderNach oben.
Ok, ich geb ja schon auf.. :p
12.06.2003, 15:54:19 Uhr
Stefan Zerbst Offline
Administrator


Registriert seit:
25.02.2002

Deutschland
Re: Stencil Shadows mit Vertex-ShaderNach oben.
12.06.2003, 19:26:30 Uhr
ZFX - 3D Entertainment
Jack the Ripper Sorry - lasse mich grade von ner geilen Domina auspeitschen .... jaaaahh
ZFX'ler


Registriert seit:
06.02.2003

Baden-Württemberg
192808767
Re: Stencil Shadows mit Vertex-ShaderNach oben.
Hi,

jetzt bin ich endlich dazugekommen das auszuprobieren!

Mein Vertex-Shader funktioniert jertzt. Wenn ich nicht in den Stencil-Buffer rendere, sondern meine berechneten Schatten auf dem Bildschirm ausgebe, sehehn sie richtig aus.

Nur habe ich jetzt ein Problem mit dem Stencil-Buffer....

Ich rendere jetzt so:

Code:
1. CCW -> zFail -> INCRSAT
2. CW  -> zFail -> DECR


Das ist aber falsch, und ich bekomme es nicht richtig hin.

KAnn mir einer Sagen wie ich jetzt rendern muss?
15.06.2003, 22:03:41 Uhr
Ripper-Software
Jack the Ripper Sorry - lasse mich grade von ner geilen Domina auspeitschen .... jaaaahh
ZFX'ler


Registriert seit:
06.02.2003

Baden-Württemberg
192808767
Re: Stencil Shadows mit Vertex-ShaderNach oben.
ach leute helft mir doch!!!

bitte!!!!
17.06.2003, 20:12:38 Uhr
Ripper-Software
Jack the Ripper Sorry - lasse mich grade von ner geilen Domina auspeitschen .... jaaaahh
ZFX'ler


Registriert seit:
06.02.2003

Baden-Württemberg
192808767
Re: Stencil Shadows mit Vertex-ShaderNach oben.
Vielen dankk für die tolle mitarbeit....ihr habt mir echt geholfen....habe meinen Fehler jetzt:

statt
Code:
D3DDevice->SetRenderState( D3DRS_STENCILFUNC, D3DCMP_LESS    );
hab ich
Code:
D3DDevice->SetRenderState( D3DRS_STENCILFUNC, D3DCMP_LESSEQUAL    );

geschrienem.

Ohne euch hätte ich das echt nie gefunden...ich kann mich gar nicht oft genug bedanken.

Mabe jetzt nur noch einen fehler bei den DegQuads, aber ich denke, dieses kann ich diesesmal selber lösen.


MufG
17.06.2003, 20:50:38 Uhr
Ripper-Software
eLTi Offline
ZFX'ler


Registriert seit:
06.03.2002

Deutschland
Re: Stencil Shadows mit Vertex-ShaderNach oben.
@jack
zeig mal deinen Code, wo der VB und IB gefüllt wird... da hab nämlich ich meinen Fehler gehabt....
17.06.2003, 21:55:45 Uhr
Jack the Ripper Sorry - lasse mich grade von ner geilen Domina auspeitschen .... jaaaahh
ZFX'ler


Registriert seit:
06.02.2003

Baden-Württemberg
192808767
Re: Stencil Shadows mit Vertex-ShaderNach oben.
denke zwar, dass der fehler nicht hier liegt, sondern wo anderst.....habe auch noch vor die Funktion selber zu schreiben...diese hier (bzw. die ganze funktion zum erstellen des volumes) ist ja ungefähr zu 80% vom ATI sample übernommen....aber egal:

Code:
m_dwIndexBufferSize  = shadowIndices.size();
m_dwVertexBufferSize = shadowVerts.size();

totalShadowVerts += m_dwVertexBufferSize;

if( FAILED( D3DDevice->CreateIndexBuffer( m_dwIndexBufferSize*sizeof(WORD), 
            D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, &m_pIndexBuffer, NULL ) ) )
{    return E_FAIL;    }


WORD* pIndex;
std::vector::iterator indexIter;
m_pIndexBuffer->Lock( 0, m_dwIndexBufferSize*sizeof(WORD), (void**)&pIndex, 0);
for (indexIter = shadowIndices.begin(), faceIdx=0; indexIter != shadowIndices.end(); ++indexIter, faceIdx++)
{    pIndex[faceIdx] = *indexIter;    }
m_pIndexBuffer->Unlock();


if( FAILED( D3DDevice->CreateVertexBuffer( m_dwVertexBufferSize*sizeof(SHADOWVERTEX), 
            D3DUSAGE_WRITEONLY, 0, D3DPOOL_MANAGED, &m_pShadowVolume , NULL) ) )
{    return E_FAIL;    }


SHADOWVERTEX* pVertex;
std::vector::iterator vertexIter;
m_pShadowVolume->Lock( 0, m_dwVertexBufferSize*sizeof(SHADOWVERTEX), (void**)&pVertex, 0);
for (vertexIter = shadowVerts.begin(), faceIdx=0; vertexIter != shadowVerts.end(); ++vertexIter, faceIdx++)
{    pVertex[faceIdx] = *vertexIter;    }
m_pShadowVolume->Unlock();
17.06.2003, 22:02:51 Uhr
Ripper-Software
NormalSeite: 1 2 >


ZFX Community Software, Version 0.9.1
Copyright 2002-2003 by Steffen Engel