Nybörjarguide till OpenGL: Bygg din egen CAD-program (5 / 14 steg)
Steg 5: Bygga: att göra ett fönster
The Basic-kod måste du kompilera och köra är som nedan. Nu, det kan vara mycket kortare, men jag vill införa vissa viktiga begrepp i det här steget och slutföra detta instructable i en ändlig tid.
Låt oss ta en närmare titt på initiering
SDL_Init initierar sdl till ett läge som du vill använda. Specifikt, finns det 8 lägen i SDL som inkluderar Audio, CD-ROM, fil I/O, Joystick hantering, Threading, händelse hantering, Timers, Video (den som vi använder). Nu är vårt behov just nu endast SDL_INIT_VIDEO.
De nästa tre raderna kod helt enkelt skapa ett fönster för oss att använda. skärmen är en variabel av typen
SDL_Window *skärmen;
I denna variabel, vi lagrar returvärdet för SDL_CreateWindow() som returnerar ett fönster om framgångsrika eller en NULL om misslyckade.
i SDL_CreateWindow(),
1) det första argumentet detaljer på fönstrets namnlist,
2) det andra och tredje argumentet ge standardplatsen för fönstret på skärmen vid start
3) fjärde och femte argumentet anger skärmens storlek, jag har skapat två variabler Fönsterhöjd = 1020; och fönstret bredd = 610 och att lagra denna information.
4) det sjätte argumentet är för en flagga, som kan ange saker som om fönstret kan storleksändras eller om det bör minimeras vid start osv kan du hitta fler flaggor i länkarna längst ner i detta steg.
Funktionen nästa SDL_CreateContext() är unik för varje fönster. SDL2 infördes ett nytt system som du kan skapa flera fönster. men för varje fönster, måste du skapa ett sammanhang som i princip lagrar alla statens förknippas med denna instans av OpenGL.
Som jag sa innan, OpenGL är en tillståndsdator. Vår ansökan kan ha flera fönster, så openGL måste veta vilket fönster att göra grafik till, så vi använder
SDL_GL_MakeCurrent (, )
att berätta openGL vilket fönster att rendera till. OpenGL kommer att fortsätta att göra till ett visst set fönster tills du återanvända nuvarande SDL_GL_Make om du vill ange ett annat fönster.
Nästa, låt oss ta en titt på while() slingan
Nu är detta den viktigaste loop där vi kommer att göra vår skärm och kontroll för händelser. Denna loop körs tills exit villkoret är sant dvs vi avsluta programmet genom att trycka på knappen kors på toppen av fönstret.Jag har skapat en variabel = 0; som slingan kommer att kontrollera vid varje iteration. Om du = 1, programmet har nöjd exit skick och loopen avslutas och programmet stängs.
SDL_Event händelsen skapar form av en bunt med olika händelser sorterade efter prioritet för händelsen. Vid varje ny iteration, ansökan staten kommer att uppdateras och i varje iteration av loopen, kan användaren trycker på tangenter, klicka på knappar eller flytta musen etc.
SDL_PollEvent (& event); befolkar händelsen med de olika händelser som inträffar i varje iteration.
det vill säga i varje iteration av while loop, variabeln händelse kommer att vara nyinsatta med händelsedata över och över igen.
genom att placera SDL_PollEvent (& event); i ett tag loop
medan (SDL_PollEvent (& event))
{
}
Vi kan utvärdera händelser från händelsen stacken i variabeln händelse tills det finns inga fler händelser i den händelsen variabel.
i det kapslade medan loop, när vi på SDL_QUIT händelse som i princip säger oss på röda korset-knappen på toppen av ansökan har tryckts och användaren är nu avsluta programmet.
Den sista funktionen är SDL_GL_SwapWindow(screen).
Nu är allt återges på skärmen i OpenGL lagras i ett minnesområde som kallas rambuffert. När du uppdaterar skärmen med en ny bild på varje ram, ram buffertar innehållet raderas och befolkade med ny grafik. praktiskt taget denna process tar tid och om vi kör vår ansökan detta sätt som vi skulle se en massa flimmer som ritade den nya bilden tar tid i rambuffert.
Men med begreppet minne bytande, vi kan hindra denna effekt. Vi definierar två minnesområden, bufferten som främre och bakre bufferten, skärmen pekar på främre bufferten och visas bilden i främre bufferten. Nästa bild ritas är laddad i bakre bufferten medan skärmen visar innehållet i det främre buffert, så istället för att kopiera innehållet i ryggen buffert till främre bufferten, skärmen pekar på bakre bufferten istället nästa bildruta dras direkt, och främre bufferten fylls med nästa bildruta och skärmen ändras igen och så vidare. I huvudsak vi definiera till minnesplatser och ladda data till dem sida vid sida dvs bilden som ska visas och nästa bild att visas och hålla byta skärm pekaren mellan två.
Lyckligtvis i OpenGL, behöver vi inte gå in på det mycket komplexitet och bara anropa en funktion för att uppnå en fin skärm och förhindra flimmer:
SDL_GL_SwapWindow (),
Den sista sak att göra stängs programmet och avyttra alla resurser vi använt.
Externa länkar och referenser för vidare forskning:
SDL_Init()- https://www.libsdl.org/release/sdl-1.2.15/docs/htm...
SDL_CreateWindow()- https://wiki.libsdl.org/SDL_CreateWindow
SDL_GL_MakeCurrent()- https://wiki.libsdl.org/SDL_GL_MakeCurrent
SDL_PollEvent()- https://wiki.libsdl.org/SDL_PollEvent