Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 16:38

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Normalen abfragen
BeitragVerfasst: Do Nov 23, 2006 13:48 
Offline
DGL Member

Registriert: Mi Nov 22, 2006 12:55
Beiträge: 4
Hallo,
ich habe eine Szene, über die ich vorher nichts weiss, die von OpenGL gerendert wird. Nun möchte ich zu jedem (sichtbaren) Punkt des gerenderten Bildes die Normale wissen (die Normierung ist logischerweise egal, es handelt sich ja um einzelne Punkte), die Z-Richtung bzgl der Kamera ist auch nicht wichtig.
Es gibt viele Programme, die einen sogenannten G-Buffer für jeden Pixel haben, aber irgendwie habe ich dazu noch keinen Code (am besten in C++) finden können. Die Lösung sollte Grafikkarten- und Betriebssystemunabhängig sein. Man könnte einen ganzen Renderer schreiben, aber ich denke, es gibt eine sehr einfache Lösung, die ich bisher übersehen habe !?
Hat jemand eine Idee ? Gibts ein Tutorial, dass ich noch nicht gefunden habe ? Vielen Dank schonmal,... orph


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 23, 2006 15:41 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Wenn du den Rendervorgang selbst beeinflussen kannst wäre das Problem deutlich leichter und exakter zu lösen.
Sonst fällt mir da auf Anhieb nur ein, dir die x,y,z koords des Pixels sowie der angrenzenden Pixel zu besorgen (siehe GluUnproject) und daraus dann die Normale zu berechnen. Das ist jedoch erstens ungenau, und lieftert 2. an kanten, also dort wo sich die Z koordinate im Buffer stark ändert, wohl unsinnige Ergebnisse.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 23, 2006 16:08 
Offline
DGL Member

Registriert: Mi Nov 22, 2006 12:55
Beiträge: 4
Jep, über den Z-Buffer mit Anlegen von Tangenten ist es sehr unschön und auch nicht sehr exakt, das hab ich bereits ausprobiert. Ich habe gedacht, dass OpenGL vielleicht irgendwo die relevanten Normalen speichert, so dass ich sie mir ausgeben lassen kann - ohne mich mit den Normalen verdeckter Polygone rumzuärgern,..

Also, was ich habe, sind ja eine Szene mit einer Kameraposition,
- entweder kann man daraus irgendwie die Normalen angeben lassen (das hatte ich gehofft)
- oder aber man kopiert die Szene und macht einen netten Trick (der mir noch nicht eingefallen ist) und rendert die Szene, sodass man danach nicht das normale Bild, sondern (wie beim Z-Buffer) z.B. die X-Normalen zu jedem Pixel angezeigt bekommt (wiederum als Pixel), das gleiche dann nochmal mit den Y-Normalen und fertig - oder einen Wert in Rot und den nächsten in Grün (je nach gewünschter Genauigkeit) speichert
- oder etwas ganz anderes, an das ich noch nicht gedacht habe,...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 23, 2006 16:49 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ist das eine Szene die du selber renderst oder aus einem vollkommen anderen Programm?
Versucht du herraus zu finden was OpenGL mit deinen Normalen gemacht?

Irgendwie muss ich gerade gestehen, dass mir der Zusammenhang da ein bisschen verborgen bleibt. Weil wenn du es selberst hast du ja mehr oder weniger schon die Normalen. Entweder durch die Vertices oder wie auch immer. Ich hoffe du verstehst mein Problem und kannst etwas licht ins Dunkel bringen.

PS: Das Auslesen der Normalen bringt auch nichts, da OpenGL Normalen (genau so wie die Farbe) auch interpoliert.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 23, 2006 17:04 
Offline
DGL Member

Registriert: Mi Nov 22, 2006 12:55
Beiträge: 4
ja, ich render die Szene selbst. Die Normalen habe ich aber nie berechnet und auch die Szene nicht, das kommt woanders her. Ich möchte nur, so wie ich die Szene normal oder als Z-Buffer-Image rendern kann auch als "Normalenbild" rendern, oder halt die Werte ausspucken lassen (für die X- und die Y-Komponente in Bezug zur Kamera - oder eben allen 3 Richtungen, dann müsste ich halt noch ins Kamerasystem umrechnen). Ob die jetzt ein wenig interpoliert sind, ist egal, auf jeden Fall sind sie ja so gut Interpoliert, wie bei geschickter Wahl einer Lichtquelle es auch die Helligkeitsverteilung ist,..

Ich hoffe eigentlich, dass ich recht leicht an die Normalen komme - nur möchte ich eben zu grossen Aufwand verhindern,..


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 23, 2006 17:49 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 04, 2006 12:54
Beiträge: 263
Mit einem shader ist es ganz einfach:

Vertexshader
Code:
  1.  
  2. varying vec3 N;
  3. void main(void){
  4.   N = gl_NormalMatrix * gl_Normal;
  5.   gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
  6.   }
  7.  


Code:
  1. varying vec4 color;
  2. varying vec3 N;
  3. void main(void){
  4.    N=normalize(N);
  5.    gl_FragColor = vec4(N*0.5 + 0.5,1.0);
  6.    }


Um wieder aus der Farbe nach dem Pixellesen einen Vektor zu machen müssen die Farbwerte durch 128 geteilt werden und anschließend 1 abgezogen werden. Ansonsten gibt der shader schöne Bonbon farbene Bilder


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 23, 2006 19:27 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Aha. Das erklärt das ganze doch schon mal mehr. Es geht aber noch anders als mit Shadern. Das haben wir sogar schon in dem Cubemap Tutorial beschrieben. Na ja so halb.

Ich denke das sollte als Vorlage für die Textur genügen und zum Zeichnen bräuchtest du dann nur noch folgendes tun.
Code:
  1.   glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP);
  2.   glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP);
  3.   glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP);
  4.   glEnable(GL_TEXTURE_GEN_S);
  5.   glEnable(GL_TEXTURE_GEN_T);
  6.   glEnable(GL_TEXTURE_GEN_R);

Damit werden deine Texturkoordinaten automatisch an deine Normalen angepasst. Für den Rest dann einfach Werte auslesen und das sollte genügen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 28, 2006 17:06 
Offline
DGL Member

Registriert: Mi Nov 22, 2006 12:55
Beiträge: 4
So, erstmal danke für die schnellen Antworten, ich habe mich heute mal wieder um das Problem kümmern können. Mit einem Shader kann ich es Projektbedingt leider nicht machen, also hab ich mir das mit den Cubemaps mal angeschaut. Da mich nur die vordere Seite interssiert, hab ich auch nur an GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT die Daten geschickt. Wenn ich das richtig verstehe, ist das Erzeugen der Cubemap statisch und irgendeine trickreiche Map, um die Normalen zu berechnen ? Also jeder Punkt auf der vorderen Würfelseite wird in diese Map gespeichert und normalisiert. Wozu glScaleVector und glAddVector gut sind, habe ich leider nicht verstehen können, da man im Internet keine zweite Seite zu den Befehlen bekommt. Durch glTexImage2D werden die Daten an gl geschickt.
Durch glTexGeni(GL_<X>, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP); werden die Texturen anhand der Normalen-Map konstruiert und durch glEnable(GL_TEXTURE_GEN_<X>); auch beim rendern beachtet ??
Sollte ich das halbwegs richtig verstanden haben - bis auf glScaleVector und glAddVector hab ich auch alles in C++ implementiert. Wenn ich z.B. einen Quader rendern lasse mit Texturen, werden diese nicht mehr richtig angezeigt, sondern man sieht Graustufen an den Seiten, die stark variieren beim Ändern des Betrachtsungswinkels. Innerhalb einer Fläche bleibt jedoch das Grau gleich - ich habe aber den Eindruck, das dies nur ein Fehler ist und mit der normalen-Map überhaupt nichts zu tun hat - vermutlich bin ich einfach nur nicht in der Lage, sie auszugeben.


Code:
  1.  
  2.             GLfloat *Data = new GLfloat[_iImageWidth*_iImageWidth*3];
  3.  
  4.             for (int i=0;i<10;i++) {
  5.                 for (int j=0;j<10;j++) {
  6.                     Data[i*_iImageWidth*3+j*3+0] = _iImageWidth/2*Normalisierung;
  7.                     Data[i*_iImageWidth*3+j*3+1] = (_iImageWidth/2-j)*Normalisierung;
  8.                     Data[i*_iImageWidth*3+j*3+2] = (_iImageWidth/2-i)*Normalisierung;
  9.                                         // das Normalisieren kann man natürlich noch eleganter machen ;-)
  10.                 }
  11.             }
  12.  
  13.             glEnable(GL_TEXTURE_CUBE_MAP_EXT);
  14.             glEnable(GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT);
  15.             glTexImage2D(
  16.                 GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT,
  17.                 0,
  18.                 GL_RGBA8,
  19.                 _iImageWidth,
  20.                 _iImageWidth,
  21.                 0,
  22.                 GL_RGB,
  23.                 GL_FLOAT,
  24.                 Data
  25.             );
  26.  
  27.                 glEnable(GL_TEXTURE_GEN_S);
  28.                 glEnable(GL_TEXTURE_GEN_T);
  29.                 glEnable(GL_TEXTURE_GEN_R);
  30.                 glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_EXT);
  31.                 glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_EXT);
  32.                 glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_EXT);
  33.  


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]