#1 04.02.2005 12:09:41

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Fehlerhafte Reflektionen bei Cube Textur

Hallihallo!

Ich bin neu hier im Forum, progge seit etwa einem Jahr mit DirectX in Delphi und arbeite im Moment an einem netten Spiel.
Dargestellt werden einfache Körper (so wie Tetris-Steine, in etwa), und um da jetzt ein schönes Specular-Lighting raufzubekommen, versuche ich das mit Cube Maps.

Das funktioniert so auf den ersten Blick ganz gut, aber auf den zweiten eher nicht mehr, denn die Reflektionen stimmen irgendwie überhaupt nicht. Sie sind viel zu groß, zeigen entweder zu viel oder zu wenig von der EnvMap und passen irgendwie auch nicht zu den FACES (POSITIVE_X, ...).

Folgende Schritte hab ich gemacht:
1. CubeMap erstellt
2. 6mal aus unterschiedlichen Blickwinkeln in die 6 Surfaces der Textur gerendert (dabei die Projection-Matrix auf 90°, aspectratio=1 gesetzt)
3. Diese generierte Textur wie folgt angewandt:

setTexture(0,steinX);
setTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE);
setTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TEXTURE);
setTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
setTexture(1,cubeMapX);
setRenderState(D3DRS_NORMALIZENORMALS, 1);
setTextureStageState(1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR);
setTextureStageState(1, D3DTSS_COLORARG1, D3DTA_CURRENT);
setTextureStageState(1, D3DTSS_COLORARG2, D3DTA_TEXTURE);
setTextureStageState(1, D3DTSS_COLOROP, D3DTOP_ADD);
setTextureStageState(2, D3DTSS_COLOROP, D3DTOP_DISABLE);

So. Das war´s. Hab ich irgendetwas vergessen? Muß ich das Vertex-Format ändern? Stimmt was mit den generierten Textur-Koordinaten nicht (so sieht´s für mich aus)?

Wäre wirklich schön, wenn jemand ne Idee hat, oder ein gutes Tutorial weiß oder ein Stück von eigenem Quelltext posten kann, wo das so vorkommt.
Danke

Offline

 

#2 04.02.2005 15:03:08

Holly
Member
Ort: Leipzig
Registriert: 24.01.2005
Beiträge: 76
Web-Seite

Re: Fehlerhafte Reflektionen bei Cube Textur

erstmal herzlich willkommen bei delphidev  big_smile

wie sieht denn dein code für die berechnung der projection-matrix für die 6 faces aus? beziehst du da auch die aktuelle viewmatrix mit ein? im sdk gibts dazu auch en schönes sample. is auch recht einfach nach delphi zu portieren. einfach mal reingucken.


HOLLY


Enjoy the 3 dimensions of livin'....

Offline

 

#3 04.02.2005 15:21:02

artzuk
GodlikeMember
Ort: Leipzig
Registriert: 24.01.2005
Beiträge: 1164

Re: Fehlerhafte Reflektionen bei Cube Textur

Und die Normalen im MeshObject nicht vergessen wink


Mein kleiner .NET Blog: http://artzuk-interactive.de/

Offline

 

#4 04.02.2005 17:24:27

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: Fehlerhafte Reflektionen bei Cube Textur

Also. Ich habe jetzt nochmal tausend Sachen ausprobiert. Es klappt aber noch nicht.
Die Normalen sind korrekt, habe das Objekt selbst im Code generiert (ist ja einfach genug).

Die Sache mit dem Einbeziehen der alten Viewmatrix ist mir im Sample auch aufgefallen. Ich hatte das erst weggelassen. Jetzt hab ich´s drin, und ich frage nochmal, um Mißverständnisse zu vermeiden: Das ist die ViewMatrix, aus der man das spiegelnde Objekte dann später betrachtet, richtig?

Jetzt mal meinen Code:

  GetRenderTarget(altestarget);
  GetDepthStencilSurface(alterZBuffer);

  GetTransform(D3DTS_VIEW, alteViewMatrix);
  alteViewMatrix._41:=0; alteViewMatrix._42:=0; alteViewMatrix._43:=0;

  // das folgende 6mal:
  cubeMapX.GetCubeMapSurface(D3DCUBEMAP_FACE_POSITIVE_Y,
                                                0,texturTarget);
  SetRenderTarget(texturtarget,neuerZBuffer);

  Clear(0, nil, D3DCLEAR_TARGET or D3DCLEAR_ZBUFFER, $F000000,
           1.0, 0 );

  D3DXMatrixPerspectiveFovLH(matProj,D3DX_PI/2,1,0.1,1000.0);
  SetTransform(D3DTS_PROJECTION,matProj);

  with objekt[4] do D3DXMatrixLookAtLH (ViewMatrix,
                                        D3DXVECTOR3(posx,posy,posz),
                                        D3DXVECTOR3(posx,posy+1,posz),
                                        D3DXVECTOR3(0.0,0.0,1.0));
  D3DXMatrixMultiply(ViewMatrix,alteViewMatrix,ViewMatrix);
  SetTransform(D3DTS_VIEW,ViewMatrix);
  zeichneAlleObjekteDieImSpiegelZuSehenSeinSollen;
 
  //das vergangene 6mal...und danach:

  setRenderTarget(altestarget,alterZBuffer);
  D3DXMatrixPerspectiveFovLH(matProj,D3DX_PI/4,
                                             resx/resy,0.1,1000.0);
  SetTransform(D3DTS_PROJECTION,matProj );

Ich stelle mir auch die Frage, wozu da drei Werte der Matrix auf 0 gesetzt werden. Ist das die Translation?
Wenn ich diese Zeile mit dem Nullsetzen weglasse, sieht´s schlimmer aus.
Wenn ich sie drin lasse, habe ich aber das Gefühl, daß das reflektierte Bild von woanders aus aufgenommen wird, als in dem spiegelden Objekt.
Ich denke, irgendwie stimmt da was mit der ViewMatrix nicht.
....hm....hab die mal von rechts ranmultipliziert, hat nix gebracht.

Sorry, aber ich bin soweit ratlos.

Offline

 

#5 04.02.2005 17:47:01

artzuk
GodlikeMember
Ort: Leipzig
Registriert: 24.01.2005
Beiträge: 1164

Re: Fehlerhafte Reflektionen bei Cube Textur

Wenn du nur einen Spiegel hast, dann solltest du lieber ReflectionMaps oder sonsitges nehmen. CubeMaps sind für flache spiegelnde Flächen ungeeignet.
Ich selbst musste die Erfahrung bei meinen Wasser machen - da stimmte die Größe der Reflektion nie überein.

Ob deine ViewMatrix jetzt so richtig ist, kann ich nicht so genau sagen. Wenn du willst kannst du mir ein sample geben und ich versuche es zu reparieren  8)
Ich selbst schreibe die ViewMatrix lieber selber ... da weiß ich ganz genau, was passiert big_smile

Achja - ich hatte schon vor, meine kleine CubeMap-Klasse in unsere Code-Library zu stellen ... ich schreibe die noch etwas "schön" und mache das mal im Verlauf der nächsten 2 Wochen (Ferien) wink

Add: Die Werte dieser Matrix stehen bestimmt auf 0, weil die Position dann aus der neu errechneten ViewMatrix übernommen werden - schätze ich mal.
Wenn diese nicht korrekt übernommen werden, multiplizierst du beide evtl. falsch. Oder ich denke falsch!


Mein kleiner .NET Blog: http://artzuk-interactive.de/

Offline

 

#6 05.02.2005 10:07:06

Holly
Member
Ort: Leipzig
Registriert: 24.01.2005
Beiträge: 76
Web-Seite

Re: Fehlerhafte Reflektionen bei Cube Textur

Zitat:

D3DXMatrixMultiply(ViewMatrix,alteViewMatrix,ViewMatrix);

also erstmal weiß ich nicht, ob es so ratsam ist, die originale viewmatrix zu überschreiben.

2.: du setzt die letzte reihe der viewmatrix auf "0". könnte es sein, dass du die reihe auf die koordinaten des objektes setzen musst? also wenn dein objekt auf (-10, 10, 0) steht, dass du dann

matview._41 := -10;
matview._42 :=  10;
matview._43 :=    0;

schreiben musst?

irgendwie hab ich cubemapping zwar schon mal gemacht, aber ich überlege immer wieder aufs neue, wie das richtig funzt  :tia:  :doof:  :mrgreen:

HOLLY


Enjoy the 3 dimensions of livin'....

Offline

 

#7 05.02.2005 10:27:08

artzuk
GodlikeMember
Ort: Leipzig
Registriert: 24.01.2005
Beiträge: 1164

Re: Fehlerhafte Reflektionen bei Cube Textur

Bei ner ViewMatrix darf man leider nicht so einfach die Position reinschreiben - den Fehler hat ich auch begangen, bis ich endlich belehrt wurde, wie das Teil aufgebaut ist. (Das steht auch in nen anderen Topic hier beschrieben)

Die letzte Zeile ist jeweils das DotProduct aus Position und den Right-, Up- und LookVektor.


Mein kleiner .NET Blog: http://artzuk-interactive.de/

Offline

 

#8 05.02.2005 14:01:23

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: Fehlerhafte Reflektionen bei Cube Textur

Tja, also ich hab mal n bissel geschaut, und es gibt schon einige Leute, die dieses Problem haben. Oft kommen sie aber auch auf keine Lösung. Ich finde es nur ärgerlich, daß es bei mir nicht so klappt, wie es in dem Sample steht.

@Holly:
Ja, also die letzten Werte können doch auf 0 gesetzt werden, da ich die Position des Objektes ja schon mit der "ViewMatrix" reinbekomme.

Hm....wenn ich mir das nochmal überlege, ergibt das auch nicht so richtig Sinn. Wichtig ist ja im Prinzip nur die RelativPosition der Cam gegenüber dem Objekt. Vielleicht denke ich darüber nochmal nach.

@artzuk:
Mit den Skalarprodukten in der letzten Zeile hab ich jetzt auch gelesen. Da steckt also die Position irgendwie drin. Vielleicht muß ich mir die selber zusammenbasteln, obwohl die das im Sample ja eher einfach hatten. Grrr!

Hab jetzt einen Code gefunden (der Typ war echt frustriert), wo viel mit Vektoren rumgemacht wird. Hab das einfach mal kopiert, ohne es zu versetehen. Ist immer noch nicht korrekt (die Refl. sind zu groß), würde aber für´s Specular Lighting reichen.

Wenn Einer von Euch einen Code-Abschnitt posten könnte, wär das echt toll.
Ansonsten danke ich rechtherzlich und denke darüber noch eine Weile in meinem stillen Kämmerlein.

Oh, Tja gibt´s ja auch als

:tia:

Offline

 

#9 05.02.2005 14:43:55

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: Fehlerhafte Reflektionen bei Cube Textur

Da fällt mir ein: Das Sample in der SDK ist sowieso nicht so gut. Denn:
Betrachtet man die Spiegelungen auf einem Objekt, dann müssen diese Spiegelungen kleiner werden, wenn man sich mit der Kamera wegbewegt. Diese Bewegung steckt aber ausschließlich in der 4. Zeile der ViewMatrix, und eben diese 4. Zeile wird im SDK-Sample ja gelöscht.
Meiner Meinung nach ist das gezeigte dort nur konstruiert und nicht allgemeingültig.
Ich möchte hier also nochmal meiner Enttäuschung Ausdruck verleihen.  :x

Offline

 

#10 05.02.2005 15:37:55

artzuk
GodlikeMember
Ort: Leipzig
Registriert: 24.01.2005
Beiträge: 1164

Re: Fehlerhafte Reflektionen bei Cube Textur

Also meine Klasse + Sample ist sogut wie fertig - nur eine Face wird noch nicht richtig gerendert!? Keine Ahnung warum!

Was für welchen Objekten möchtest du eine CubeMap geben? Höre da was von SpecularLighting - was meinst damit - also was willst du bezwecken?

Wenn man sich mit der Cam wegbewegt wird die Spiegelung bei CubeMaps nicht kleiner - das ist es ja, was auch mich gestört hatte ...
Also im SDK ist es schon richtig - so richtig, wie es diese "Technik" erlaubt.
Ich weiß nicht, ob das wirklich so sein soll, oder ob das ein bug ist, oder ich mich einfach nur tierischst täusche!


Mein kleiner .NET Blog: http://artzuk-interactive.de/

Offline

 

#11 06.02.2005 10:39:39

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: Fehlerhafte Reflektionen bei Cube Textur

Also Du nimmst mir die Worte ein wenig aus dem Mund. Denselben Eindruck habe ich inzwischen auch gekriegt. Das, was ich will, kann diese Technik gar nicht (denke ich), sie ist wieder nur eine Möglichkeit, Dinge richtig ERSCHEINEN zu lassen.

Ich habe eine Szene, in der Objekte (die hinreichend kompliziert sein können) so in der Luft schweben, und von drei Spotlights beleuchtet werden. Damit das gut aussieht, brauche ich dafür ein SpecularLight. Das ist das Ding, was diese weißen Glanzlichterflecken erzeugt.

Das normale, vertexbasierte (SPECULARLIGHTENABLE) funktioniert halbwegs sauber und gut, stößt aber bei meinen low-poly-Objekten an seine Grenzen. Da empfiehlt sich halt ein Texelbasiertes Glanzlicht, wie man es mit einer EnvMap hinbekommen kann.
Außerdem hab ich noch nie Bumpmapping gemacht, und dafür brauche ich eine EnvMap, die zu den drei Lichtern paßt (welche man verschieben und an- und ausknipsen kann).
Da dachte ich mir: Dynamisches Rendern in eine Cube Map klingt wie der Deckel zu meinem Topf.

Und wenn das gut läuft, wollte ich es auch noch dazu verwenden, Objekte in anderen Objekte spiegeln zu lassen, so raytrace-mäßig.

Ich hab inzwsichen erkannt, daß man diese Technik sehr speziell einsetzen muß und kann damit leben.

Offline

 

#12 06.02.2005 11:59:12

artzuk
GodlikeMember
Ort: Leipzig
Registriert: 24.01.2005
Beiträge: 1164

Re: Fehlerhafte Reflektionen bei Cube Textur

Naja - du würfelst irgendwie einiges durcheinander, glaube ich.

Also, wenn du SpecularLighting auf deine Low-Poly Objekte haben möchtest, dann kannst du auch perpixellighting nehmen. Das braucht natürlich etwas performance wink
Du kannst auch mit LightMaps arbeiten.

Vielleicht hilft dir auch dieses eine Object ID3DXRenderToEnvMap (siehe SDK) weiter.

Ich habe auch mal durchgerechnet, warum CubeMaps ungeeignet sind - es liegt an der Berechnung der TexturKoordinaten. Diese werden ja sozusagen aus den Winkel zwischen Normale und Blickrichtung ausgerechnet. Je weiter das Objekt ist, umso kleiner wird der Winkel (wenn das Face ungefähr richtung Cam schaut) ... dadurch werden die TexturKoordinaten auch immer änger aneinander - deshalb sieht dann auch das Gespiegelte viel zu groß aus, wenn man weiter weg geht.


Mein kleiner .NET Blog: http://artzuk-interactive.de/

Offline

 

#13 06.02.2005 15:59:28

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: Fehlerhafte Reflektionen bei Cube Textur

Ich hab mein Programm mal hochgeladen. Kann sich angucken wer will, ich empfehle die .exe, Quellcode ist aber auch dabei.

Läuft auf 1280x1024, Stabilität und Kompatibilität sind jedoch nicht meine Stärken.

Man sieht eine Kugel, in der sich drei Spots spiegeln. Man sieht auch sehr schnell, daß da was falsch läuft.

Die Kamera kann man mit der Maus drehen, rechte Taste dazu festhalten. Lichter und die Kugel kann man ebenfalls verschieben (links).
Die Lichter kann man auch mit der rechten Taste an- und ausschalten.

Man sieht sehr gut, daß da irgendwie mehr als 6 Faces gezeichnet werden. Natürlich sind nur 6 definiert, weshalb er die restlichen mit invertierten Normalenvektoren oder was weiß ich auffüllt.

Also, wer die Muse hat:
www.filsesurfer.de/Peer/eclipse.zip (940KB)
Repair by Coolcat: http://www.filesurfer.de/Peer/eclipse.zip (919KB)

Im Code findet man den Problemabschnitt bei "drawCubeMap".
Kommentare hab ich noch nie gemocht smile

Offline

 

#14 06.02.2005 16:12:16

artzuk
GodlikeMember
Ort: Leipzig
Registriert: 24.01.2005
Beiträge: 1164

Re: Fehlerhafte Reflektionen bei Cube Textur

Link geht nicht  :?


Mein kleiner .NET Blog: http://artzuk-interactive.de/

Offline

 

#15 06.02.2005 19:01:50

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Fehlerhafte Reflektionen bei Cube Textur

^^ jetzt schon..war nen "s" zuviel...


My software never has bugs. It just develops random features.

Offline

 

#16 06.02.2005 19:49:01

artzuk
GodlikeMember
Ort: Leipzig
Registriert: 24.01.2005
Beiträge: 1164

Re: Fehlerhafte Reflektionen bei Cube Textur

Ist sogar kleiner geworden - mensch du  big_smile

@Problem: Wenn ich das richtig deute, was ich sehe, sind einfach nur ein paar (oder doch nur 1x) Right- und Up-Vektor vertauscht.
Musst mal rumspielen.
Blos jetzt stellt sich noch die Frage, ob diese Methode, die in der Tat ganz angenehm aussieht, wirklich sinnvoll für diese Aufgabe ist  :rock:  ... Dies in Hinsicht auf Performance


Mein kleiner .NET Blog: http://artzuk-interactive.de/

Offline

 

#17 06.02.2005 20:40:19

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: Fehlerhafte Reflektionen bei Cube Textur

Oh, das mit dem kaputten Link hab ich nicht bemerkt. Danke.
Die Vektoren werd ich mir dann nochmal angucken, vielleicht find´ ich ja was.

Notwendig ist es bei diesem Spiel vielleicht nicht, aber ich habe danach ein wesentlich größeres Projekt vor, und da wollte ich mal einige Effekte ausprobieren. Zum Beispiel die StencilBuffer-Schatten. Die sind zwar aufwendig, aber ich find sie schön.

Offline

 

#18 07.02.2005 10:17:11

artzuk
GodlikeMember
Ort: Leipzig
Registriert: 24.01.2005
Beiträge: 1164

Re: Fehlerhafte Reflektionen bei Cube Textur

Welches Schattensystem ist das jetzt in der Anwendung - ist das StencilShadow?


Mein kleiner .NET Blog: http://artzuk-interactive.de/

Offline

 

#19 07.02.2005 13:11:51

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: Fehlerhafte Reflektionen bei Cube Textur

So ist es, ja. Das ganze dreimal für drei Lichtquellen und mit Alphablending.....alphageblended.

Offline

 

#20 07.02.2005 18:14:01

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: Fehlerhafte Reflektionen bei Cube Textur

So! Hab´s geschafft! Ja wirklich.

Jetzt sieht alles toll aus. Und was war´s? Naja, ich hätte mal richtig lesen sollen, oder mir erst mal ein wenig Gedanken machen sollen.

Wie artzuk schon richtig tippte, waren die Up-Vektoren falsch. Das war alles. Ich dachte erst, man müsse die auch noch transformieren oder mein Up-Vektor der Kamera war falsch. Aber nein, das Sample macht´s richtig und eigentlich ist es ganz einfach.  :down:

Aber mit ausprobieren schafft man das nicht. Ich hab´s probiert. Drei Stunden lang. Es gibt zu viele Möglichkeiten. Da gibt´s diese tolle Funktion getCubeMapViewMatrix aus diesem RenderToEnvMap-Interface, das hätte mich vor Fehlern bewahrt, ist aber irgendwie immer abgestürzt.

Also hab ich schlußendlich mal in der SDK den Source für eben diese tolle Funktion gesucht und die Vektoren abgeschrieben. Und jetzt geht´s.

Wenn´s erst richtig toll aussieht, kann ich´s ja nochmal uploaden.

Danke nochmal an Alle für Ihre Hilfe, von mir aus können wir diesen Punkt dann abhaken.

Offline

 

#21 09.02.2005 15:40:42

Chris
ExtremeMember
Ort: Erlangen, Bay
Registriert: 24.01.2005
Beiträge: 694
Web-Seite

Re: Fehlerhafte Reflektionen bei Cube Textur

Hm hab nen kleinen Fehler in deinem StencilShadow gefunden...
wenn du eine lichquelle ganz in die ecke stellst und die Kugel auch dann geht das erstellen des Körpers für den StencilBuffer nicht mehr...

außerdem finde ich es irgendwie seltsam, dass bei 3 lichtquellen 4 reflektionen auf der kugel sind.

mfg
Chris


Attachments:
Attachment Icon fehlerbild.jpg, Größe: 81,164 bytes, Downloads: 917

Nimm meinen Rat an - ich brauch ihn sowieso nicht

Offline

 

#22 09.02.2005 19:01:31

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: Fehlerhafte Reflektionen bei Cube Textur

Hm. Also, daß das Schattenvolumen dann nicht mehr korrekt erstellt wird, stört mich eher wenig, denn wahrscheinlich steckt die Lampe dann schon in der Kugel und das ist sowieso nicht beabsichtigt.
(Obwohl das in dem Bild eigentlich nicht so aussieht...hm)
Das ist jedoch erstmal nicht das Problem.

Das Proggi, daß Du runtergeladen hast, war noch buggy, was die Reflektionen angeht. Siehe letzte Seite. Hab jetzt die korrekte Version hochgeladen.

Was den Schatten angeht, so betrachte ich die Probleme als pathologische Fälle.

Verrate mir doch bitte, womit Du den Screenshot gemacht hast!

Offline

 

#23 10.02.2005 14:39:26

Chris
ExtremeMember
Ort: Erlangen, Bay
Registriert: 24.01.2005
Beiträge: 694
Web-Seite

Re: Fehlerhafte Reflektionen bei Cube Textur

mit
der Taste "Druck"
+
Paint
+
Crtl+V

und dann speichern....
:mrgreen:

mfg Chris

achja: die lampe steckte nicht in der kugel (hab ich extra nachgeschaut... weil ih das auch zuerst vermutet hatte)


Nimm meinen Rat an - ich brauch ihn sowieso nicht

Offline

 

Brett Fußzeile

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson