Ik ontwikkel mijn spel meestal onder ArchLinux. Ik heb besloten om het onlangs op Ubuntu 16.04 te proberen. De situatie die ik tegenkwam was echt vreemd:
- Geen
glGetError()
s. - Geen fouten, waarschuwingen, niets slechts in de gl debug-uitvoer.
- Alle beweringen die ik deed voor alle slechte situaties werden niet geactiveerd.
-
glClear
wist de buffers met succes I gespecificeerd, maar: -
glDraw*
heeft niets getekend.
Gelukkig heb ik een oplossing gevonden die glViewport
moest instellen. Ik begrijp echter niet helemaal waarom het nodig is om in Ubuntu te tekenen, maar niet nodig in ArchLinux? Het verschil is ook tussen grafische adapters: op archlinux gebruik ik NVIDIA 1060, op Ubuntu gebruik ik geïntegreerde HD Graphics P530 (Skylake GT 2 ).
Als het belangrijk is, gebruik ik SDL2 met opengl 4.4.
Reacties
- Het ' Het is belangrijk dat u zich realiseert dat het besturingssysteem hier niet relevant is; OpenGL wordt door uw GPU-leverancier geïmplementeerd in hun stuurprogrammas, dus de belangrijkste factoren zijn uw GPUs en hun stuurprogrammas. Waar het besturingssysteem interessant kan zijn, is als uw GPU-leverancier verschillende codebases heeft voor verschillende besturingssystemen, maar verder ' geen bruikbare informatie heeft.
- @MaximusMinimus, zou dit het antwoord op de vraag kunnen zijn.
Antwoord
Je hebt al twee goede antwoorden, maar die zijn misschien moeilijk te begrijpen voor een beginner, dus ik “Ik zal je vertellen waarom we functie.
In typische rendering lijkt het misschien geen zin te hebben – je maakt gewoon een venster of rendert een doel en tekent erop, toch? Ik zou zeggen dat meer dan 95% van de apps op die manier werkt.
Maar laten we zeggen dat je een app zoals 3DS MAX schrijft, waarin je je venster hebt opgesplitst in 4 verschillende weergaven. Je herinnert je je huidige splitsingspositie en u beheert muisgebeurtenissen, dus wanneer u de muisaanwijzer over de splitsbalk beweegt, kunt u de muiscursor veranderen in een formaat wijzigen, enz. Wanneer u uw splitsbalk sleept, onthoudt u de nieuwe positie enzovoort.
Als u uw 3D-weergaven wilt renderen, noemt u glViewport met de positie en grootte van uw eerste 3D-subvenster en voert u typische GL-opdrachten uit om hier te tekenen. OpenGL zal de weergave automatisch schalen zodat deze in de gegeven viewport past. U doet hetzelfde voor de rest van je viewports en aan het einde krijg je een venster met een paar verschillende renderings, elk met zijn eigen parameters. Op deze manier kun je zoveel verschillende renderings op een enkel venster / renderdoel hebben als je wilt.
Waarom werkte het niet “op één machine?
GPUs en hun stuurprogrammas hebben veel implementatiedetails en verschillen, dus in het algemeen moet u aan dergelijke problemen wennen. Een eenvoudig voorbeeld: in GLSL-arcering kunt u een 2D-nulvector als volgt maken: vec2(0.0,0.0)
, u kunt ook proberen om één waarde te schrijven: vec2(0.0)
en met deze code behandelen sommige stuurprogrammas het als de vorige versie, terwijl andere fouten retourneren en niets weergeven. Houd er rekening mee dat stuurprogrammas van twee leveranciers meer zullen verschillen van twee versies van hetzelfde stuurprogramma, dus het is een goed idee om uw code te testen op nVidia-, ATI- en Intel-GPUs. In dit geval vermoed ik dat in nVidia-stuurprogrammas, wanneer u Stel de kijk niet zelf in, ze gaan ervan uit dat je het volledige renderdoel wilt gebruiken, terwijl Intel-stuurprogrammas dat niet doen.
Answer
glViewport laat opengl weten hoe de NDC-coördinaten moeten worden toegewezen aan de framebuffer-coördinaten.
Standaard is het ingesteld op de volledige grootte van de schermbuffer. U hoeft het dus alleen aan te roepen wanneer het venster wordt verkleind of u wilt het eigenlijk wijzigen.
Opmerkingen
- Of bij het renderen naar een framebuffer, aangenomen dat de grootte van het venster anders is.
Answer
glViewport specificeert de affiene transformatie van xx en yy van genormaliseerde apparaatcoördinaten naar venstercoördinaten. Let (xnd , ynd) xndynd zijn genormaliseerde apparaatcoördinatie inates. Vervolgens worden de venstercoördinaten (xw, yw) xwyw als volgt berekend:
- “xw = (xnd + 1) (breedte2) + xxw = xnd + 1width2 + x”
- “yw = (ynd + 1) (hoogte2) + yyw = ynd + 1hoogte2 + y”
De breedte en hoogte van het kijkvenster worden stilzwijgend vastgeklemd tot een bereik dat afhangt van de implementatie. Om dit bereik te doorzoeken, roept u glGet aan met het argument “GL_MAX_VIEWPORT_DIMS”
De x- en y-parameters specificeren de linkerbenedenhoek van de viewport in pixels, terwijl width en height de breedte en hoogte van de viewport specificeren