2D Shadows



  • ja, ist schon sau witzig. echt originell und intelligent, das witzchen. das haette ich ja fast nicht erwartet.

    ...



  • Er meint - wenn ich ihn richtig verstehe - das selbe wie in dem von dir verlinkten Artikel beschrieben ist. Nur mit Stencil-Buffer statt Alpha-Kanal.



  • schattenrechner schrieb:

    ja, ist schon sau witzig. echt originell und intelligent, das witzchen. das haette ich ja fast nicht erwartet.

    ...

    Klar ist es witzig. Was soll er denn sonst meinen? Verstehe grad nicht was man da nicht verstehen kann...



  • hustbaer schrieb:

    schattenrechner schrieb:

    ja, ist schon sau witzig. echt originell und intelligent, das witzchen. das haette ich ja fast nicht erwartet.

    ...

    Klar ist es witzig. Was soll er denn sonst meinen? Verstehe grad nicht was man da nicht verstehen kann...

    Wieso ist das bitte klar? Wenn man z.B. noch nit mit einem Stencilbuffer gearbeitet hat, ist das ueberhaupt nicht klar. Ist ja wohl offensichtlich, dass ihm die Bedeutung des Wortes subtrahieren klar ist, nur nicht was es in diesem Kontext bedeutet.

    Er meint mit subtrahieren wohl: Bei erfolgreichen Z/Stenciltest den Wert im DepthStencilBuffer dekrementieren.



  • this->that schrieb:

    hustbaer schrieb:

    schattenrechner schrieb:

    ja, ist schon sau witzig. echt originell und intelligent, das witzchen. das haette ich ja fast nicht erwartet.

    ...

    Klar ist es witzig. Was soll er denn sonst meinen? Verstehe grad nicht was man da nicht verstehen kann...

    Wieso ist das bitte klar? Wenn man z.B. noch nit mit einem Stencilbuffer gearbeitet hat, ist das ueberhaupt nicht klar. Ist ja wohl offensichtlich, dass ihm die Bedeutung des Wortes subtrahieren klar ist, nur nicht was es in diesem Kontext bedeutet.

    Er meint mit subtrahieren wohl: Bei erfolgreichen Z/Stenciltest den Wert im DepthStencilBuffer dekrementieren.

    Danke!

    Die funktionsweise des Stencilbuffers war mir schon klar (in der Theorie), aber damit gearbeitet habe ich tatsächlich noch nie.

    Ich habe grade mal eine Methode zusammengefrickelt um zumindest mal nur das Gebiet des Kreises zeichnen zu lassen (der Rest wird per Stencil-Test rausgefiltert). Ich mache das im Moment grob gesagt so:

    //render methode
    //keine farben in buffer malen
    GL11.glColorMask(false, false, false, false);
    
    //1 in stencilbuffer schreiben wo die lichter gezeichnet werden
    GL11.glEnable(GL11.GL_STENCIL_TEST);
    GL11.glStencilFunc(GL11.GL_ALWAYS,1,1);
    GL11.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_REPLACE);
    GL11.glDisable(GL11.GL_DEPTH_TEST);
    
    //pseudocode zum lichterzeichnen
    zeichnelichter();
    
    //farben ab jetzt wieder zeichnen
    GL11.glColorMask(true,true,true,true);
    //wenn im stencil buffer 1 und nur 1 steht, zeichnen
    GL11.glStencilFunc(GL11.GL_EQUAL, 1, 1);
    GL11.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP);
    GL11.glEnable(GL11.GL_DEPTH_TEST);
    
    //rest der geometry zeichnen
    zeichneallesprites();
    zeichnealleformenundlinien();
    zeichnerestlicheszeugs();
    

    Wie würde ich das anpassen, dass nach Intensität gemalt wird? Im Moment habe ich einen vollen Lichtradius der komplett hell gezeichnet wird. Aber je weiter man vom Zentrum des Lichts weg geht, desto dunkler soll dort ja gezeichnet werden. Muss ich das noch irgenwie mit Blending kombinieren oder kann ich das mit dem Stencilbuffer alleine hinbekommen?



  • Was ist GL11 ? Habe ich etwas verpasst?



  • EOutOfResources schrieb:

    Was ist GL11 ? Habe ich etwas verpasst?

    Der GL11 namespace.



  • schattenspieler schrieb:

    namespace.

    Namensbereiche löst man mit dem Bereichauflösungsoperator (::) auf und nicht mit dem Memberzugriffsoperator (heisst der so?).



  • Ja, sorry, das ist Java, kein C++. Genauer gesagt ist das LWJGL und in GL11 befinden sich die ganzen Bindings von OpenGL 1.1.



  • Schattenspieler schrieb:

    Ja, sorry, das ist Java, kein C++.

    Aha! Ich dachte, du arbeitest in C++. Deshalb habe ich mich gefragt, was GL11 ist, denn der OpenGL-Header von C globalisiert alle Funktionen.



  • Kein Problem. Die Frage bleibt aber immer noch:

    schattenmaler schrieb:

    this->that schrieb:

    hustbaer schrieb:

    schattenrechner schrieb:

    ja, ist schon sau witzig. echt originell und intelligent, das witzchen. das haette ich ja fast nicht erwartet.

    ...

    Klar ist es witzig. Was soll er denn sonst meinen? Verstehe grad nicht was man da nicht verstehen kann...

    Wieso ist das bitte klar? Wenn man z.B. noch nit mit einem Stencilbuffer gearbeitet hat, ist das ueberhaupt nicht klar. Ist ja wohl offensichtlich, dass ihm die Bedeutung des Wortes subtrahieren klar ist, nur nicht was es in diesem Kontext bedeutet.

    Er meint mit subtrahieren wohl: Bei erfolgreichen Z/Stenciltest den Wert im DepthStencilBuffer dekrementieren.

    Danke!

    Die funktionsweise des Stencilbuffers war mir schon klar (in der Theorie), aber damit gearbeitet habe ich tatsächlich noch nie.

    Ich habe grade mal eine Methode zusammengefrickelt um zumindest mal nur das Gebiet des Kreises zeichnen zu lassen (der Rest wird per Stencil-Test rausgefiltert). Ich mache das im Moment grob gesagt so:

    //render methode
    //keine farben in buffer malen
    GL11.glColorMask(false, false, false, false);
    
    //1 in stencilbuffer schreiben wo die lichter gezeichnet werden
    GL11.glEnable(GL11.GL_STENCIL_TEST);
    GL11.glStencilFunc(GL11.GL_ALWAYS,1,1);
    GL11.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_REPLACE);
    GL11.glDisable(GL11.GL_DEPTH_TEST);
    
    //pseudocode zum lichterzeichnen
    zeichnelichter();
    
    //farben ab jetzt wieder zeichnen
    GL11.glColorMask(true,true,true,true);
    //wenn im stencil buffer 1 und nur 1 steht, zeichnen
    GL11.glStencilFunc(GL11.GL_EQUAL, 1, 1);
    GL11.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP);
    GL11.glEnable(GL11.GL_DEPTH_TEST);
    
    //rest der geometry zeichnen
    zeichneallesprites();
    zeichnealleformenundlinien();
    zeichnerestlicheszeugs();
    

    Wie würde ich das anpassen, dass nach Intensität gemalt wird? Im Moment habe ich einen vollen Lichtradius der komplett hell gezeichnet wird. Aber je weiter man vom Zentrum des Lichts weg geht, desto dunkler soll dort ja gezeichnet werden. Muss ich das noch irgenwie mit Blending kombinieren oder kann ich das mit dem Stencilbuffer alleine hinbekommen?



  • Hast du die Extention ARB_depth_buffer_float geladen? Sie erlaubt 8-bit-Werte im Stencil-Puffer.



  • ja, mein stencil buffer ist schon 8 bit lang, aber wie hilft mir das einen die farben innerhalb des lichts abzudunkeln je nachdem welcher wert im stencil buffer ist?

    vor allem, wie bekomme ich so weich interpolierte uebergaenge, die mir beim malen des lichtes automatisch erstellt werden (indem ich in der mitte einfach als alpha die intensitaet und bei den punkten aussenrum als alpha 0 angebe) in den stencil buffer?



  • schattenspieler schrieb:

    vor allem, wie bekomme ich so weich interpolierte uebergaenge, die mir beim malen des lichtes automatisch erstellt werden in den stencil buffer?

    glStencilMask erwartet ja ein unsigned-char -Array. Dort kann man ja auch mit der Intensität variieren. Oder kennst du den Aufbau der Stencil-Methoden OpenGLs nicht?



  • sorry, aber du bist so unkonkret wie man einfach nur sein kann.

    glStencilMask erwartet ein int, das zum maskieren bestimmter bits im buffer benutzt wird. was hat das mit weichen übergängen zu tun, und erst recht mit abdunkeln von bits?

    poste bitte mal klipp und klar wie du das implementieren würdest, gerne mit ein wenig pseudocode, aber bitte keinen pseudocode wenn es um den konkreten aufruf von opengl funktionen geht.



  • aha, anscheinend hast du wirklich nur gebullshittet und keine ahnung wovon du redest, wie ich es von anfang an vermutete.

    wenn jemand anderes eine idee hat, wäre ich für hilfe sehr dankbar! ich habe es zwischenzeitlich mit zusätzlichen blending probiert, das haut aber nicht so wirklich hin, da manche der objekte die vom licht beeinflusst werden schon selber blending benötigen (zum rausmaskieren von farben in einer textur, z.b. dieses typische 255,0,255 magenta als hintergrund in sprites).



  • Per Stencil kriegst Du keine weichen Schatten weil Du ja pro Pixel jeweils nur einen Entweder/Oder-Test machen kannst.
    Wenn Du den Alpha-Kanal nicht benutzen willst, dann schreib die Schattenintensitaet doch einfach in ein separates Rendertarget...



  • hellihjb schrieb:

    Per Stencil kriegst Du keine weichen Schatten weil Du ja pro Pixel jeweils nur einen Entweder/Oder-Test machen kannst.
    Wenn Du den Alpha-Kanal nicht benutzen willst, dann schreib die Schattenintensitaet doch einfach in ein separates Rendertarget...

    das hab ich mir schon ueberlegt. das weichzeichnen einfach per render-to-texture direkt auf die textur kleben, nachdem ich ihre alpha-werte schon bearbeitet habe.

    habe aber diese art von extensions in opengl noch nicht benutzt (framebuffer objects). dann mach ich mich mal auf die suche nach tutorials^^


Anmelden zum Antworten