Stap 6: De bouw: opzetten van de viewport
In deze stap zal ik gaan door het proces van het opzetten van een viewport in OpenGL, en kleur toevoegen aan de achtergrond!
Ten eerste kunt een kijkje nemen op de Anti-aliasing.
SDL_GL_SetAttribute() wordt gebruikt om verschillende eigenschappen voor onze venster instellen. Het is om te worden gebruikt voor de schepping van een venster daarom niet te worden gebracht in de hoofdlus.
In dit geval, gebruikte ik het inschakelen van Anti-Aliasing door SDL_GL_MULTISAMPLEBUFFERS ingesteld op 1 (d.w.z. ON). En SDL_GL_MULTISAMPLESAMPLES de Anti-Aliasing niveau instellen die van 1 (MIN) tot en met 8 (MAX worden kan).
Nu heb ik twee nieuwe functies hier gedefinieerd
initGL (
Coördineren van X, Y coördineren
Breedte, hoogte
)
aan deze door de gebruiker gedefinieerde functie pas ik de locatie van de viewport in mijn aanvraag en de grootte van mijn viewport die ik wil maken.
Nu moeten we de projectie voor de viewport, definiëren zodat establishProjectionMatrix() ik de viewport grootte doorgegeven. Er zijn twee hoofdtypen van prognoses
1) orthografische: dit type projectie is gebruikt in waterbouwkundige toepassingen waar het object wordt weergegeven aangezien er zonder vervorming.
2) perspectief: Dat biedt een "real life" weergave van objecten, de manier waarop we zien dingen natuurlijk met onze ogen. Dit type projectie wordt meestal gebruikt in games en simulaties.
Zo inrichten van de projectie, de GL_PROJETION matrix of laden de projectie matrix. Zoals ik al eerder zei, zijn de eigenschappen van de scène in OpenGL gecontroleerd door middel van matrices. Perspectiefprojectie wijzigt de scène door vervormen de vorm van de objecten in de scene. Dus we voor het opslaan en toepassen van deze informatie op de scène, matrices gebruiken.
Nu kan alleen een matrix worden geladen om te wijzigen in OpenGL tegelijk. Dus wanneer we iets wijzigen in de scène wilt, we gebruik van een matrix moeten, elke keer als we willen een matrix gebruiken, moeten we laden met behulp van glMatrixMode()
nu initialiseren we net als een variabele op nul bij definitie
int var = 0;
We moeten doen hetzelfde met een matrix
glMatrixMode(GL_PROJETION); //Load de matrix in OpenGL
glLoadIdentity(); / / Initialiseren
We initialiseren van deze matrix met een identiteit matrix, dan beginnen te wijzigen.
gluPrespective(,,,);
1) gezichtsveld-duurt een hoek in graden, en gezichtsveld in de Y-as. Ik koos voor een natuurlijke weergave, 45 graden.
2) hoogte-/ breedteverhouding - hier u doorgeven in het resultaat van hoogte/breedte van de viewport.
3) in de buurt van het knippen vliegtuig - de minimale afstand vanaf de camera waarnaar de 3D-wereld wordt gemaakt. bijvoorbeeld, soms wanneer u uw karakter in 3de persoonsmening verplaatst, krijgt u ook dicht bij zijn lichaam en je de binnenkant van het teken, in de buurt van knipvlak in actie, een onzichtbare vlak voor de camera zien. Als geen veelhoeken/punten kruis dat vliegtuig, worden ze niet weergegeven in de 3D-scène.
4) ver knippen vliegtuig - de verste afstand van de camera die waarnaar de objecten in de 3D-scène geladen/getrokken worden zal. bijvoorbeeld in de open wereld, RPG van zoals Skyrim, aan de horizon ziet u de land/stad verdwijnen in een witte smog, thats het knipvlak veel. Het is nuttig om de CPU-belasting omdat objecten te ver weg van de camera als getrokken, niet eens zichtbaar op het scherm worden.
De eerste functie in establishProjectionMatrix() die is glViewport() is verantwoordelijk voor de creatie voor de werkelijke viewport in onze opgegeven regio.
Na de oprichting van de projectie matrix, laten we overgaan naar andere initialisatie stappen,
Voordat we verder gaan, laten we eens kijken twee functies:
glEnable() en glDisable(),
Stel je voor OpenGL om een grote machine. Deze machine heeft een heleboel schakelaars te veranderen de manier waarop OpenGL zich gedraagt en genereert uitvoer. Als u wilt spiegelen deze schakelopties, gebruiken wij glEnable en glDisable.
Alles verandert OpenGL gedrag, maar de volgende coderegels zijn belangrijk.
Als u meerdere viewports gedefinieerd in uw app en proberen te maken van een object naar een viewport, ziet u geen om het even wat op andere viewports in de app. Dit is omdat de eigenschappen van een viewport veroorzaken conflicten met andere viewports.
dus gebruiken we de glScissor() die in feite definieert een gebied voor de viewport (in dit geval gebied waar viewport zelf wordt gedefinieerd) waarnaar de viewport en de gevolgen ervan zijn beperkt tot.
Dit laat ons meerdere viewports maken met hun eigen effecten en eigenschappen.
Nu laten we een kijkje nemen op DrawScene()
Deze is geplaatst na initGL() omdat het onze code voor de weergave van de kubus zal ontvangen.
glClear() wist de render (viewports) zijn met de vooraf gedefinieerde kleur en in dit geval aangezien we gaan worden met behulp van 3D veelhoeken, ik heb ook de diepte-buffer.