Bump Maps generieren in DirectX9
-
Hey,
ich arbeite gerade mit dem Buch des Herrn Scherfgen
und jetzt bin ich bei einer recht coolen Übungsaufgabe angelangt:
Versuchen Sie, mit Hilfe einer dynamischen Bump-Map, die in jedem Frame neu berechnet wird, eine Wasseroberfläche darzustellen, in der sich die Umgebung spiegelt.Ich frage mich jetzt, wie ich das am besten mit der dynamischen Bump Map mache.
Mir fallen zwei Möglichkeiten ein:- Eine fertige Wasserbumpmap nehmen und jeden Frame die u- und v-Steigungswerte mit der 2x2 Matrix transformieren oder
- Jeden Frame mit Sinus eine komplett neue BumpMap generieren.
Wahrscheinlich wäre die erste Möglichkeit besser, oder?
Wie könnte man denn die zweite Option realisieren?(Was hast du denn gemeint in deinem Buch, TomasRiker?
)Vielen Dank
-
Ich denke, ich habe dabei eher an das zweite gedacht

Solange die Bump-Map keine zu hohe Auflösung hat (vielleicht so 128x128 - man kann sie ja kacheln), sollte das gehen.
-
Oki gut, wie erstelle ich denn aber eine Textur in DirectX? Das wurde bis jetzt nirgendwo behandelt.
Dankeschön
-
Das ist ganz einfach: IDirect3DDevice::CreateTexture()
Solche Funktionen gibts für alle Ressourcen-Arten.
-
Wenn ich jetzt in die Textur schreiben möchte, wie mache ich das?
Habe gerade diese Funktion gefunden:
D3DXCreateTextureFromFileInMemory()
Ist das in Ordnung?
-
Nein, damit lädst du aus einer Datei, deren Inhalt du in den Arbeitsspeicher geladen hast.
Um in Texturen zu schreiben, musst du sie mittels LockRect sperren. Dann kriegst du einen Zeiger für deine Schreiboperationen. Danach mit UnlockRect wieder entsperren.
(Dokumentation!)
-
Gut danke, hab was gefunden: http://www.toymaker.info/Games/html/direct3d_faq.html#D3D9
-
TomasRiker schrieb:
Nein, damit lädst du aus einer Datei, deren Inhalt du in den Arbeitsspeicher geladen hast.
Um in Texturen zu schreiben, musst du sie mittels LockRect sperren. Dann kriegst du einen Zeiger für deine Schreiboperationen. Danach mit UnlockRect wieder entsperren.
(Dokumentation!)vielleicht solltest du die doku als vorwort ins buch einfuegen

-
Okaaaay, ich hab bis jetzt mal mit dem Environment Mapping angefangen. Das geht soweit. Ich hab nur noch ein kleines Problem.
Erstmal zwei Bilder:
Hier sieht alles wunderbar aus:
http://bloody-blades.de/images/envbump1.jpgAber wenn man die Kamera dreht:
http://bloody-blades.de/images/envbump2.jpg
Die Skybox bleibt korrekt stehen beim Drehen, aber das Environment Mapping stimmt nicht mehr. Die Env Map Textur wird immer so berechnet, als würde sich die Skybox mitdrehen.Das gleiche Phänomen ist mir auch in deinem Environment Mapping Beispiel aufgefallen. Nur da fällt es nicht so auf, weils so kleine Kugeln sind.
Wie kann ich das Problem lösen? Kann man die Cubemap nicht irgendwie mitrotieren bevor DirectX seine Texturkoordinaten berechnet?
Dankeschön
::edit::
haha mir kam da grad eine Idee
Ich kann die Textur ja danach einfach drehen... oki das muss ich doch mal testen::edit 2:
muhar har har har
es geht// Rotate texture with camera D3DXMATRIXA16 texRot; D3DXMatrixRotationY(&texRot, camera.angle); d3dDevice->SetTransform(D3DTS_TEXTURE0, &texRot);Wunderbar

-
solche screens verlocken mich dazu das buch nochmal aus dem regal zu kramen. ich habs nach den ersten 100 seiten oder so liegen gelassen weil ich die motivation verloren hatte.
-
Hm, mir wird grad was bewusst. Beim normalen Environment Mapping ohne Bump Mapping wird ja einfach nur für die 3 Vertices die Koordinate auf der Cubemap berechnet und dann über das Dreieck gespannt. So ist es eine detailreiche Spiegelung (siehe meine Screens oben).
Wenn man Bump Mapping jetzt anmacht, funktioniert das ja gar nicht mehr. Das müsste man ja dann pixelweise machen und daraus eine neue Textur generieren...
Gibts da nicht noch irgendwelche anderen Möglichkeiten, wo ich eine detailreiche Spiegelung mit Brechung durch die Bump Map kriege?
TravisG schrieb:
weil ich die motivation verloren hatte.
Also soo schlecht is das Buch doch auch nicht...

Nein Scherz, ich find's echt ziemlich gut.
-
korrekt waere:
im pixelshader den interpolierten und renormalisierten view-vector (camera->eckpunkt) an der per-pixel-normale der bumpmap (im tangent- oder objectspace) spiegeln und mit der entsprechenden matrix zurueck in den worldspace transformieren und aus der cubemap holen.
in anbetracht deines einzelnen polygons bieten sich natuerlich diverse vereinfachungen an.
-
Die Bumpmap würd ich nicht komplett für jeden Frame neu Berechnen, sondern einfach zwei oder Drei Teturen erstellen, die sich aufeinander Bewegen und immer zu einer Textur Addieren.
-
Bis jetzt komplett ohne Bumpmapping: