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

Aktuelle Zeit: Sa Jun 21, 2025 14:27

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



Ein neues Thema erstellen Auf das Thema antworten  [ 34 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste
Autor Nachricht
BeitragVerfasst: Mo Aug 06, 2012 07:11 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
damadmax hat geschrieben:
setz gl_FragData[3].w explizit auf 1.0

bzw: wrappe alles in ein vec4:

Code:
  1. gl_FragData[3] = vec4(lightColor.xyz * (diffuse + specular) * attenuation, 1.0);


die Normale wird ja von 0..1 zu -1..1 konvertiert. Musst du die evtl noch normalisieren?


Das kommt dabei raus und laggt ziemlich noch dazu, also irgendwie falsch:
http://xenorate.com/tl_files/somekram/deferred%20renderind_2.jpg

Stell ich das blending von GL_ONE, GL_ONE auf GL_SRC_ALPHA, GL_ONE (ein wenig dunkler) siehts ähnlich wie vorher aus, aber der grüne Boden wird immernoch nicht richtig farbig beleuchtet.

Muss ich denn eigentlich nicht, den Albedo-Wert im Light-Accumulation-Pass dazu multiplizieren?
Damit im Light-Accumulation-Buffer am ende, auch der vollständige pixel ist oder ist das so richtig, das man nur die Lichtstärke/Farbe addiert?

Falls es was hilft, hier ist der code für den light accumulation pass:

Code:
  1.  
  2.     void DeferredRenderingGame::drawLightGeometry(const Light &light, CGLSL* shader) {
  3.         if (light.type == LightTypes::Point) {
  4.             vec3 lightScale = vec3(light.radius, light.radius, light.radius);
  5.             mat4 lightMVP = camera.getModelViewProjection() * glm::translate(mat4(), light.pos) * glm::scale(mat4(), lightScale);
  6.             shader->uniformMatrix4("mvp", &lightMVP[0][0]);
  7.                         // Draw sphere VBO
  8.             rend->drawMesh(sphereMesh);
  9.         }
  10.     }
  11.  
  12.     bool DeferredRenderingGame::lightIsVisible(Light &light) {
  13.         if (light.type == LightTypes::Point) {
  14.             return frustum.containsSphere(light.pos, light.radius);
  15.         }
  16.         return false;
  17.     }
  18.  
  19.     void DeferredRenderingGame::accumulateLighting() {
  20.         // Load camera matrix
  21.         mat4 camMV = camera.getModelView();
  22.         mat4 camProj = camera.getProjection();
  23.  
  24.         // Get GBuffer textures
  25.         CTexture2D* positionTex = gBuffer->getTextureTarget("pos");
  26.         CTexture2D* normalTex = gBuffer->getTextureTarget("normal");
  27.         CTexture2D* diffuseTex = gBuffer->getTextureTarget("diffuse");
  28.  
  29.         // Disable depth test
  30.                 glDisable(GL_DEPTH_TEST);
  31.                 glDepthMask(GL_FALSE);
  32.        
  33.         // Enable blending
  34.                 glEnable(GL_BLEND);
  35.                 glBlendFunc(GL_ONE, GL_ONE);
  36.  
  37.         // Enable light buffer
  38.         gBuffer->enable();
  39.  
  40.         // Draw to light buffer only
  41.         gBuffer->setDrawBuffer(GL_COLOR_ATTACHMENT3);
  42.  
  43.         // Viewport and clearing
  44.         rend->viewport(gBuffer->getSize());
  45.         rend->clearColor(0.0f, 0.0f, 0.0f, 1.0f);
  46.         rend->clear(ClearFlags::Color | ClearFlags::Depth);
  47.  
  48.         // Enable textures
  49.         rend->enableTexture(normalTex, 0);
  50.         rend->enableTexture(positionTex, 1);
  51.         rend->enableTexture(diffuseTex, 2);
  52.  
  53.         // Change to frontface culling
  54.                 glCullFace(GL_FRONT);
  55.  
  56.         // Loop through all lights
  57.         for (list<CSceneNode*>::iterator i = scene->getBegin(); i != scene->getEnd(); ++i) {
  58.             CSceneNode* node = *i;
  59.             if (node->getType() == SceneNodeTypes::Light) {
  60.                 CSceneLightNode* lightNode = (CSceneLightNode*)node;
  61.                 Light light = lightNode->getLight();
  62.  
  63.                 if (lightIsVisible(light)) {
  64.                     drawedLights++;
  65.      
  66.                     CGLSL* lightShader = NULL;
  67.                     if (light.type == LightTypes::Point) {
  68.                         lightShader = pointLightShader;
  69.                     } else if (light.type == LightTypes::Directional) {
  70.                         lightShader = directionalLightShader;
  71.                     }
  72.  
  73.                     if (lightShader != NULL) {
  74.  
  75.                         // Enable light shader
  76.                         rend->enableShader(lightShader);
  77.                         lightShader->uniform1i("normalTex", 0);
  78.                         lightShader->uniform1i("positionTex", 1);
  79.                         lightShader->uniform1i("diffuseTex", 2);
  80.                         lightShader->uniform4f("lightColor", &light.color[0]);
  81.                         lightShader->uniform1f("shininess", light.shininess);
  82.                         lightShader->uniform3f("lightPos", &light.pos[0]);
  83.                         lightShader->uniform1f("lightRadius", light.radius);
  84.                         lightShader->uniform1f("lightFalloff", light.falloff);
  85.                         lightShader->uniform2f("invViewport", 1.0f / (float)gBuffer->getWidth(), 1.0f / (float)gBuffer->getHeight());
  86.  
  87.                         // Draw light geometry
  88.                         drawLightGeometry(light, lightShader);
  89.  
  90.                         // Disable light shader
  91.                         rend->disableShader(lightShader);
  92.  
  93.                     }
  94.                 }
  95.             }
  96.         }
  97.  
  98.         // Change back to backface culling
  99.                 glCullFace(GL_BACK);
  100.  
  101.         // Disable textures
  102.         rend->disableTexture(diffuseTex, 2);
  103.         rend->disableTexture(positionTex, 1);
  104.         rend->disableTexture(normalTex, 0);
  105.  
  106.         // Disable light buffer
  107.         gBuffer->disable();
  108.  
  109.         // Disable blending
  110.                 glDisable(GL_BLEND);
  111.                 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  112.  
  113.         // Enable depth test
  114.                 glDepthMask(GL_TRUE);
  115.                 glEnable(GL_DEPTH_TEST);
  116.     }
  117.  


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Aug 06, 2012 07:33 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 06, 2005 18:34
Beiträge: 362
Wohnort: Hamburg
Hey,

ich habe nicht alles 100% verfolgt, mich wundert es aber, dass du 3 Passes benutzt. Versuchst du dich an Light-PrePass oder normalem Deferred Rendering?
Ich hatte es so verstanden, dass du 2. versuchst. Und dabei kombinierst du im 2. Pass, also im Light-Pass bereits die finale Farbe für jedes Licht und addierst die einfach nur auf einander. Was du in deimen Licht-Shader auch zu tun scheinst, denn da berechnest du nicht die Licht-Farbe, sondern Lambert + Blinn-Phong auf Basis der Licht- und Albedo-Farbe.

Das Was du nach dem Licht-Pass bekommst ist also bereits die Composed-Farbe. (bzw sollte es sein)

Wenn du aber Light-PrePass versuchst musst du im 1. Pass (Geometry 1) nur Normale + Specular Wert speichern. Im 2. (Light-PrePass) dann die Lichtberechnung und im 3. (Geometry 2) dann die restlichen Material Eigenschaften der Geometry einberechnen, aber deine Codes sehen nicht danach aus.

Mir hat vor ner Weile bei der gleichen Aufgabe folgendes Tutorial geholfen, keine Ahnung ob dus schon kennst, ist allerdings OGL 3:
http://ogldev.atspace.co.uk/ (Kapitel 35-37)

_________________
Der Mensch hat neben dem Trieb der Fortpflanzung und dem zu essen und zu trinken zwei Leidenschaften: Krach zu machen und nicht zuzuhören. (Kurt Tucholsky)
Schwabbeldiwapp, hier kommt die Grütze. (Der Quästor)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Aug 06, 2012 08:23 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Ich hab weiter probiert und irgendwie war das gl_FragData[3] grotten falsch.
Denn als ich versucht habe, nur ne farbe ausgeben - vec4(1.0, 0.0, 0.0, 1.0), sah es recht merkwürdig aus.
Umgestellt auf gl_FragData[0] und dann hat es zumindest mit der Farbe geklappt.

Ich frage mich die ganze Zeit, wie hat es denn überhaupt funktioniert O_o
Ich verstehe aber nicht wieso gl_FragData[3] nicht geht, denn ich render ja in GL_COLOR_ATTACHMENT3 -.- whatever.

Aber das hat effektiv nichts gebracht - gleiches ergebnis.

Shaijan hat geschrieben:
Hey,

ich habe nicht alles 100% verfolgt, mich wundert es aber, dass du 3 Passes benutzt. Versuchst du dich an Light-PrePass oder normalem Deferred Rendering?
Ich hatte es so verstanden, dass du 2. versuchst. Und dabei kombinierst du im 2. Pass, also im Light-Pass bereits die finale Farbe für jedes Licht und addierst die einfach nur auf einander. Was du in deimen Licht-Shader auch zu tun scheinst, denn da berechnest du nicht die Licht-Farbe, sondern Lambert + Blinn-Phong auf Basis der Licht- und Albedo-Farbe.

Das Was du nach dem Licht-Pass bekommst ist also bereits die Composed-Farbe. (bzw sollte es sein)

Wenn du aber Light-PrePass versuchst musst du im 1. Pass (Geometry 1) nur Normale + Specular Wert speichern. Im 2. (Light-PrePass) dann die Lichtberechnung und im 3. (Geometry 2) dann die restlichen Material Eigenschaften der Geometry einberechnen, aber deine Codes sehen nicht danach aus.

Mir hat vor ner Weile bei der gleichen Aufgabe folgendes Tutorial geholfen, keine Ahnung ob dus schon kennst, ist allerdings OGL 3:
http://ogldev.atspace.co.uk/ (Kapitel 35-37)


Ich versuche normales Deferred Rendering, also ohne Light-Pre-Pass. Was ich aktuell versuche:

1. Pass: GBuffer füllen (Albedo, Normal, Position)
2. Pass: Light Accumulation (Licht-Intensität + Light-Farbe in den LABuffer Blenden - Multi-Pass für jedes Licht)
3. Pass: Finales Fragment = (Albedo * Ambient Color) + (Albedo * Light Accumulation)

Ich habe schon ziemlich viel ausprobiert und könnte mir den 3 Pass komplett sparen, denn das finale Ergebnis könnte auch in den LA-Buffer rein.

Vor allem will ich am ende dieses hier umsetzten:
http://www.john-chapman.net/content.php?id=13 <- Aber da bin ich noch weit davon entfernt.

Vielleicht werf ich die Lichtfarbe über bord, und nehm einfach weiße Lichter, damit geht es ja -.-


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Aug 06, 2012 09:28 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Hmm ich glaub ich versteh warum es nicht, es liegt wohl doch am Albedo, bzw. an den Farben... würde ich normale Texture verwenden, dann ist es sehr unwahrscheinlich das ich Farbwerte habe, bei der eine Komponente 0 ist.

Daher ist auch vec4(1.0, 0.0, 0.0, 1.0) * vec4(0.0, 1.0, 0.0, 1.0) = Schwarz.

1.0 * 0.0 = 0.0
0.0 * 1.0 = 0.0
0.0 * 0.0 = 0.0
1.0 * 1.0 = 1.0

Multipliziere ich also farbiges Licht mit einer Grundfarbe, also eine Farbe bei dem Komponenten 0 sind, dann habe ich genau diese Effekt.
Addieren macht das zwar dann richtig, aber dann gibt es keine nicht-beleuchteten Pixel :(


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Aug 06, 2012 10:53 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Dein Position-Buffer enthält die Koordinaten im Object- oder World-Space?

_________________
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  
BeitragVerfasst: Mo Aug 06, 2012 11:27 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
damadmax hat geschrieben:
Dein Position-Buffer enthält die Koordinaten im Object- oder World-Space?


Objekt-Space, also Vertex multipliziert mit der Modelview-Matrix, welches bei Meshes aktuell noch identity ist und im falle bei Licht, die position und skalierung für die Punktlichter. Camera Perspektive und View-Matrix werden nur für gl_Position beim GBuffer verwendet!

Siehe Shader: GBuffer.vert und GBuffer_Color.frag


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Aug 06, 2012 14:09 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Ach zum kotzen, jetzt habe ich mich mal über Light-Pre-Pass Rendering informiert und da stellt sich für mich gleich wieder ne Grundsatz-Frage - Deferred Rendering oder Light pre pass rendering oder irgendwas anderes?

Light Pre-Pass ist doch im grunde Forward Rendering nur das die Lichtstärke und Farbe nachdem GBuffer kommen und man am ende, die Licht-Formeln wieder zusammen baut.

Ich will eigentlich nur erreichen, das statistische und dynamische Geometrie + ein aufwendiges Partikelsystem/Screen Space Fluid korrekt beleuchtet wird und ich nicht n Renderpfade mit Unterschiedlichen Beleuchtungstechniken benötige.
Halt ein einheitliches System für alle, damit man wenig passes wie möglich benötigt, dadurch auch wenig drawcalls.

Wie ich das Screen Space Fluid mit Deferred Rendering kombinieren kann, das ist mir aktuell noch ein Rätsel, denn da soll ja Semi-Transparenz verwendet werden auf basis von der Opaque-Geometrie, das aber schon beleuchtet sein muss. Sprich der Finale Pixel muss schon beleuchtet sein.

Es kommt so häufig vor, das man meint etwas zu verstehen und dann aber des besseren belehrt wird und noch unwissender ist als vorher ist :(


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Aug 06, 2012 14:37 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Finalspace hat geschrieben:
Objekt-Space, also Vertex multipliziert mit der Modelview-Matrix, welches bei Meshes aktuell noch identity ist und im falle bei Licht, die position und skalierung für die Punktlichter. Camera Perspektive und View-Matrix werden nur für gl_Position beim GBuffer verwendet!

Siehe Shader: GBuffer.vert und GBuffer_Color.frag


Mag sein, dass ich mich irre, aber wie soll da
Code:
  1. vec3 lightDir = lightPos - pos.xyz;
funktionieren?

_________________
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  
BeitragVerfasst: Mo Aug 06, 2012 14:45 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Finalspace hat geschrieben:
Ich verstehe aber nicht wieso gl_FragData[3] nicht geht, denn ich render ja in GL_COLOR_ATTACHMENT3 -.- whatever.

Bezüglich dem Mal eine Anmerkung: Auch wenn du mit glDrawBuffer auf GL_COLOR_ATTACHMENT3 stellst, ist die Nummer die du im Shader brauchst trotzdem 0, weil du mit der Funktion angibts in welches Attachment primär gezeichnet werden soll. Und bei glDrawBuffers sind im Shader die Ziele dann auch auch entsprechend der Reihenfolge beziffert.
Ist auch irgendwie logisch, da sonst die Funktion sinnlos wäre, wenn GL_COLOR_ATTACHMENT3 immer gl_FragData[3] entsprechen würde.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Aug 06, 2012 18:01 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Finalspace: Deine Berechnung ist korrekt. Ebenso die Aussage, dass es an den 0-Komponenten liegt. Licht ist multiplikativ, wenn es um die Beleuchtung von Objekten kommt. Sonst funktioniert Schwarz auch nicht. Was man aber machen kann, ist Specular mit ein bisschen weiß zu mischen. Das ist realistisch, weil kein Material bei specular reflection vollständig absorbiert.

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Aug 06, 2012 19:33 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Lord Horazont hat geschrieben:
Finalspace: Deine Berechnung ist korrekt. Ebenso die Aussage, dass es an den 0-Komponenten liegt. Licht ist multiplikativ, wenn es um die Beleuchtung von Objekten kommt. Sonst funktioniert Schwarz auch nicht. Was man aber machen kann, ist Specular mit ein bisschen weiß zu mischen. Das ist realistisch, weil kein Material bei specular reflection vollständig absorbiert.

grüße


Danke für den Tip mit der Specular-Farbe, ich seh zwar keinen Unterschied, aber später kommen die Specularfarben eh aus dem Material, daher ist das schonmal gut das zu haben :-)

Jetzt komme ich endlich wieder ein wenig vorran, nun werd ich mich an ein Materialsystem wagen mit dem auch Screen Space Fluid Rendering möglich ist und auch Transparente Objekte, aber erstmal klein weiter machen mit einfachen Texturen :P

Vielen Dank nochmal an alle für die Hilfen bisher.

Ich werd euch auf jedenfall auf dem laufenden halten.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Aug 06, 2012 20:52 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
So ich habe mal den aktuellen Stand mal hochgeladen:
http://xenorate.com/tl_files/somekram/rps_deferred3.zip

Sieht teilweise noch merkwürdig aus, aber reicht erstmal für heute. Geometry welches direkt im Licht-Radius befindet wird sehr seltsam beleuchtet.
Irgendwie muss ich es schaffen, das der Mittelpunkt immer über der Normale stehen muss oder so... keine ahnung.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Aug 06, 2012 21:23 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Code:
  1. float diffuse = max(0.0, dot(normal, lightDir / distance));

Das "max" verhindert das diffuse<0.0 wird und dadurch dem Licht abgewandten Flächen Farbe "geklaut" wird.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 07, 2012 09:03 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Schläfer hat geschrieben:
Code:
  1. float diffuse = max(0.0, dot(normal, lightDir / distance));

Das "max" verhindert das diffuse<0.0 wird und dadurch dem Licht abgewandten Flächen Farbe "geklaut" wird.


Also in den Shader PointLight.frag und DirectionalLight.frag habe ich das max nicht mehr drin gehabt. Und das sind auch die Zwei die verwendet werden. Kann sein, dass es in den alten Versionen noch drin war.

Für Specular ist das max wichtig, ansonsten stimmt nämlich die Specular-Formel nicht mehr und es sieht echt merkwürdig aus.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 07, 2012 09:44 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Macht es eigentlich sinn nachdem man mit dem Frustum-Culling dass sichtbare Licht ermittelt hat, noch zusätzlich einen Occlusion-Query Test zu machen? Wenn ja, wie verbinde ich das denn mit dem Deferred Rendering?

Habe das hier gestern gelesen:
http://www.heise.de/newsticker/meldung/OpenGL-ES-3-0-die-Zukunft-der-Tablet-und-Smartphone-Grafik-1660473.html?view=zoom;zoom=1


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 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.020s | 16 Queries | GZIP : On ]