SweClockers klassiska musmattor återvänder!

OpenGL: "Nollställa"/skydda grafik

Permalänk
Medlem

OpenGL: "Nollställa"/skydda grafik

Hej på er programeringsgurus!

Har försökt hitta svar på detta på nehe.gamedev.net men har gått bet på det. Mitt problem är som följer:

Mitt program ritar ut grafik genom att först gå till en "3D-miljö" (gluPerspective) och efter att denna ritats ut går jag över till en "2D-miljö" (gluOrtho2D) som fungerar som ett overlay där jag skapar enkla symboler mha grafiska kommandon, tex glRectf. (edit: allt detta sker i en och samma buffer, de olika miljöerna är alltså inget annat än att jag växlar "projektionslägen" enl ovan, därefter flushas allt till grafikkortet)

Japp, tänk er ett typiskt dataspel med en 3D-värld med spelinfo som overlay (2D-miljön).

I "2D-miljö" läget används bland annat glRect-kommandon till olika typer av masker som delvis täcker 3D-miljön. Problemet är att jag vill sudda ut DELAR av en glRect figur.

Denna glRect figur är av diverse orsaker väldigt smidig att använda (den fungerar som en default mask och jag adderar sedan fler masker till denna). Nu vill jag alltså "klippa sönder" delar av denna figur ALTERNATIVT figuren ska bara bereda ut sig på de områden jag bestämmer.(*)

Nån som hajjar vad jag menar? Enklast att förklara är väl nått sånt här:
Tänk er en stor röd fylld rektangel som läggs som en blaffa på en 3D-värld. En del av denna ska suddas bort. Problemet är att 3D-värden bakom rektangeln inte ska suddas bort. Alternativt ska inte EN DEL av denna ritas ut i huvudtaget.

Med suddas menar jag INTE att man målar över denna med bakgrundsfärgen (clear color) utan att de colorbitar som just satts pga den röda rektangeln ska "återfå sitt tidigare värde".

Är det tydligt vad jag vill uppnå? Om inte kan jag klistar in ett kodexempel.

***

Inser nu att det blir rätt knepigt, det går väl inte att "radera" endast det som finns i "2D-lagret" väl? (helt enkelt eftersom det inte är något lager egentligen).

Funderar på om man kan använda Stencilbuffers på något sätt men jag har rätt dålig erfarenhet om hur de faktiskt funkar. Kan man använda Stencilbuffers för att göra delar av skärmen, som jag kan definera dynamiskt, "skyddade", dvs "just här får du inte rita mer från och med nu men gärna runt omkring mig". Isf tror jag att jag skulle kunna få ihop en lösning...

Eller ska man använda flera buffrar, en buffer som enbart har 3D grafik och en annan med enbart 2D grafik, som man sedan slår ihop till en buffer som pumpas iväg till frontbufferten? Hur fixar man i så fall två buffrar?

Kanske att 2D-grafiken läggs i en separat buffer med transparent bakgrund?

Nån som har en idé?

Löjligt tacksam för hjälp även om jag förstår att det inte är en barnlek att förklara hur jag ska göra.

(*) Ja, man kan tycka att "varför rita ut EN rektangel, gör flera små runt om det område du inte vill rita?". Det var min första tanke med men tyvärr visade det sig ge ett helt hopplöst beräkningsjobb...

Permalänk
Medlem

Gör så att du renderar det du ska klippa ut (alltså den yta som ska vara kvara alternativt tas bort) till stencilbuffern. Därefter slår du på stencilcheckar och ritan rektangeln. Det som händer då är att endast de punkter där stencilbuffern är satt/inte satt (beroende på vilken stencilfunktion du väljer) kommer att renderas.

EDIT: stavfel

Visa signatur

void@qnet
teeworlds, stålverk80, evil schemer, c, c++
Languages shape the way we think, or don't.

Permalänk
Medlem

Aha, STORT tack jdv!

Upptäckte precis glScissor som jag av nån anledning har missat tidigare. Den fungerar väl något liknande (den är väl nån variant av stencil?) men om jag inte misstar mig så används den bara till för att definera var man får rita, inte var man inte får rita så att säga..hade varit betydligt mer användbart i mitt fall.

Får nog prova ditt stencilförslag med en vettig stencilfunktion...återkommer om jag klantar bort mig nånstans på vägen.

Permalänk
Medlem

glScissor ställer bara in en ruta och gör att inget ritas utanför den... kan vara bra om du vill använda glClear på bara en bit av skärmen.

Visa signatur

void@qnet
teeworlds, stålverk80, evil schemer, c, c++
Languages shape the way we think, or don't.

Permalänk
Medlem

Annars skulle du kunna rita en polygon med en textur som är genomskinlig där du inte vill ha något..