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

Aktuelle Zeit: Do Apr 18, 2024 21:42

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



Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: Do Jul 19, 2012 23:38 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Serv,

ich habe nun endlich einfaches Deferred Rendering implementiert und bin aber grad ratlos wie ich z.b. meine Skybox integrieren kann oder andere Objekte wie z.b. Billboard Quads.

Also ich hab das bisher so gemacht:

Ich erzeuge meinen GBuffer mit Position/Normal/Color mit einem drawcall in alle 3 color attachments.
Funktioniert prächtig. Alle 3 landen sauber in 3 underschiedlichen Texturen.
Danach rendere ich jedes Licht (Bisher hab ich nur 1) in ein weiteres FBO mit aktiviertem Blending GL_ONE und Tiefentest aus.
Dann wird diese generierte Licht-FBO-Texture mit der GBuffer-Color-Texture multipliziert und fertig.

Nun möchte ich aber Objekte dazu rendern, die nicht beleuchtet werden sollen wie z.b. eine Skybox.
Wie macht man das eigentlich? In meiner Fluid Demo mach ich das ja umgekehrt, da wird die Finale Wasser-Texture über die Szene geblendet und gl_FragDepth gesetzt.

Das andere ist, wie addiert man mehrere Lichter in ein FBO? Mit dem Blending hat das nicht funktioniert, wenn ich das zweite Licht aktiviere, dann ist immer nur das letzte verwendet. Ein wenig strange.

Wäre toll wenn mir da jemand mal erklären könnte wie deferred rendering wirklich funktioniert.
Bisher habe ich einfach nur versucht, es zu implementieren wie ich denke das es funktionieren könnte.

Hier mal ein wenig code:/

Code:
  1.  
  2. void fillGBuffer() {
  3.     glm::mat4 mvp = gCamera.GetModelViewProjection();
  4.  
  5.     // Resize GBuffer if needed
  6.     if ((gGBuffer->GetWidth() != windowWidth) ||
  7.         (gGBuffer->GetHeight() != windowHeight))
  8.     {
  9.         gGBuffer->Resize(windowWidth, windowHeight);
  10.     }
  11.  
  12.     // Enable GBuffer FBO
  13.     gGBuffer->Enable();
  14.  
  15.     // Set GBuffer MRT color attachments
  16.     GLenum buf[3];
  17.     buf[0] = GL_COLOR_ATTACHMENT0;
  18.     buf[1] = GL_COLOR_ATTACHMENT1;
  19.     buf[2] = GL_COLOR_ATTACHMENT2;
  20.     gGBuffer->SetDrawBuffers(&buf[0], 3);
  21.  
  22.     // Set viewport to our GBuffer size which is basically the same as window for now
  23.     gRenderer->SetViewport(0, 0, gGBuffer->GetWidth(), gGBuffer->GetHeight());
  24.  
  25.     // Load our camera matrix
  26.     gRenderer->LoadMatrix(mvp);
  27.  
  28.     // Clear draw buffers
  29.     gRenderer->ClearColor(-10000.0f, 0.0f, 0.0f, 1.0f);
  30.     gRenderer->Clear(ClearFlags::Color | ClearFlags::Depth);
  31.  
  32.     // Enable GBuffer Shader
  33.     gGBufferShader->Enable();
  34.  
  35.     // Render teapot
  36.     gRenderer->SetCullFace(false);
  37.     gRenderer->SetColor(1.0f, 1.0f, 0.0f, 1.0f);
  38.     glutSolidTeapot(5.0f);
  39.     gRenderer->SetCullFace(true);
  40.  
  41.     // Disable GBuffer Shader
  42.     gGBufferShader->Disable();
  43.  
  44.     // Disable GBuffer FBO
  45.     gGBuffer->Disable();
  46. }
  47.  
  48. glm::mat4 orthomvp = glm::ortho(-1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f);
  49.  
  50. void accumulateLighting() {
  51.     CTexture2D* posTex = gGBuffer->GetTexture("pos");
  52.     CTexture2D* normalTex = gGBuffer->GetTexture("normal");
  53.  
  54.     // Resize Deferred Rendering if needed
  55.     if ((gDeferredRenderingFBO->GetWidth() != windowWidth) ||
  56.         (gDeferredRenderingFBO->GetHeight() != windowHeight))
  57.     {
  58.         gDeferredRenderingFBO->Resize(windowWidth, windowHeight);
  59.     }
  60.  
  61.     // Disable blending
  62.     gRenderer->SetBlendFunc(GL_ONE, GL_ONE);
  63.     gRenderer->SetBlending(true);
  64.  
  65.     // Disable depth test
  66.     gRenderer->SetDepthTest(false);
  67.  
  68.     // Enable Deferred Rendering FBO
  69.     gDeferredRenderingFBO->Enable();
  70.  
  71.     // Set viewport to our Deferred Rendering size which is basically the same as window for now
  72.     gRenderer->SetViewport(0, 0, gDeferredRenderingFBO->GetWidth(), gDeferredRenderingFBO->GetHeight());
  73.  
  74.     // Load matrix
  75.     gRenderer->LoadMatrix(orthomvp);
  76.  
  77.     // Set active draw buffer
  78.     gDeferredRenderingFBO->SetDrawBuffer(GL_COLOR_ATTACHMENT0);
  79.     gRenderer->ClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  80.     gRenderer->Clear(ClearFlags::Color);
  81.  
  82.     // Accumulate lights to deferred vbo target
  83.     const int lightCount = 1;
  84.     PxVec3 lightVec = sunPos.getNormalized();
  85.     PxVec4 lightColor[] = {PxVec4(1.0f, 1.0f, 1.0f, 1.0f)};
  86.     PxVec4 ambientColor = PxVec4(0.0f, 0.0f, 0.0f, 1.0f);
  87.     for (int i = 0; i < lightCount; i++) {
  88.         // Enable textures
  89.         gRenderer->EnableTexture(0, normalTex);
  90.         gRenderer->EnableTexture(1, posTex);
  91.            
  92.         // Draw fullscreen quad with shader
  93.         gDirectionalLightShader->Enable();
  94.         gDirectionalLightShader->Uniform1i(gDirectionalLightShader->GetUniformLocation("normalTex"), 0);
  95.         gDirectionalLightShader->Uniform1i(gDirectionalLightShader->GetUniformLocation("positionTex"), 1);
  96.         gDirectionalLightShader->Uniform1f(gDirectionalLightShader->GetUniformLocation("shininess"), 10.0f);
  97.         gDirectionalLightShader->Uniform4f(gDirectionalLightShader->GetUniformLocation("ambientColor"), &ambientColor[0]);
  98.         gDirectionalLightShader->Uniform4f(gDirectionalLightShader->GetUniformLocation("lightColor"), &lightColor[i][0]);
  99.         gDirectionalLightShader->Uniform3f(gDirectionalLightShader->GetUniformLocation("lightDir"), &lightVec[0]);
  100.         gRenderer->DrawTexturedQuad(-1.0f, -1.0f, 2.0f, 2.0f);
  101.         gDirectionalLightShader->Disable();
  102.  
  103.         // Disable textures
  104.         gRenderer->DisableTexture(1, posTex);
  105.         gRenderer->DisableTexture(0, normalTex);
  106.     }
  107.  
  108.     // Enable Deferred Rendering FBO
  109.     gDeferredRenderingFBO->Disable();
  110.  
  111.     // Enable depth test
  112.     gRenderer->SetDepthTest(true);
  113.  
  114.     // Disable blending
  115.     gRenderer->SetBlending(false);
  116.     gRenderer->SetBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  117. }
  118.  
  119. void renderGBuffer() {
  120.     CTexture2D* depthTex = gGBuffer->GetTexture("depth");
  121.     CTexture2D* posTex = gGBuffer->GetTexture("pos");
  122.     CTexture2D* normalTex = gGBuffer->GetTexture("normal");
  123.     CTexture2D* diffuseTex = gGBuffer->GetTexture("diffuse");
  124.     CTexture2D* lightTex = gDeferredRenderingFBO->GetTexture("lighting");
  125.  
  126.     gRenderer->SetColor(1.0f, 1.0f, 1.0f, 1.0f);
  127.  
  128.     gRenderer->ClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  129.     gRenderer->Clear(ClearFlags::Color | ClearFlags::Depth);
  130.  
  131.     gRenderer->LoadMatrix(orthomvp);
  132.  
  133.     gRenderer->SetViewport(0, windowHeight / 2, windowWidth / 2, windowHeight / 2);
  134.     gRenderer->EnableTexture(0, depthTex);
  135.     gVisualizeDepthShader->Enable();
  136.     gVisualizeDepthShader->Uniform1i(gVisualizeDepthShader->GetUniformLocation("depthSampler"), 0);
  137.     gVisualizeDepthShader->Uniform1f(gVisualizeDepthShader->GetUniformLocation("zfar"), 100.0f);
  138.     gVisualizeDepthShader->Uniform1f(gVisualizeDepthShader->GetUniformLocation("znear"), 1.0f);
  139.     gRenderer->DrawTexturedQuad(-1.0f, -1.0f, 2.0f, 2.0f);
  140.     gVisualizeDepthShader->Disable();
  141.     gRenderer->DisableTexture(0, depthTex);
  142.  
  143.     gRenderer->SetViewport(windowWidth / 2, windowHeight / 2, windowWidth / 2, windowHeight / 2);
  144.     gRenderer->EnableTexture(0, lightTex);
  145.     gRenderer->DrawTexturedQuad(-1.0f, -1.0f, 2.0f, 2.0f);
  146.     gRenderer->DisableTexture(0, lightTex);
  147.  
  148.     gRenderer->SetViewport(0, 0, windowWidth / 2, windowHeight / 2);
  149.     gRenderer->EnableTexture(0, normalTex);
  150.     gRenderer->DrawTexturedQuad(-1.0f, -1.0f, 2.0f, 2.0f);
  151.     gRenderer->DisableTexture(0, normalTex);
  152.  
  153.     gRenderer->SetViewport(windowWidth / 2, 0, windowWidth / 2, windowHeight / 2);
  154.     gRenderer->EnableTexture(0, lightTex);
  155.     gRenderer->EnableTexture(1, diffuseTex);
  156.     gRenderer->EnableTexture(2, posTex);
  157.     gDeferredRenderingShader->Enable();
  158.     gDeferredRenderingShader->Uniform1i(gDeferredRenderingShader->GetUniformLocation("lightTex"), 0);
  159.     gDeferredRenderingShader->Uniform1i(gDeferredRenderingShader->GetUniformLocation("diffuseTex"), 1);
  160.     gDeferredRenderingShader->Uniform1i(gDeferredRenderingShader->GetUniformLocation("positionTex"), 2);
  161.     gRenderer->DrawTexturedQuad(-1.0f, -1.0f, 2.0f, 2.0f);
  162.     gDeferredRenderingShader->Disable();
  163.     gRenderer->DisableTexture(2, posTex);
  164.     gRenderer->DisableTexture(1, diffuseTex);
  165.     gRenderer->DisableTexture(0, lightTex);
  166. }
  167.  


GBuffer Shader:
Code:
  1.  
  2. // Vertex
  3. varying vec4 position;
  4. varying vec3 normal;
  5. varying vec4 color;
  6. void main() {
  7.     position = gl_ModelViewMatrix * gl_Vertex;
  8.     normal = gl_Normal;
  9.     color = gl_Color;
  10.     gl_Position = ftransform();
  11. }
  12.  
  13. // Fragment
  14. varying vec4 position;
  15. varying vec3 normal;
  16. varying vec4 color;
  17. void main() {
  18.     gl_FragData[0] = position;
  19.     gl_FragData[1] = vec4(0.5 * (normalize(normal) + 1.0), 1.0);
  20.     gl_FragData[2] = color;
  21. }
  22.  


Dankö,
Final


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jul 20, 2012 00:44 
Offline
DGL Member

Registriert: Sa Mär 31, 2012 23:14
Beiträge: 26
Programmiersprache: PASCAL
Deferred Rendering ist im Prinzip das was du machst:
Man speichert die Komponenten, die für die Berechnung nötig sind (Position, Normale, Licht, etc.) in Texturen und ein Final-Shader kombiniert dies alles dann.

Das mit mehreren Lichtquellen müsste eig. mit additivem Blending (glBlendFunc(GL_ONE, GL_ONE)) gehen, sodass dann ambient, diffuse und specular jeweils in einem GBuffer stehen.
Das mit den unbeleuchteten Objekten könntest du vllt. regeln indem du einen zusätlichen Wert pro Fragment angibst, der Anzeigt wie stark das Licht an der Stelle wirken soll.
Für so einen Wert könntest du zB den Normalen- oder Positions-GBuffer verwenden, du schreibst ja nur xyz (das w in Position ist ja denke ich nicht wirklich verwertbar)

_________________
The force, strong it is in OpenGL.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jul 20, 2012 08:17 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
breakdancingYoda hat geschrieben:
Deferred Rendering ist im Prinzip das was du machst:
Man speichert die Komponenten, die für die Berechnung nötig sind (Position, Normale, Licht, etc.) in Texturen und ein Final-Shader kombiniert dies alles dann.

Das mit mehreren Lichtquellen müsste eig. mit additivem Blending (glBlendFunc(GL_ONE, GL_ONE)) gehen, sodass dann ambient, diffuse und specular jeweils in einem GBuffer stehen.
Das mit den unbeleuchteten Objekten könntest du vllt. regeln indem du einen zusätlichen Wert pro Fragment angibst, der Anzeigt wie stark das Licht an der Stelle wirken soll.
Für so einen Wert könntest du zB den Normalen- oder Positions-GBuffer verwenden, du schreibst ja nur xyz (das w in Position ist ja denke ich nicht wirklich verwertbar)


Hmm, das könnte sogar gehen, man könnte in diese W komponete vom Normal Buffer float flags angeben, z.b. ob das jeweilige Fragment überhaupt beleuchtet werden soll, ob es schatten erhalten soll, ob es transparent ist etc.

Hmm, da stellt sich wieder mal die frage... Transparenz und Deferred Rendering wie geht das?
Habe gelesen das es mit Inferred Rendering geht... das im grunde ne größeres FBO baut und man Tiles baut im dem FBO target.

Ich muss eh noch überlegen, wie ich meine Fluid Partikel direkt in den GBuffer integrieren kann und diese müssen so gerendert werden.
- Partikel als Point Sprites rendern und in die Tiefe speichern.
- Partikel mit GL_ONE GL_ONE in neues FBO Target rendern um die Dichte zu erhalten.
- Gerenderte Partikeltiefe Bluren in X und Y richtung.
- Normals aus Geblurter Tiefe berechnen
- Nun das ganze zusammenmischen mit fake-Transparenz/Reflection indem man die "mix" methode vom GLSL verwendet und die Beleuchtete Wasserpartikelfarbe mit der Scene zu verbinden und dann mit GL_ONE und GL_ONE auf die Scene zu blenden.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jul 20, 2012 09:27 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

wegen der Skybox: am einfachsten einfach den DepthBuffer vom FBO nach dem Beleuchtungs-Schritt weiter benutzen.

Ich in meinem Fall mache das so, dass ich den DepthBuffer als Textur an meinen Skybox-Shader übergebe.

Das ist der dazugehörige, sehr simple Shader:

Code:
  1. ciVertexShader(sky)
  2. {
  3.   void main(void)
  4.   {
  5.     gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
  6.     gl_TexCoord[0] = gl_MultiTexCoord0;
  7.     gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
  8.   }
  9. }
  10.  
  11. ciPixelShader(sky)
  12. {
  13.   uniform sampler2D texture;
  14.   ciPass(depthMap) {
  15.     uniform sampler2D depthMap;
  16.     uniform vec2 screenSize;
  17.   }
  18.  
  19.   void main(void)
  20.   {
  21.     ciPass(depthMap) {
  22.       if (texture2D(depthMap, gl_FragCoord.xy / screenSize).r > 0.999)
  23.         gl_FragColor = texture2D(texture, gl_TexCoord[0].xy);
  24.       else
  25.         discard;
  26.     }
  27.     ciPass(!depthMap) {
  28.       gl_FragColor = texture2D(texture, gl_TexCoord[0].xy);
  29.     }
  30.   }
  31. }
  32.  
  33. ciShader(sky)
  34. {
  35.   ciVertexShader(sky);
  36.   ciPixelShader(sky);
  37. }



Aya


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jul 20, 2012 09:48 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
@Aya Ich bin sicher nicht der einzige den das interessiert: Ist das ne selbstgebaute Präprozessorsprache? Wenn ja finde ich die jetzt schon superansprechend und werde die Adaptieren :). Wenn nein: Wo gibts das Paket dazu?

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: Fr Jul 20, 2012 10:17 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Lord Horazont hat geschrieben:
@Aya Ich bin sicher nicht der einzige den das interessiert: Ist das ne selbstgebaute Präprozessorsprache? Wenn ja finde ich die jetzt schon superansprechend und werde die Adaptieren :). Wenn nein: Wo gibts das Paket dazu?


Das ist eine selbstgebaute Präprozessorsprache, kann aber noch wesentlich mehr als die paar Sachen die in dem Shader genutzt werden.. :)

Wenn Interesse besteht kann ich das mal etwas genauer erläutern, aber dafür bräuchte es vermutlich eher nen eigenen Thread - ist hier etwas unpassend. (z.B. ermöglicht sie mir das ich den gleichen Shader für Deferred und Forward Rendering nutzen kann, bietet mir die Möglichkeit das ich Uniform Variablen beliebig mit Nodes zusammen bauen kann und es im Shader dann korrekt ankommt, baut Shader automatisch den Anforderungen entsprechend zusammen etc.)

Wenn jemand sie Adaptieren möchte, nur zu - ich freue mich wenn meine Ideen aufgegriffen werden :D

Aya


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jul 20, 2012 11:23 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Das klingt interessant, möchtest du die evenutell mal hier irgendwo vorstellen?

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: Fr Jul 20, 2012 11:24 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Projekt ? :mrgreen:


aber ja das mit den weiterbenutzen der Buffer ist wohl der entspannteste Weg würde ich sagen (hab ja an anderer Stelle schon erwähnt
das ichs genauso mache). Im Prinzip läuft das dann so ab:
Code:
  1.  
  2. SetDefaults();
  3. Surfaces.Sort(new[] {     //das Sort lässt sich genau wie Shader usw. ohne Probleme Cachen
  4.    MaterialFlags.drawDeferred,
  5.    MaterialFlags.drawForward,
  6.    MaterialFlags.drawConst
  7. }).each( function() {
  8.    switch(current.flag)
  9.    {
  10.      default:
  11.           current.WriteDeferred();
  12.           if(next == null || next.flag != current.flag)
  13.           {
  14.                Light.each(function() {
  15.                    //Fullscreen Quad NUR in den Colorbuffer zeichnen
  16.                });
  17.           }
  18.         return;
  19.      case drawForward:
  20.        Lights.each({
  21.           current.Write(); //z.B. für Flächen mit Konstanten Alpha
  22.        });
  23.        break;
  24.      case drawConst:
  25.          current.Write();
  26.        break;
  27.  
  28.    }
  29.  
  30. });
  31.  
  32.  

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jul 20, 2012 13:44 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Lord Horazont hat geschrieben:
Das klingt interessant, möchtest du die evenutell mal hier irgendwo vorstellen?

-> viewtopic.php?f=13&t=10523


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jul 23, 2012 14:20 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
So da bin ich wieder,

habs nun endlich hingekriegt, da waren noch einige sachen im shader falsch. Man sollte auch die modelview matrix mit den normalen multiplizieren -.- Aktuell funktioniert das prima... also simples deferred rendering mit 2 dynamischen Lichtern.

Aber ich bin noch nicht zufrieden damit, denn irgendwie versteh ich immernoch nicht, wie ich non-Deferred oder Transparente Objekte dazu rendern kann, bzw. was viel wichtiger ist, wie ich mein Partikelsystem/Wasser damit integriere, welches 6 Render Targets alleine benötigt!

Das problem ist ja, wenn ich z.b. zu erst die nicht beleuchtete Geometry in den GBuffer schreibe und z.b. in die jeweiligen Fragmente noch ne zusatz info mitgebe, das diese nicht beleuchtet werden sollen, bzw. beleuchtet mit vec4(1.0, 1.0, 1.0, 1.0) und danach die Beleuchteten Objekte rendere, dann würden die Pixel sich ja gegenseitig überschreiben...

Irgendwie steh ich grad brutal auf dem schlauch, also pizza einwerfen... Tochter is eh grad wach geworden, also rechner aus...

Klasse... Visual Studio 2012 RC hat den Compiler von Visual Studio 2010 gekillt -.- oh man... muss ich wohl VS 2010 neu installieren.
Ansonsten hät ich nen Bild vom aktuellen Stand gezeigt.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jul 24, 2012 07:35 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Mir ist heute Morgen was durch den Kopf gegangen wie ich das Problem mit meiner Skybox und Transparenzen Objekten lösen kann.
Man nimmt nicht nur einen GBuffer, nein man nimmt man verschiedene Layer und rechnet diese zusammen.

Hab auch gleich mal gegoogled und siehe da, das gibt es ja schon... allerdings ist mir das mit dem Stencil verfahren nicht klar.
Pack ich da dann einfach ein Stencil target zu meinem FBO dazu? Habe leider noch nie was mit Stencil gemacht, daher versteh ich auch nicht wirklich wie das funktioniert. Weiter googlen...

Aber hier der Link, sehr interessant:
http://www.john-chapman.net/content.php?id=13

So ich habe nun alle Visual Studio Versionen getötet, da VC 2012 mein altes 2010 kaputt gemacht hat und 2012 sehr unstabil läuft.
Ich will doch nur Code-Formatting für Cpp... also gegoogled... fündig geworden: http://www.profactor.co.uk/stylemanager.php

Wäre das toll, wenn das PhysX SDK mit GCC/Eclipse unter Windows laufen würde, aber nein... zig tausende compiler fehler in den includes :(


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jul 24, 2012 09:06 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Stichwort ist hier Depth Peeling iirc. Geht auch ohne Stencil indem du den Tiefentest anpasst.

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: Di Jul 24, 2012 10:58 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Wie schon gesagt du musst halt Sortieren, das ist eigentlich genau das gleiche Problem wie bei alten Spielen nur das man dort halt zwischen Lightmap und nicht-Lightmap
unterscheiden wollte. Im Grunde läuft das so, wenn du eine Oberfläche zeichnen willst prüfst du einfach ob diese eine Alphaoberfläche ist (also Wasser,Glas,etc.). Handelt es
sich um eine Alphaoberfläche packst du sie einfach in eine Liste um sie später zeichnen zu können (Reihenfolge etc. spielt keine Rolle). Wenn es sich hingegen um eine
"normale" Oberflächen handelt, kannst du sie sofort zeichnen. Nun gehst du zurück zum 0-Buffer (also dein eigentlicher Framebuffer) und zeichnest erst einmal die "normalen"
Oberflächen mit dem Shader fürs Deferred-Rendering. Anschließend gehst du wieder in dein FBO und löscht alles bis auf die Tiefe. Jetzt musst du nur noch deine Skybox und
anschließend deine Alphaoberflächen zeichnen. Zum Schluss gehts nochmal zurück zum 0-Buffer, wo man einfach ein Fullscreenquad mit den Colorbuffer und der Blendfunktion
(Alpha , 1 - Alpha) zeichnet.

Wenn du solche Alphaoberflächen beleuchten willst musst du aufpassen das du den Alphawert nicht veränderst, ansonsten ist es ziehmlich straight-forward.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jul 24, 2012 17:34 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
So um mal ein wenig Fortschritt zu zeigen:
http://www.youtube.com/watch?v=QFY8g8M2goU&feature=youtu.be

Objekte ohne Texturen die keine Weiße farbe haben, werden nicht korrekt beleuchtet, bzw. erhalten nicht die Beleuchtung der Lichtfarbe.
Denke mal das wenn ich die Texture einfärbe, das ebenfalls das gleiche Problem ist.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jul 24, 2012 21:25 
Offline
DGL Member
Benutzeravatar

Registriert: So Sep 26, 2010 12:54
Beiträge: 238
Wohnort: wieder in Berlin
Programmiersprache: Englisch
Öhm... Code Formatter... , Visual Studio kennt ^E,D


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


Wer ist online?

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