Ich lerne, in 2D-Grafiken mit OpenGL normale Karten (per Pixelbeleuchtung?) zu verwenden.
Neu im normalen Mapping war, dass ich meinen Kopf um den Sobel-Operator und die Erzeugung von normalen Karten wickelte (hauptsächlich dank dies ), das ein (2D-) Array von Normalen aus einem (2D-) Array von Pixeldaten erstellt.
(Die meisten Tutorials und Foren-Threads, die ich gefunden habe, waren spezifisch für 3D-Anwendungen und Modellierungssoftware. Ich beabsichtige, diese Funktionalität selbst in C ++ zu implementieren.)
Ich empfehle Ihnen, sich anzuschauen:
Diese nvidia-Präsentation zum Bumb Mapping
Ich habe das eine Weile nicht angeschaut, aber ich erinnere mich, dass es die meisten Details bei der Implementierung eines Bump Map Shaders durchging, sollte ein paar Ideen laufen.
Dieses andere nvidia-Tutorial zur Implementierung von Bump-Mappings in der cg-Shader-Sprache
Dieses Bump-Mapping-Tutorial könnte auch hilfreich sein .
Ich weiß, dass all diese Dinge nicht für das normale Mapping sind, aber sie sind ein guter Anfang.
Auch wenn es Unterschiede in Shader-Sprachen gibt, sollte es nicht schwer sein, Formulierer zwischen ihnen zu konvertieren, wenn Sie GLSL verwenden möchten.
Wie ybungalobill sagte, können Sie es ohne Shader machen, aber wenn Sie nicht gerade an einem Bildungsprojekt (für Ihre Ausbildung) oder einem bestimmten Embedded-Gerät arbeiten, habe ich keine Ahnung, warum zum Teufel Sie wollen zu - aber wenn du hier suchen musst, wurde es vor den Shadern geschrieben und als Referenz aktualisiert sie später.
- Was mache ich, sobald ich die normale Karte habe?
- Muss ich es bei OpenGL registrieren?
Ja, Sie müssen es als Textur laden.
- Muss es mit der Textur verknüpft werden, wenn ja, wie wird es gemacht?
Wenn Sie mit der Farbtextur assoziieren, dann nein. Sie müssen eine Textur erstellen, die die normale Map enthält, um sie später mit OpenGl zu verwenden.
- Wie wird es einem 2D-texturierten Quad zugeordnet?
Ihre normale Map ist nur eine weitere Textur, Sie binden sie und kartieren sie wie jede andere Textur.
Normale Karte speichert die Normalen in Tangentialraumkoordinaten. Um die Beleuchtung pro Pixel zu berechnen, müssen Sie die relative Position der Lichtquelle im Tangentialraumkoordinatensystem kennen. Dies geschieht durch Einstellen zusätzlicher Parameter pro Vertex (normal, tangential, binormal), Berechnen der Lichtquellenposition in Tangentialraumkoordinaten und Interpolieren dieser Position entlang der Dreiecke. Im Fragment-Shader suchen Sie die Normale in der Normal-Map und führen die gewünschte Beleuchtungsberechnung basierend auf den interpolierten Parametern durch.
- (Ist das etwas, was ich ohne Shader / GLSL machen kann?)
Ja, Sie können einige Legacy-Erweiterungen verwenden, um die Kombinationsfunktionen für die Multitextur-Umgebung zu programmieren. Habe es nie selbst gemacht, aber es sieht wie die Hölle aus.
Das Thema ist ziemlich alt, aber ich werde es für jeden Anfänger beantworten, der hier Hilfe suchen könnte:
1) & amp; 2)
Ihre normale Karte ist wie eine normale diffuse Textur, Sie müssen sie von der Festplatte laden, Ihre texture2D wie bei einer diffusen Textur erstellen und sie mit den anderen Texturen sperren, um sie an die Shader zu senden. Also, um es zusammenzufassen, normale Maps, Höhenkarten, etc sind nicht anders, wenn Sie mit ihnen CPU-Seite beschäftigen ... es lädt sie immer, erstellt die Textur und schließt sie.
3)
Normale Karten sind nur eine Möglichkeit, die Normalen jedes Fragments in einer Textur zu speichern. Es ist besser, sie mit der entsprechenden diffusen Textur zu verwenden, denn so können Sie die kleinen Details fälschen. Trotzdem ist es in manchen Fällen nicht immer notwendig ... zum Beispiel beim letzten Mal, als ich daran arbeitete, Wasser zu rendern ... Ich benutzte eine Dudv-Karte und eine normale Karte, aber nicht die entsprechende diffuse Karte, wie ich sie benutzte in Texturen rendern, um die Reflektion zu erreichen.
4)
normale Karten werden mit denselben Texturkoordinaten wie die diffuse Textur abgebildet ... es bedeutet, dass, wenn Sie ein Quad haben, die Koordinaten sind 0; 0, 0; 1, 1; 0, 1; 1 Dies sind die Koordinaten, mit denen Sie beide Texturen zuordnen.
5)
Du könntest es ohne Shader machen, ich denke ... du kannst es sogar ohne OpenGL machen, wenn du willst ... Shader sind für diese Art von Operationen ausgelegt und es wird einfacher sein, dies mit Shadern zu tun.
Also, normale Karten sind Texturen, die normale Vektoren in Farben kodieren ... Ein normaler Vektor ist ein 3D-Vektor, und Farben sind auch 3D-Vektoren. Wenn Sie Beleuchtung verwenden, senden Sie normalerweise Ihre Normalen vom Vertex-Shader zum Fragment-Shader ... der Fragment-Shader interpoliert den Wert der Vertex-Normalen, um eine Annäherung an den eigenen Normalenvektor des Pixels herauszufinden. Dies geschieht standardmäßig ...
Bei normalen Maps verwenden Sie keinen Eckennormalenvektor, sondern den in der Textur kodierten Normalvektor.
Zuerst müssen Sie die Berechnung der Beleuchtung vom Weltraum in den Tangentenraum umwandeln. Das geschieht im Vertex-Shader.
Dann werden Sie Ihre normale Map im Fragment-Shader wie eine gewöhnliche Textur probieren. Sie erhalten eine RGB-Farbe Ihres Pixels. Sie müssen diesen Wert in einen normalen Vektor umwandeln, dh mit 2 multiplizieren und 1 subtrahieren, dh rgb * 2 - 1, und ihn dann als Ihren normalen Vektor in der Lichtberechnung verwenden.