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

Aktuelle Zeit: Fr Jul 18, 2025 07:58

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



Ein neues Thema erstellen Auf das Thema antworten  [ 37 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags: Dynamisches Licht (Shader-Problem)
BeitragVerfasst: Sa Feb 21, 2009 21:05 
Offline
DGL Member
Benutzeravatar

Registriert: Do Feb 21, 2008 22:10
Beiträge: 89
Wohnort: Boppard
Hi,

ich würde gerne dynamisches Licht simulieren.
Damit meine ich KEINEN Schatten, sondern nur Licht, z.B. von Projektilen wie bei Quake, UT, usw.

Also nur in nem sehr kleinen Radius.


Was gibts da für möglichkeite, Lösungen, usw.?


MFG und Danke


Zuletzt geändert von olee am So Feb 22, 2009 14:18, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 21, 2009 21:41 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Das was du suchst ist lokale Beleuchtung (bzw. local illumination).

Einfaches Licht geht recht einfach über die feste Funktionspipeline. Ohne das Tutorial gelesen zu haben, denke ich das du hiermit weiterkommst:
http://wiki.delphigl.com/index.php/Tutorial_Lektion_8
Im wesentlichen setzt du eine Lichtquelle und schaltest sie ein, den Rest macht OpenGL.

Die feste Funktionspipeline berechnet die Beleuchtung allerdings nur pro Vertex und interpoliert dann dazwischen. Wesentlich besser sieht das natürlich aus, wenn du die Beleuchtung pro Pixel berechnest. Das geht aber nur mit Shadern, was für Anfänger zunächst nicht zu empfehlen ist. Man sollte sich meiner Meinung nach zuerst mal mit der festen Pipeline austoben. :)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 21, 2009 22:05 
Offline
DGL Member
Benutzeravatar

Registriert: Do Feb 21, 2008 22:10
Beiträge: 89
Wohnort: Boppard
Ja genau da ist ja mein Problem.

Es handelt sich hier um Lichteffekte, die auf einen Raum von 1-5 Metern (gedachte Meter ^^) handelt.

Und auf meinen Maps gibts Polygone die größer als das sind.

Also wär ein Vertex-Licht nicht gerade gut.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 21, 2009 22:08 
Offline
DGL Member
Benutzeravatar

Registriert: Do Feb 21, 2008 22:10
Beiträge: 89
Wohnort: Boppard
Außerdem muss auch die Lichtqualität nicht sehr hoch sein, da dieses Licht nur kurz zu sehen wär / in Bewegung ist.

Also so gesehen suche ichnach einem billigen Trick, ein solches Licht zu simulieren.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 21, 2009 22:23 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Raum von 1-5 Metern (gedachte Meter ^^) handelt.

Und auf meinen Maps gibts Polygone die größer als das sind.

Vermutlich zielst du dann auf alte Hardware, d.h. Shader sind keine Option?

Zitat:
Also so gesehen suche ichnach einem billigen Trick, ein solches Licht zu simulieren.

Also da du damit ja scheinbar eine Art Mündungsfeuer machen willst:
Für ein Mündungsfeuer rendert man ja meist eine Art "Kreuz" aus einer Mündungsfeuer-Textur an die Mündung der Waffe. Um jetzt die Umgebung kurz aufzuhellen könntest du einfach zusätzlich ein sagen wir 2-3 Meter großes Quad mit einer Kreis-Textur additiv an die Mündung rendern. Dürfte aber ziemlich grauenhaft aussehen, weil entfernte Objekte genauso beleuchtet werden, wie nahe Objekte. Vielleicht kann man da noch was mit dem Z-Buffer und mehreren Passes tricksen, aber vermutlich ist da ein Fragmentshader einfacher und schneller.

Ich würde sagen schau dir einfach mal Shader an, so kompliziert ist ein einfacher Per-Pixel-Lightshader nun auch nicht. Sollte sich auch nahtlos mit der festen Pipeline integrieren lassen. D.h. du kannst den Shader dann auch nur für einzelne Objekte benutzen und alles andere wie gewohnt rendern.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 21, 2009 22:32 
Offline
DGL Member
Benutzeravatar

Registriert: Do Feb 21, 2008 22:10
Beiträge: 89
Wohnort: Boppard
Ok dann komme ich also wohl um Shader nicht rum :(

Hättest du vielleich einen Link oder ein Beispiel für das, was ich machen will?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 21, 2009 22:51 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Also du solltest zunächst mal den Shader-Artikel im Wiki wenigstens überfliegen, um einen Eindruck zu kriegen was Shader sind und was damit möglich ist. Die Abschnitte zu Geometryshader und Transform-Feedback kannst du überspringen. In dem Artikel findet sich auch bereits ein Beispiel zu Per-Pixel-Lightning, allerdings ohne Quellcode.

Anschließend empfiehlt sich das GLSL-Tutorial. GLSL ist die Hochsprache mit der Shader geschrieben werden. Dort gibt es auch Quellcode-Beispiele wie du Shader in deine Anwendung einbindest. Im zweiten GLSL Tutorial findet sich auch Quellcode für Per-Pixel-Light. (da ist beim Fragmentshader wahrscheinlich nen kleiner Fehler, siehe Diskussion)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 21, 2009 23:57 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Coolcat hat geschrieben:
Im zweiten GLSL Tutorial findet sich auch Quellcode für Per-Pixel-Light. (da ist beim Fragmentshader wahrscheinlich nen kleiner Fehler, siehe Diskussion)


Die Art wie die Lichtanteile zusammengerechnet werden, ist aber auch nicht ganz richtig wie mir scheint (sieht man ja am Bild).
Ich weiß nicht so genau was "gl_FrontLightModelProduct.sceneColor" so alles macht, aber das Diffuse und Ambiente Licht sollten mit der Objektfarbe multipliziert werden.
Also ich benutze immer "ObjColor*(Ambient+Diffuse)+Specular+Emission". "ObjColor" ist wiederum das Produkt aus der Vertexfarbe und den Farben der Texturen.
Ansonsten sind zum Beispiel rote Objekte die mit blauem Licht angestrahlt werden (hell) Lila. Sie sollten aber schwarz sein, weil das blaue Licht komplett absorbiert wird.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 22, 2009 00:26 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Doch gibt wohl ein Beispiel zum per Pixel Lighting.

Allerdings nur für eine Lichtquelle. Ein For-Schleife würde mehrere erlauben.

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 22, 2009 13:02 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Wir haben vor im Wiki eine Shadersammlung entstehen zu lassen.
Momentan sind nur wenige dort zu finden, aber ich hoffe, dass durch ständiges erwähnen der Sammlung hier im Forum einige Shaderprogrammierer ein paar Shader beisteuern können.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 22, 2009 14:15 
Offline
DGL Member
Benutzeravatar

Registriert: Do Feb 21, 2008 22:10
Beiträge: 89
Wohnort: Boppard
Gut ich habe mir die Shader "einverleibt" :mrgreen:

Aber ich habe ein Problem:

VertexShader:
Code:
  1.  
  2. varying vec3 v;
  3. varying vec3 lightvec;
  4. varying vec3 normal;
  5. varying vec4 FrontColor;
  6.  
  7. void main(void)
  8. {
  9.   gl_Position    = gl_ModelViewProjectionMatrix * gl_Vertex;
  10.  
  11.   normal         = normalize(gl_NormalMatrix * gl_Normal);
  12.   v              = vec3(gl_ModelViewMatrix * gl_Vertex);
  13.   lightvec       = normalize(gl_LightSource[0].position.xyz - v);
  14.  
  15.   gl_TexCoord[0] = gl_MultiTexCoord0;
  16.   gl_FrontColor   = gl_Color;
  17. }
  18.  


Frag.Shader:
Code:
  1.  
  2. varying vec3 v;
  3. varying vec3 lightvec;
  4. varying vec3 normal;
  5. varying vec4 FrontColor;
  6.  
  7. uniform sampler2D Texture0;
  8.  
  9. void main(void) {
  10.   vec3 Eye       = normalize(-v);
  11.   vec3 Reflected = normalize(reflect( -lightvec, normal));
  12.  
  13.   vec4 IAmbient  = gl_LightSource[0].ambient;
  14.   vec4 IDiffuse  = gl_LightSource[0].diffuse * max(dot(normal, lightvec), 0.0);
  15.   vec4 ISpecular = gl_LightSource[0].specular * pow(max(dot(Reflected, Eye), 0.0),
  16.  
  17. gl_FrontMaterial.shininess) * gl_FrontMaterial.specular;
  18.  
  19.   gl_FragColor   = vec4((gl_FrontLightModelProduct.sceneColor + IAmbient + IDiffuse) * texture2D
  20.  
  21. (Texture0, vec2(gl_TexCoord[0])) + ISpecular)  * gl_Color;
  22. }
  23.  


Dieser Shader aus der (so genialen aber kleinen) Sammlung macht irgendwie Fehler:
Besonderheit: Ich habe eine unendlich weit entfernte Lichtquelle. (LightVect.W=0)

Und nun ist es so, dass irgendwie die Lichtquelle immer im Betrachter liegt, egal wie ich mich drehe und wende.
Die Lichtwerte wurden auch vorher mit OpenGl-Licht getestet.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 22, 2009 14:40 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Hier liegt der Hase begraben:
Code:
  1. lightvec       = normalize(gl_LightSource[0].position.xyz - v);

Einfach ersetzen durch:
Code:
  1. lightvec       = normalize(gl_LightSource[0].position.xyz);

oder, sofern deine Lichtquelle bereits normalisiert ist, den varying einsparen und im Fragmentshader direkt gl_LightSource[0].position.xyz benutzen.


Zitat:
Dieser Shader aus der (so genialen aber kleinen) Sammlung

Schon wieder ein Shader mehr drin :P

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 22, 2009 14:47 
Offline
DGL Member
Benutzeravatar

Registriert: Do Feb 21, 2008 22:10
Beiträge: 89
Wohnort: Boppard
Danke für die Hilfe.

Und da ich C noch nicht wirklich kenne:

Wie würde man das mit ner if abfrage machen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 22, 2009 14:56 
Offline
DGL Member
Benutzeravatar

Registriert: Do Feb 21, 2008 22:10
Beiträge: 89
Wohnort: Boppard
Hat sich erleditgt habs hinbekommen.
DANKE für die Hilfe.

Vertexshader:
Code:
  1.  
  2. varying vec3 vert;
  3. varying vec3 normal;
  4. varying vec3 lightvec;
  5.  
  6. void main(void)
  7. {
  8.   gl_Position    = gl_ModelViewProjectionMatrix * gl_Vertex;
  9.   normal         = normalize(gl_NormalMatrix * gl_Normal);
  10.   vert           = vec3(gl_ModelViewMatrix * gl_Vertex);
  11.  
  12.   lightvec         = gl_LightSource[0].position.xyz;
  13.   if (gl_LightSource[0].position.w != 0)
  14.     lightvec       = lightvec - vert;
  15.   lightvec         = normalize(lightvec);
  16.  
  17.   gl_TexCoord[0] = gl_MultiTexCoord0;
  18.   gl_FrontColor  = gl_Color;
  19. }
  20.  


Fragmentshader:
Code:
  1.  
  2. varying vec3 vert;
  3. varying vec3 normal;
  4. varying vec3 lightvec;
  5.  
  6. uniform sampler2D Texture0;
  7.  
  8. void main(void)
  9. {
  10.   vec3 Eye       = normalize(-vert);
  11.   vec3 Reflected = normalize(reflect( -lightvec, normal));
  12.  
  13.   vec4 IAmbient  = gl_LightSource[0].ambient;
  14.   vec4 IDiffuse  = gl_LightSource[0].diffuse * max(dot(normal, lightvec), 0.0);
  15.   vec4 ISpecular = gl_LightSource[0].specular * pow(max(dot(Reflected, Eye), 0.0), gl_FrontMaterial.shininess) * gl_FrontMaterial.specular;
  16.  
  17.   gl_FragColor   = vec4((gl_FrontLightModelProduct.sceneColor + IAmbient + IDiffuse) *
  18.                    texture2D(Texture0, vec2(gl_TexCoord[0])) + ISpecular) *
  19.                    gl_Color;
  20. }
  21.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 22, 2009 14:56 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Code:
  1. if (gl_LightSource[0].position.w == 0.0) {
  2.     lightvec = normalize(gl_LightSource[0].position.xyz);
  3. }
  4. else {
  5.     lightvec = normalize(gl_LightSource[0].position.xyz - v);
  6. }


Edit: ....bin zu langsam ;)

_________________
Yeah! :mrgreen:


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 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.011s | 15 Queries | GZIP : On ]