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

Aktuelle Zeit: So Mai 26, 2024 06:42

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



Ein neues Thema erstellen Auf das Thema antworten  [ 27 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: gluSphere als Sonne
BeitragVerfasst: Mo Dez 21, 2009 20:54 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Hi,

ich erzeuge mir eine Kugel mit gluSphere und lege eine sonnenartige Textur drauf. Funktioniert alles gut, aber die Kugel sieht wie ein Planet aus. Daher muss die Kugel zu einer Sonne gemacht werden. Ich denke hierfür sind Shader eigentlich ideal. Doch welche Algorithmen bräuchte ich denn überhaupt um so etwas zu schaffen ? Ich habe da mathematisch in meinem jungen Alter leider noch nicht viel Ahnung von. Habt ihr irgendwelche Vorschläge ?
Ist etwas blöd, denn ob man das nun mit Shader oder ohne löst ist mir an sich egal, aber in irgendein Unterforum muss dieses Thema rein, je nach Themenentwicklung muss man halt mal schauen wohin mit dem Thema - denn die Lösung zählt.

Gruß
Nils

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: gluSphere als Sonne
BeitragVerfasst: Mo Dez 21, 2009 21:06 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Imho hat Legnad das Thema hier auch mal gehabt:
viewtopic.php?f=2&t=8743&start=0&hilit=Planetensystem
Vielleicht hilft dir das weiter.

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: gluSphere als Sonne
BeitragVerfasst: Mo Dez 21, 2009 21:12 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Das habe ich mir heute schon zig mal durchgelesen. Die Lösung der Texturenverschiebung ist nicht mein Ziel in dieser Form. Es ist einfach immer noch zu leblos finde ich. Und beim Bloom scheitert es scheinbar doch etwas an meinen Fähigkeiten. Aber auch mit Bloom sähe der Stern ruhend aus, was er aber nicht ist. Man muss sich ach überlegen, dass die Sonne sich viel langsamer als der Rest dreht, man also die Bewegungen so gut wie gar nicht wahrnimmt. Daher wirken die Planeten besser als die Sonne, da sie sich relativ schnell drehen und um die Sonne rotieren.

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: gluSphere als Sonne
BeitragVerfasst: Mo Dez 21, 2009 21:33 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
In Ultimate Conquest verwende ich einen Glow-Effekt für Sonne und Planeten. Der Effekt ist relativ simpel.

Hier zeige ich den Effekt bei ca. 1:40 min:
http://www.youtube.com/watch?v=JDTiq3RWfTc
Siehe auch den Überstrahlungseffekt hier:
http://www-users.rwth-aachen.de/martin. ... /uc002.jpg
(der Screen ist aber alt, das sieht jetzt leicht besser aus)

Vorgehen:
  1. Color- und Depth-Buffer clearen
  2. Alle Lichtquellen der Szene (z.B. Sonne) normal rendern. Alle anderen Objekte schwarz rendern oder alternativ mit
    Code:
    1. gl.blendFunc(gl.CONSTANT_COLOR, gl.ZERO);
    2. gl.blendColor(factor,factor,factor,1.0);

    rendern. factor ist bei mir 0.8. In meinem Fall sorgt das dafür das die Planeten leicht glühen, aber nicht so stark wie die Sonne. Den Sky (bei mir Sterne) sollte man nicht rendern, wird sonst unscharf. In dem Fall muss die Clear-Farbe schwarz sein.
  3. Framebuffer kopieren und als Bildschirmfüllendes Quad mit einem Blur-Shader (="Weichzeichner") rendern. Je stärker der Weicherzeichner desto stärker der Effekt. In meinem Fall wende ich diesen Shader 6-fach hintereinander an, das ist schneller als einmal bluren mit größerem Radius. Der Shader greift genau zwischen den Texeln auf die Textur zu und erhält so den Durchschnitt aus vier Texeln mit einem Zugriff.
    Code:
    1. varying vec2 vTexCoord;
    2.  
    3. uniform sampler2D uScene;
    4. uniform vec2 uPixelSize; // Größe eines Pixels in Texturkoordinaten
    5.  
    6. void main() {
    7.     vec2 shift[13];
    8.     shift[ 0] = vec2(-1.5, -3.5);
    9.     shift[ 1] = vec2( 1.5, -3.5);
    10.     shift[ 2] = vec2(-3.5, -1.5);
    11.     shift[ 3] = vec2(-1.5, -1.5);
    12.     shift[ 4] = vec2( 1.5, -1.5);
    13.     shift[ 5] = vec2( 3.5, -1.5);
    14.     shift[ 6] = vec2( 0.0,  0.0);
    15.     shift[ 7] = vec2(-3.5,  1.5);
    16.     shift[ 8] = vec2(-1.5,  1.5);
    17.     shift[ 9] = vec2( 1.5,  1.5);
    18.     shift[10] = vec2( 3.5,  1.5);
    19.     shift[11] = vec2(-1.5,  3.5);
    20.     shift[12] = vec2( 1.5,  3.5);
    21.  
    22.     gl_FragColor = vec4(0,0,0,0);
    23.     for (int i=0; i<13; i++) {
    24.         vec2 coord = vTexCoord + (shift[i] * uPixelSize);
    25.         gl_FragColor += texture2D(uScene, coord);
    26.     }
    27.     gl_FragColor /= 13.0;
    28.     gl_FragColor.a = 1.0;
    29. }
  4. Framebuffer wieder kopieren und in einer Textur sichern.
  5. Color- und Depth-Buffer clearen.
  6. Szene normal rendern.
  7. Den eben gesicherten Framebuffer mit
    Code:
    1. glBlendFunc(GL_ONE, GL_ONE);

    auf die Szene addieren.

Alternativen:
  • Statt den Framebuffer mit glCopyTexSubImage2D zu kopieren kann man auch FrameBufferObjects (FBO) verwenden.
  • Wenn man FBOs verwendet, kann man statt dem bluren auch eine kleinere Auflösung als die der Szene wählen um einen Blur-Effekt zu erreichen.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: gluSphere als Sonne
BeitragVerfasst: Mo Dez 21, 2009 23:02 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Würde ein FBO ohne Shader auch so gut aussehen ? Es sieht wirklich toll aus, großes Lob an dieser Stelle von mir :) Aber ich sammel mal wirklich meine Fragen, ich überlege schon lange und kriege einfach vieles nicht geklärt:
Punkt 1 ist relativ klar denke ich, glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); und fertig. Genügt es für Punkt 2 nicht sogar schon, die Texturen wegzulassen ? Oder wäre das dann ein anderes "schwarz" ? Ich denke andauernd, so müsste es sein, mit dem Blenden:
Code:
  1. // Sonne
  2. glPushMatrix;
  3.   ...
  4. glPopMatrix;
  5.  
  6. glBlendFunc(GL_CONSTANT_COLOR, GL_ZERO);
  7. glBlendColor(0.8, 0.8, 0.8, 1.0);
  8.  
  9. // Merkur
  10. glPushMatrix;
  11.   ...
  12. glPopMatrix;

Aber eigentlich ist das doch totaler Irsinn. Es ist so grauenhaft, ich wusste das mal, aber habe wohl vieles wieder verlernt. Ich verstehe auch Deine Idee, aber kann es einfach nicht umsetzen. :shock: Außerdem meckert der Compiler seltsamerweise rum, er kenne GL_CONSTANT_COLOR nicht. Naja, laut dem Wiki existiert die Konstante aber.
Im nächsten Schritt würde man also die Sonne zeichnen aber mehrfach den Shader drüberjagen ? Der Rest ist dann aber klar, geht auch aus der Grundidee schon hervor.
Also verstanden habe ich es schon, aber bin echt zu blöd das umzusetzen - fordere aber auf keinen Fall eine Komplettlösung, falls das so rüberkommt - gerade um wieder reinzukommen sollte ich das alles selbst schreiben, nur ein paar Hinweise wären ganz gut.

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: gluSphere als Sonne
BeitragVerfasst: Di Dez 22, 2009 10:19 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Punkt 1 ist relativ klar denke ich, glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

Vom Prinzip ja, aber sofern du den Stencil-Buffer nicht verwendest, solltest du diesen ebenfalls leeren. Der Tiefenbuffer teilt sich ja mit dem Stencilbuffer immer ein Byte. Bringt aber so wenig das du den Performance-Unterschied wahrscheinlich nicht bemerken wirst ;)

Zitat:
Oder wäre das dann ein anderes "schwarz" ?

Wie du das schwarz machst ist egal. Reichen würde ein Shader mit gl_FragColor = vec4(0,0,0,1).
Ich empfehle dir aber die glBlendColor-Variante zu nehmen, wie du in deinem gezeigten Code auch schon korrekt machst. Das gibt auch den Planeten ein besseres aussehen und ist sogar noch leichter zu implementieren, weil du ja einfach normal renderst, nur eben etwas dunkler.

Zitat:
Außerdem meckert der Compiler seltsamerweise rum, er kenne GL_CONSTANT_COLOR nicht.

Laut Wiki gibt es GL_CONSTANT_COLOR "erst" seit OpenGL 1.4.

Zitat:
Im nächsten Schritt würde man also die Sonne zeichnen aber mehrfach den Shader drüberjagen ?

Du renderst die Szene insgesamt zweimal. Zuerst produzierst du eine Textur in der nur die Lichtquellen sichtbar sind. Alles andere wird schwarz (oder dunkler, siehe oben) gerendert, damit verdeckte Lichtquellen auch korrekt verdeckt werden.
Diese Textur wird dann durch einen Weichzeichner gejagt. Du renderst also ein Quad mit dieser Textur und dem Weichzeichner-Shader und jagst das Ergebnis wieder durch. Das ganze ein paar mal bis du das Ergebnis weich genug findest.
Dann wird die Szene nochmal ganz normal gerendert und die Ergebnis-Textur wird auf die Szene addiert. Dafür renderst du wieder ein Quad.

Zitat:
Würde ein FBO ohne Shader auch so gut aussehen ?

Wenn das FBO eine kleinere Auflösung als die Szene hat muss die Textur ja später beim rendern vergrößert werden. Wenn du sagen wir 1/4 oder 1/8 der Szenenauflösung verwendest, erreichst du bereits eine gewisse Unschärfe. Wie gut das aussieht kann ich nicht sagen, es könnten aber Artefakte auftreten. Also man könnte die einzelnen Pixel sehen. Diesen Artefakten könnte man aber wieder durch einen Weichzeichner-Shader entgegen wirken. Da Füllrate bei diesem Effekt die wesentliche Limitierung ist dürfte eine kleinere Textur einen großen Performance-Schub bringen. Wenn die Textur 1/4 kleiner ist, bedeutet das 1/16 der Texturzugriffe und zudem weniger Durchgänge beim Weichzeichner. Vermutlich ist das also die beste Lösung. Ich konnte das bei meinen UC aber bisher nicht einbauen, da Firefox/Minefield bisher keine FBOs unterstützt.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: gluSphere als Sonne
BeitragVerfasst: Di Dez 22, 2009 13:36 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Könnte man statt FBOs nicht auch den Umweg über SDLSurfaces nehmen ?

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: gluSphere als Sonne
BeitragVerfasst: Di Dez 22, 2009 14:29 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Ich habe keine Ahnung was SDLSurfaces sind, aber wahrscheinlich kann man die benutzen. Trotzdem, wenn du FBOs hast, solltest du die benutzen. Ich bezweifele auch, dass ich im Browser an SDL komme ;)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: gluSphere als Sonne
BeitragVerfasst: Di Dez 22, 2009 20:59 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Habe mich für FBO entschieden, wenn das so viel schneller ist, lohnt es sich bestimmt. Ich habe einfach mal versucht die Idee umzusetzen. Da ich mit FBOs bisher noch nichts zu tun hatte, musste ich mich erstmal damit auseinandersetzen. Dabei ist folgendes rausgekommen. Nun entsteht insgesamt ein graues Dreieck welches hinter den Planeten/der Sonne liegt. So erfolgreich sieht es noch nicht aus, aber immerhin sieht man überhaupt mal eine Veränderung. Was ich mich auch die ganze Zeit schon frage: Wo muss nun das Glowergebnis skaliert werden ? Im FBO, bei der Textur ? Wenn im FBO, wäre dann die Stelle mit der Setzung des Viewports in der Render (Zeile 60) die richtige ? (Hat bisher nichts gebracht wenn man dort den Viewport vergrößert.) Ich denke mal da sind noch einige Fehler drinnen die ich nicht sehe.
Code:
  1.   private
  2.     FBO, FBOTex, DepthBuffer : GluInt;
  3.  
  4. constructor TSolar.Create;
  5. var Fehler : glEnum;
  6. begin
  7.   ...
  8.   // FBO initialisieren
  9.   glGenFramebuffersEXT(1, @FBO);
  10.   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, FBO);
  11.   glGenRenderbuffersEXT(1, @DepthBuffer);
  12.   glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, DepthBuffer);
  13.   glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, SCREEN_WIDTH, SCREEN_HEIGHT);
  14.   glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, DepthBuffer);
  15.   glGenTextures(1, @FBOTex);
  16.   glBindTexture(GL_TEXTURE_2D, FBOTex);
  17.   glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  18.   glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  19.   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8,  SCREEN_WIDTH, SCREEN_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, nil);
  20.   glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, FBOTex, 0);
  21.   // FBO auf Fehler prüfen
  22.   Fehler := glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
  23.   case Fehler of
  24.     GL_FRAMEBUFFER_COMPLETE_EXT:
  25.       Exit;
  26.     GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT:
  27.       raise Exception.Create('Incomplete attachment');
  28.     GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT:
  29.       raise Exception.Create('Missing attachment');
  30.     GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT:
  31.       raise Exception.Create('Incomplete dimensions');
  32.     GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT:
  33.       raise Exception.Create('Incomplete formats');
  34.     GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT:
  35.       raise Exception.Create('Incomplete draw buffer');
  36.     GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT:
  37.       raise Exception.Create('Incomplete read buffer');
  38.     GL_FRAMEBUFFER_UNSUPPORTED_EXT:
  39.       raise Exception.Create('Framebufferobjects unsupported');
  40.   end;
  41. end;
  42.  
  43. destructor TSolar.Destroy;
  44. var i : Integer;
  45. begin
  46.   ...
  47.   glDeleteFramebuffersEXT(1, @FBO);
  48.   glDeleteRenderbuffersEXT(1, @DepthBuffer);
  49.   glDeleteTextures(1, @FBOTex);
  50. end;
  51.  
  52. procedure TSolar.Render(tDelta : Real);
  53. begin
  54.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  55.   glLoadIdentity;
  56.   glTranslatef(0.0, 0.0, Zoom);
  57.   ...
  58.   // FBO befüllen
  59.   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, FBO);
  60.   glPushAttrib(GL_VIEWPORT_BIT);
  61.   glViewPort(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
  62.   Zeichne;
  63.   // Normal rendern
  64.   glPopAttrib;
  65.   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
  66.   Zeichne;
  67.   // FBO-Textur additiv blenden
  68.   glEnable(GL_BLEND);
  69.     glBlendFunc(GL_ONE, GL_ONE);
  70.     glBindTexture(GL_TEXTURE_2D, FBOTex);
  71.     DrawTexture(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 1);
  72.   glDisable(GL_BLEND);
  73. end;

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: gluSphere als Sonne
BeitragVerfasst: Di Dez 22, 2009 21:52 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
  • Auch das FBO sollte vor dem rendern gecleart werden.
  • Es gibt bisher keinen Weichzeichner? Ohne Weichzeichner addierst du nur die Szene zweimal aufeinander. Dadurch wird alles nur heller.
  • Wenn du ein Bildschirmfüllendes Quad renderst solltest du den Z-Buffer abschalten:
    Code:
    1. glDisable(GL_DEPTH_TEST);
    2. ...
    3. glEnable(GL_DEPTH_TEST);

    Ansonsten wird nichts gezeichnet, wenn die Z-Werte im Buffer kleiner sind als die des Quads.
  • Du renderst die Szene zweimal auf die gleiche Weise?

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: gluSphere als Sonne
BeitragVerfasst: Mi Dez 23, 2009 11:08 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Dieser Blur-Shader ist schneller als meiner, da er Separierbarkeit der Convolution-Operation ausnutzt. Siehe auch die Diskussionsseite.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: gluSphere als Sonne
BeitragVerfasst: Mi Dez 23, 2009 12:23 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Hm, habe Z nun abgestellt, weiterhin ein graues Dreieck. Den Weichzeichner bau ich möglichst erst später ein, will lieber erstmal dass alles mit dem FBO klappt. Habe den letzten Codeteil einfach erweitert:
Code:
  1.   // FBO-Textur additiv blenden
  2.   glDisable(GL_DEPTH_TEST);
  3.     glEnable(GL_BLEND);
  4.       glBlendFunc(GL_ONE, GL_ONE);
  5.       glBindTexture(GL_TEXTURE_2D, FBOTex);
  6.       DrawTexture(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 1);
  7.     glDisable(GL_BLEND);
  8.   glEnable(GL_DEPTH_TEST);

DrawTexture ist eigentlich nichts besonderes:
Code:
  1. // Textur zeichnen
  2. procedure DrawTexture(pX, pY, pW, pH, pZ : Single);
  3. begin
  4.   glBegin(GL_QUADS);
  5.     glTexCoord2f(1, 0);
  6.     glVertex3f(pX+pW, pY   , -pZ);
  7.     glTexCoord2f(0, 0);
  8.     glVertex3f(pX   , pY   , -pZ);
  9.     glTexCoord2f(0, 1);
  10.     glVertex3f(pX   , pY+pH, -pZ);
  11.     glTexCoord2f(1, 1);
  12.     glVertex3f(pX+pW, pY+pH, -pZ);
  13.   glEnd;
  14. end;

Und was das Clearen betrifft: Ich habe das in die Prozedur Zeichne ausgelagert, welcher für FBO und normal insgesamt zweimal ausgeführt wird (Siehe Code oben).
Code:
  1. procedure TSolar.Zeichne;
  2. ...
  3. begin
  4.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  5.   glLoadIdentity;
  6.   glTranslatef(0.0, 0.0, Zoom);
  7.   gluLookAt(Camera.Position.X, Camera.Position.Y, Camera.Position.Z, Camera.View.X, Camera.View.Y, Camera.View.Z, Camera.UpVector.X, Camera.UpVector.Y, Camera.UpVector.Z);
  8.   ...
  9. end;


Eine Idee, warum ich immer noch ein graues Dreieck zeichne ? Im Anhang mal ein einfacher Screenshot. Das Grau ist eventuell auf den ersten Blick nicht zu sehen, hängt auch vom Monitor etwas ab. Bei einem guten sieht man es sofort, bei einem älteren vielleicht nicht so gut. (Hatte schon den Fall, dass ein sehr helles, strahlendes Hintergrundbild von mir woanders total abgedunkelt und leblos dargestellt wurde.) Jedenfalls ist der untere Punkt des Dreiecks direkt unter der Sonne. Habe außerdem einiges weggeschnitten, damit die Datei nicht zu groß wird.

Der Shader im Wiki scheint wohl vollkommen an mir vorbeigegangen zu sein. Habe mich natürlich schon vor dem Erstellen dieses Themas umgeschaut, aber den nicht gefunden. Sehr interessant. Werde den dann auf alle Fälle testen, aber ich denke es ist einfacher im Endeffekt, erstmal die aktuell noch bestehenden Probleme zu beseitigen.


Dateianhänge:
Dreieck.PNG
Dreieck.PNG [ 12.76 KiB | 12067-mal betrachtet ]

_________________
Meine Musik: spiker-music.net
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: gluSphere als Sonne
BeitragVerfasst: Mi Dez 23, 2009 13:01 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Wahrscheinlich renderst du das Quad falsch:
Setze die Z-Koordinate mal auf 0, nicht auf -1. In DrawTexture wird die Z-Koordinate negiert, Absicht? Wenn ich das richtig im Kopf habe geht der sichtbare Bereich von 0 bis 1, nicht von -1 bis 1. Bin mir aber gerade nicht sicher.

Es ist nicht ganz ersichtlich wie deine ModelView und Projectionmatrix aussieht. Du kannst aber beides auf "Identity" setzen und diese Koordinaten verwenden:
Code:
  1. glVertex3f(-1.0,  1.0, 0.0);
  2. glVertex3f(-1.0, -1.0, 0.0);
  3. glVertex3f( 1.0,  1.0, 0.0);
  4. glVertex3f( 1.0, -1.0, 0.0);



Zitat:
Der Shader im Wiki scheint wohl vollkommen an mir vorbeigegangen zu sein.

Den hat Skeptiker auch erst gestern Abend eingestellt.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: gluSphere als Sonne
BeitragVerfasst: Mi Dez 23, 2009 13:34 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Ich habe die Modelmatrix und Projektionsmatrix, wenn ich es richtig sehe, schon bei der Initialisierung auf Identity gesetzt. Habe Deinen Code mal getestet, man sieht deutlich einen Unterschied. Nun sieht man ein Quadrat welches die Sonne umfasst und durch diese hindurchgeht. Habe dann auch gleich mal den Shader soweit getestet. Allerdings kann man leider immer noch keinen wirklichen Effekt sehen. Das Quadrat ist mit und ohne Shader einfach grau gefärbt. Hier mal der aktuelle entscheidende Renderausschnit:
Code:
  1.   // FBO befüllen
  2.   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, FBO);
  3.   glPushAttrib(GL_VIEWPORT_BIT);
  4.   glViewPort(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
  5.   glUseProgramObjectARB(Shader);
  6.   Zeichne;
  7.   glUseProgramObjectARB(0);
  8.   // Normal rendern
  9.   glPopAttrib;
  10.   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
  11.   Zeichne;
  12.   // FBO-Textur additiv blenden
  13.   glDisable(GL_DEPTH_TEST);
  14.     glEnable(GL_BLEND);
  15.       glBlendFunc(GL_ONE, GL_ONE);
  16.       glBindTexture(GL_TEXTURE_2D, FBOTex);
  17.       glBegin(GL_QUADS);
  18.         glTexCoord2f(1, 0);
  19.         glVertex3f(-1.0,  1.0, 0.0);
  20.         glTexCoord2f(0, 0);
  21.         glVertex3f(-1.0, -1.0, 0.0);
  22.         glTexCoord2f(0, 1);
  23.         glVertex3f( 1.0,  1.0, 0.0);
  24.         glTexCoord2f(1, 1);
  25.         glVertex3f( 1.0, -1.0, 0.0);
  26.       glEnd;
  27.     glDisable(GL_BLEND);
  28.   glEnable(GL_DEPTH_TEST);

Meine Shaderladeroutine entspricht fast exakt dieser. Der wohl einzige Unterschied besteht in der Variablenverwaltung, bei mir muss man das ProgramObject selbst erstellen und als Variable übergeben. Aber ansonsten identisch. Hier mal das aktuelle Ergebnis, diesmal extrem beschnitten, ich will nicht mit jedem Beitrag so extrem viel Platz verschwenden. Auf dem Bild ist der Shader nach dem eben geposteten Code an. Habe das Gefühl, im FBO würde alles anders gerendert als beabsichtigt.


Dateianhänge:
2.PNG
2.PNG [ 4.56 KiB | 12061-mal betrachtet ]

_________________
Meine Musik: spiker-music.net
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: gluSphere als Sonne
BeitragVerfasst: Mi Dez 23, 2009 13:55 
Offline
DGL Member

Registriert: Mi Feb 27, 2008 15:26
Beiträge: 12
Mal ganz kurz am Rande zu diesem Shader: http://wiki.delphigl.com/index.php/shader_blur2

Der Fragementshader wird ja einmal pro Pixel ausgeführt, dürfte es daher nicht schneller sein, zwei seperate Shader für Horizontal und Vertikal zu verwenden, weil ja IFs auf Uniforms angeblich so langsam sind. Gerade, wenn texWidth + Hight der Bildschirmauflösung entspricht.
Wäre es nicht auch theoretisch perfomanter die for-Schleife abzuwickeln?


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.013s | 16 Queries | GZIP : On ]