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

Aktuelle Zeit: Fr Jul 18, 2025 05:16

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



Ein neues Thema erstellen Auf das Thema antworten  [ 46 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4  Nächste
Autor Nachricht
 Betreff des Beitrags: Re: und ....
BeitragVerfasst: Mo Mär 03, 2003 20:43 
Zitat:
gibts keine einfacheren beispiele mit einem polygon, das belichtet wird ( farbe egal und es muss sich auch nichts bewegen...)
der code ist nämlich sehr undurchsichtlich ...
(wenns geht auf deutsch :wink: -- wegen den vielen Fachausdrücken)


Nach oben
  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 26, 2003 17:32 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Also als Müll würde ich das OpenGL Licht wirklich nicht bezeichnen.
Immerhin dürfte es recht schwierig werdem, bei echter dynamischer Beleuchtung von Objekten die T&L-Fähigkeit moderner Grafikkarten unter OpenGL voll zu nutzen, ohne dabei OpenGL Licht zu verwenden.

Man könnte natürlich direkt Vertex Shader einsetzen, die es ja ab OpenGL 1.4 als ARB Funktionsblock gibt, aber erstens ist das recht aufwendig - und zweitens nicht von jeder Grafikkarte unterstützt. Also bis Vertex Shader als Standardfunktionen im OpenGL ICD implementiert sind, und es einem dann egal sein kann, ob die Grafikkarte dies tatsächlich kann, oder der Treiber halt die CPU heranzieht (wahrscheinlich in Version 2.0) wird glLight durchaus von Nutz und Frommen sein (und auch dann könnte ich mir vorstellen, dass bei einem gut programmierten OpenGL Treiber die Beleuchtungsroutinen optimierter sein werden, als irgendwelche selbst gestrickten Progrämmchen - allerdings eröffnet sich dann natürlich ein neuer Horizont für Special Effects).

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 27, 2003 11:06 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
Die oben erwähnte Demo ist zwar ganz nett, aber in der Praxis für ein großes Level unbracuhbar da der Speicherbedarf und die Geschwindigkeit (vor allem aber der Speicherbedarf!) von 3D-Texturen eine Realisierung in Großen Mase (also für mehr als nur 'ne Demo) eher unwahrscheinlich macht. Zumindest vom aktuellen Zeitpunkt.

Für Effekte wie z.B. Flackern kann man auch animierte Texturen verwenden. Einfach mehrere Lightmaps pro Polygon (an den Stellen an welchen es flackert) berrechnen und diese in gewissen abständen duchschalten um eine Animation zu erhalten! Für so nette sachen wie einen fliegenden Feuerball bleiben einem dann aber wahrscheinlich nur dynamische Lightmaps oder gar irgend welche Stencil-Buffer tricksereien übrig!

_________________
Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 28, 2003 20:59 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Dynamisches Licht mit Hifle von 3D-Texturen ist kein Problem. Für die Lichtintensität reicht eine Auflösung von 64*64*64 aus. Man benötigt nur einen Kanal und nimmt dann z.B. Luminance als Format. Dann braucht die ganze 3D-Texture nur 256kB. Das sind soviel wie eine RGBA Texture mit der Auflösung von 256*256. Die 3D-Texture benötigt man ja auch nur einmal. Eventuell kann man auch noch verschiedene 3D-Texturen für Spotlights oder so machen. Eine ganz andere Idee das Licht zu berechnen ist mit Hilfe der PixelShader. Ab einer GF% oder Radeon 9700 ist es kein Problem mehr die Rechnung 1-(x^2+y^2+z^2) direkt ohne Texture zu berechnen, was für eine höhere Rechengenauigkeit sorgt. Auch auf einer GF4 kann man über die Texture-Shader diese Rechnung ausführen. Das Skalarprodukt wird dabei sogar auf der GF4 mit Gleichkommagenauigkeit berechnen.
Zusätzlich zur 3D-Texture empfielt es sich noch eine Cubemap für ein Licht-Muster wie z.B. ein Gitter oder einen Kreis zu projektieren um das Licht interessanter erscheinen zu lassen.
Wer keine 3D-Texturen verwenden kann (GF1/GF2), kann die 3D-Texture auch durch eine 2D und eine 1D Texture ersetzten. Dann teilt man den Term 1-(x^2+y^2+z^2) einfach in x^2+y^2 und z^2 auf.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 31, 2003 07:33 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
Da Du Ahnung von der Materia zu haben scheinst rekrutiere ich Dich hiermit zu einem freiwilligen Tutorial über das Thema ;)

_________________
Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 31, 2003 15:54 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Ich kann auch mal, wenn der Befarf besteht, ein Tutorial schreiben.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 31, 2003 16:02 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
Gerne, jeder Zeit. was den Bedarf angeht: der besteht auf jeden Fall :D

_________________
Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 31, 2003 19:31 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Okt 26, 2002 17:14
Beiträge: 188
Wohnort: Hannover/Lüneburg
Jow, tät mich nämlich auch mal interessieren. Also immer ran da ;)

_________________
Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 01, 2003 10:58 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Lars hab mir mal deine Seite angeschaut,
also deine Engine hat Doom3 Qualitäten.
Die Bumpmaps sind so perfect... Respekt und das Pixelshader wasser erste sahne.

Ich hatte dir mal vor langer zeit ne Mail geschrieben, bekam als Antwort nen Link zu Nvidia.de.
Hab natürlich jeden Source den ich gefunden habe im Nvidia dev networt runtergeladen und mir mal genauer angeschaut... ich peil so gut wie nix davon... Liegt wohl am C++ Syntax...

Du kennst doch sicherlich Sulaco.co.za, da gibts nen Source für "Pixel shader for geforce 1 and up".
Ich hab mal versucht das nachzurekonstruieren und mir nen Sample gemacht.
Einfach nen Quad mit ner Steintexture und dann hab ich mit dem Normal Map filter von NVIDIA ne Bumpmap gemacht und halt das ganze zeugs "Register Combiners" und so reinkopiert.

Ich verstehe eins nicht, wieso braucht das teil GL_LIGHTING ???
wenn ich GL_LIGHTING abschalte dann funzt das bumpmapping nich mehr so wies soll :(

Ich will eigentlich nur wissen, welche Position zum Beispiel ne Lichtquelle (Mehrere lichtquellen ??) haben muss... das es richtig gut aussieht so wie in deiner Engine.
Und was ich noch gemerkt habe, die Position von den Lichtquellen wird irgendwie über den Farb wert gemacht... das peil ich mal überhaupt nicht.

Ich wäre echt dankbar wenn du mir das mal mit dem Bumpmapping genauer erklären könntest und nicht wieder auf <a href='http://developer.nvidia.com' target='_blank'>http://developer.nvidia.com</a> schickst.

Danke,
matane,
Final


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 01, 2003 11:20 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Warum die Sulaco-Demo von GL_LIGHTING ab hängt weiß ich nicht. Normalerweise wird das OpenGL Licht nicht für Bummapping benutzt.
Den Lichtvektor in die Farbe zu packen ist eigentlich falsch, weil Farbwerte immer auf den Bereich 0..1 begrenzt werden.

Normalerweise verwendet man für das Bumpmapping eine Normalisationscubemap und die Bumpmap.
Die Cubemap enthält für jeden Punkt(s,t,r) den zugehörigen Vektor als Farbe (r,gb). Denn Lichtvektor gibt man dann als Texturekoordinaten für die Cubemap an. Dadurch wird der Lichtvektor über der Fläche interpoliert. Die Cubemap sorgt dafür, dass der Vektor immer die Länge 1 hat.

Texture0: Cubemap
Texture1:Bumpmap

Man braucht eigentlich keine Register-Combiner sondern kann Bumpmapping auch mit den gltexenv-Funkionen einstellen. Es muß ja im Grund genommen nur ein Scalarprodukt berechnet werden.

const
GL_DOT3_RGB_ARB = $86AE;

glActiveTextureARB(gl_texture1_arb);
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_COMBINE_EXT);
glTexEnvi(GL_TEXTURE_ENV,GL_COMBINE_RGB_EXT,GL_DOT3_RGB_ARB);
glTexEnvi(GL_TEXTURE_ENV,GL_SOURCE0_RGB_EXT,GL_TEXTURE0_ARB);
glTexEnvi(GL_TEXTURE_ENV,GL_OPERAND0_RGB_EXT,GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV,GL_SOURCE1_RGB_EXT,GL_TEXTURE1_ARB);
glTexEnvi(GL_TEXTURE_ENV,GL_OPERAND1_RGB_EXT,GL_SRC_COLOR);

Farbe=Texture0 . Texture1


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 01, 2003 11:23 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Die Normalizations-Cubemap kann man so erstellen:
Eventuell muß man bei den Konstanten EXT durch ARB ersetzen.


Code:
  1.  
  2. procedure CreateCubeNormalMap;
  3. type
  4. TRGB=record
  5. r,g,b:byte;
  6. end;
  7. var
  8. i,a,b:integer;
  9. v:TVertex;
  10. s,t:single;
  11. texdata:array[0..255,0..255] of TRGB;
  12. begin
  13. glenable(GL_TEXTURE_CUBE_MAP_EXT);
  14. glbindtexture(GL_TEXTURE_CUBE_MAP_EXT,texid[0]);
  15. for i:=0 to 5 do
  16. begin
  17.  for a:=0 to 255 do
  18.  &nbsp;for b:=0 to 255 do
  19.  &nbsp; begin
  20.  &nbsp; s:=(((a+0.5)/255)*2-1);
  21.  &nbsp; t:=(((b+0.5)/255)*2-1);
  22.  &nbsp; case i of
  23.  &nbsp; 0:v:=vector(1,-t,-s);
  24.  &nbsp; 1:v:=vector(-1,-t,s);
  25.  &nbsp; 2:v:=vector(s,1,t);
  26.  &nbsp; 3:v:=vector(s,-1,-t);
  27.  &nbsp; 4:v:=vector(s,-t,1);
  28.  &nbsp; 5:v:=vector(-s,-t,-1);
  29.  &nbsp; end;
  30.  &nbsp; v:=vec_normalize(v);
  31.  &nbsp; texdata[b,a].r:=trunc(v.x*127)+128;
  32.  &nbsp; texdata[b,a].g:=trunc(v.y*127)+128;
  33.  &nbsp; texdata[b,a].b:=trunc(v.z*127)+128;
  34.  &nbsp; end;
  35.  &nbsp;glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT+i,0,gl_rgb8,256,256,0,gl_RGB,gl_unsigned_byte,@texdata[0]);
  36.  &nbsp;gltexparameteri(GL_TEXTURE_CUBE_MAP_EXT,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE_EXT);
  37.  &nbsp;gltexparameteri(GL_TEXTURE_CUBE_MAP_EXT,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE_EXT);
  38.  end;
  39. gldisable(GL_TEXTURE_CUBE_MAP_EXT);
  40. end;
  41.  
  42.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 01, 2003 18:48 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mai 06, 2002 20:27
Beiträge: 479
Wohnort: Bremen
Also ich möchte auch nochmal bekräftigen, das ein Tutorial zu diesem Thema super wäre! Grade was die komplizierteren Dinge der CG angeht haben wir noch einen großen Bedarf!

-lith

_________________
Selber Denken macht klug!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 01, 2003 19:52 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Ok, dann mache ich mir mal Gedanken zu einem Tutorial über Bumpmapping. Ich könnte auch noch etwas zur neuen ARB_VERTEX_BUFFER_OBJECT Erweiterung schreiben. Damit kann man nämlich ohne großen Aufwand die Dreiecksanzahl enorm steigern. Der Vorteil dieser Erweiterung ist, daß sie auf NVidia und ATI Karten unterstützt wird. Da die Erweiterung erst vor drei Wochen veröffentlicht wurde, kann es sein, daß der ein oder andere sie noch nicht kennt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 10, 2003 17:48 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Okt 26, 2002 17:14
Beiträge: 188
Wohnort: Hannover/Lüneburg
Hallo!

Ich greif das Thema jetzt einfach mal wieder auf, statt ein neues dafür zu eröffnen. Ich habe gerade noch ein paar Probs, wie ich den Lichtvektor beim Bumpmapping übergeben muss. Ich hab ein Beispiel mir von ATI angesehen und nachprogrammiert, dass den Lichtvektor als Vertexfarbe übergibt und durch das Smoothshading über die Fläche interpoliert statt mit einer Cubemap. Da hab ich es aber auch nicht wirklich hinbekommen :(
Irgendwie ist der errechnete Lichtvektor immer falsch. Ich muss ja wohl die Rotation und Translation des Objektes berücksichtigen, etc... aber wie genau?

_________________
Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 10, 2003 18:33 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Da gibt es 2 Probleme:
1. Die Vertexfarbe wird ja auf einen Bereich von 0..1 beschränkt, deshalb kann man Punktlichter, bei denen der Lichtvektor zu einem Vertex jeden beliebigen Wert annehmen kann schlecht damit berechnen.
2. Da die Normalmap so berechnet wird, als würde sie in der Z-Ebene liegen, sind die Vektoren natürlich für alle Flächen, die nicht in der Z-Ebene liegen und einen Normalvektor von 0,0,1 haben falsch. Jede Fläche oder jeder Vertex bekommt einen eigenen Raum zugeordnet, den man als Tangent Space bezeichnet.
Jede Normale aus der Normalmap muß aus dem Tangent Space in den normalen Raum transformiert werden, damit sie korrekt auf der Fläche liegt. Angenommen die Fläche hat die Normale (0,1,0) und die Normale aus der Normalmap (0,0,1) dann soll die endgültige Normale an diesem Punkt ja (0,1,0) sein und nicht (0,0,1) sein.
Es ist aber wesentlich schneller den Lichtvektor in den Tangent Space pro Vertex zu transformieren als bei jedem einzelnen Pixel die Normale.
Dafür braucht man pro Vertex zusätzlich zu dem Normalvektor noch einen Tangenten und Binormalvektor. Zusammen bilden diese 3 Vektoren eine Matrix.
T.x,t.y,t.z
B.x,b.y,b.z
N.x,n.y,n.z

Pro Vertex muß der Lichtvektor,aber nicht die Lichtposition, einfach mit dieser Matrix multipliziert werden.
Lichtvektor im TangentSpace=(Lichtposition-Vertex)*TangentSpaceMatrix

Die Tangente und die Binormale sind die Normalen der Ebenen an denen die u und v Koordinaten der Fläche ausgerichtet sind.
Wenn man z.B. eine Fläche hat, die auf der Z-Ebene liegt und man generiert die u Koordinaten der Texture anhand der X Position und die v Koordinaten anhand der Y Position, dann gilt ja:
u=Entfernung von Ebene mit Normale (1,0,0) und d=0
v=Entfernung von Ebene mit Normale (0,1,0) und d=0

Also gilt Tangente=1,0,0 und Binormale 0,1,0. Die Matrix ist dann
1,0,0
0,1,0
0,0,1
also die Einheitsmatrix. Das ist natürlich klar, denn genau für in diesem Fall ist die Normalmap berechnet worden und braucht nicht mehr transformiert zu werden.

Zum Thema Tangent Space gibt es ein gutes PDF:
<a href='http://developer.nvidia.com/docs/IO/1294/ATT/GDC01_PerPixelLighting.pdf' target='_blank'>http://developer.nvidia.com/docs/IO/1294/A...xelLighting.pdf</a>

Wenn man die Texturekoordinaten selber generiert, dann sollte man sie anhand von Ebenen generieren und hat dann gleich die entsprechenden Vektoren.
Auch bei Bezierkurven und bei allen parametrischen Flächen ist die Sache auch noch einfach. Hier gilt Tangent=normalisieren P(i,j)-P(i-1,j) und Binormale=normalisieren P(i,j)-P(i,j-1), wenn man die Texturekoordinaten u,v anhand der Koordinaten i und j berechnet.

Bei völlig freien Flächen berechnet man zuerst die Tangentvektoren für jede Fläche und bildet dann wie bei den Normalen für jeden Vertex den Durchschnitt der Tangenten von den Flächen zu denen der Vertex gehört.
Die Binormale sollte, wenn die Texture nicht verzerrt ist das Kreuzprodukt aus Normale und Tangente sein. Das ganze Verfahren ist aber nicht so sicher, wie wenn man die Tangenten beim Generieren der Texturekoordinaten erzeugt, weil es viele Sonderfälle gibt. Es kann z.B. passieren, das zwei Tangenten deren zugehörige Punkte an einer Kante liegen in zwei verschiedene Richtungen zeigen und beim Interpolieren dann an einer Stelle 0 herauskommt. Oder bei einem Zylinder kann es vorkommen, das es an einer Stelle eine Naht gibt, weil die Tangent nicht übereinstimmen. Zu diesen Problemen gibt es von NVidia ein PDF
<a href='http://www.nvidia.com/dev_content/gdc2002/texture_space_on_real_models.htm' target='_blank'>http://www.nvidia.com/dev_content/gdc2002/...real_models.htm</a>

So kann man die Tangentvektoren für beliebige Flächen ausrechnen.
Code:
  1. function CalcTangent(v1,v2,v3:TDrawVertex):TVertex;
  2. var
  3. n,n2:TVertex;
  4. begin
  5. n:=plane_normal(v1.pos,v2.pos,v3.pos);
  6. n2:=vec_cross(vector(v1.pos.x,v1.texu,v1.texv),vector(v2.pos.x,v2.texu,v2.texv));
  7. result.x:=-n2.y/n2.x;
  8.  
  9. n:=plane_normal(v1.pos,v2.pos,v3.pos);
  10. n2:=vec_cross(vector(v1.pos.y,v1.texu,v1.texv),vector(v2.pos.y,v2.texu,v2.texv));
  11. result.y:=-n2.y/n2.x;
  12.  
  13. n:=plane_normal(v1.pos,v2.pos,v3.pos);
  14. n2:=vec_cross(vector(v1.pos.z,v1.texu,v1.texv),vector(v2.pos.z,v2.texu,v2.texv));
  15. result.z:=-n2.y/n2.x;
  16.  
  17. end;


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 46 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 26 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.009s | 14 Queries | GZIP : On ]