openGL 2D durch Textur definierten Ausschnitt zeichnen



  • Hallo,

    ich habe eine 2D-Szene, die in openGL gerendert wird. Ziemlich einfach, eigentlich nur ein paar Linien.

    Dazu gibt es einen GL_SCISSOR, der das Zeichnen nur in einem rechteckigen Bereich zulässt. In etwa so:

    glScissor(0,0,500,415);
    glEnable(GL_SCISSOR_TEST);
    
    GlVertexPointer(); // Bla
    glDrawArrays(); // Blub
    
    glDisable(GL_SCISSOR_TEST);
    

    Jetzt soll dieser Bereich nicht mehr rechteckig sein, sondern etwas komplexer.
    Dazu habe ich eine Textur, die hat einen Bereich der ist komplett weiß, und der Rest ist komplett schwarz.

    Wie kriege ich es hin, statt des rechteckigen scissors, die weiße Fläche der Textur als Begrenzung haben?


  • Mod

    ich glaube alphatest ist was du suchst.



  • genau das geht leider nicht, denn dann würde ich ja auch alles ausmaskieren, was vorher schon gezeichnet ist.
    Ich will NUR den inhalt der aktuellen phase (zwischen glEnable und glDisble) maskiert haben, und nicht auch was vorher schon untendrunter gezeichnet wurde.
    Ich habe das Stichwort "Stencilbuffer" zu dem Thema gefunden, verstehe nur leider nicht, wie das funktioniert und wie man das mit einer Textur kombinieren könnte.



  • Du kannst zum Beispiel einen Fragmentshader binden, der für jedes Fragment prüft, ob die Textur an dieser Stelle weiß ist. Wenn ja, -> discard


  • Mod

    2d schrieb:

    genau das geht leider nicht, denn dann würde ich ja auch alles ausmaskieren, was vorher schon gezeichnet ist.

    alphatest maskiert nichts vom framebuffer, es testet nur anhand der aktuellen textur und ueberschreibt den framebuffer.

    Ich will NUR den inhalt der aktuellen phase (zwischen glEnable und glDisble) maskiert haben

    und genau das macht alpha test, nur der aktuelle textur inhald, den du mittels des alpha channels festlegen kannst (da liegt also die maske, nicht im framebuffer), wird maskiert und dann in den framebuffer gezeichnet.

    als c waere das in etwa pro pixel

    if(textur.alpha>alphe_test_referenz)
      framebuffer.color = textur.color;
    

    wenn das nicht das ist was du moechtest, schreib eine cpp funktion hin, vielleicht missverstehe ich ja deine termini.


Anmelden zum Antworten