Jeg utvikler spillet mitt mesteparten av tiden under ArchLinux. Jeg har bestemt meg for å prøve det på Ubuntu 16.04 nylig. Situasjonen jeg kom over var veldig merkelig:
- Nei
glGetError()
i det hele tatt. - Ingen feil, advarsler, noe dårlig i gl-feilsøkingsutgangen.
- Alle påstander som jeg kom med for alle dårlige situasjoner utløste ikke.
-
glClear
fjernet vellykket bufferne jeg spesifisert, men: -
glDraw*
tegnet ikke noe.
Heldigvis har jeg funnet en løsning som skulle sette glViewport
. Men jeg forstår ikke helt, hvorfor er det nødvendig å tegne Ubuntu, men ikke nødvendig i ArchLinux? Forskjellen er også mellom grafikkort: på archlinux bruker jeg NVIDIA 1060, på Ubuntu bruker jeg integrert HD Graphics P530 (Skylake GT 2 ).
Hvis det er viktig, bruker jeg SDL2 med opengl 4.4.
Kommentarer
- Det ' er viktig for deg å innse at operativsystemet ikke er relevant her. OpenGL er implementert av GPU-leverandøren i driverne, så de viktigste faktorene er GPU-ene og driverne. Hvor operativsystemet kan være interessant er hvis GPU-leverandøren din har forskjellige kodebaser for forskjellige operativsystemer, men ellers er det ' ikke nyttig informasjon.
- @MaximusMinimus kan dette være svaret på spørsmålet.
Svar
Du har allerede fått to gode svar, men det kan være vanskelig å forstå for en nybegynner, så jeg «Jeg forteller deg hvorfor trenger vi virkelig -funksjon.
I typisk gjengivelse kan det se ut til å ikke ha noen mening – du lager bare et vindu eller gjengir mål og tegner på det, ikke sant? Jeg vil si at 95+% av appene fungerer på den måten.
Men la oss si at du skriver om en app som 3DS MAX, hvor du har ditt vindu delt i fire forskjellige gjengivelser. Du husker nåværende delte posisjon, og du administrerer mushendelser, så når du holder markøren over delelinjen, kan du endre musemarkøren til å endre størrelse på en osv. Når du drar delelinjen, husker du dens nye posisjon og så videre.
Når du vil gjengi 3D-visningene, kalmer du glViewport med posisjon og størrelse på din første 3D-underrute og kjører typiske GL-kommandoer for å tegne her. OpenGL skalerer automatisk gjengivelsen slik at den passer inn i det gitte visningsområdet. Du gjør det samme for resten av visningsportene dine, og til slutt får du ett vindu med få forskjellige gjengivelser, hver med sine egne parametere. På denne måten kan du ha så mange forskjellige gjengivelser på ett vindu / gjengivelsesmål som du vil.
Hvorfor fungerte det ikke på en maskin?
GPUer og driverne deres har mye implementeringsdetaljer og forskjeller, så generelt må du bli vant til slike problemer. Ett enkelt eksempel: I GLSL shader kan du lage en 2D nullvektor slik: vec2(0.0,0.0)
, du kan også prøve å skrive en verdi: vec2(0.0)
og med denne koden vil noen drivere behandle den som forrige versjon, mens andre vil returnere feil og ikke gi noe. Husk at drivere fra to leverandører vil være mer forskjellige enn to versjoner av samme driver, så det er en god ide å teste koden din på nVidia, ATI og Intel GPUer. I dette tilfellet mistenker jeg at i nVidia-drivere, når du ikke sett visningen selv, de antar at du vil bruke hele gjengivelsesmålet, mens Intel-drivere ikke gjør det.
Svar
glViewport lar opengl vite hvordan man kartlegger NDC-koordinatene til framebufferkoordinatene.
Som standard er den satt til full størrelse på skjermbufferen. Så du trenger bare å ringe den når vinduet blir endret eller du vil endre det.
Kommentarer
- Eller når du gjengir til en frambuffer, forutsatt at størrelsen på vinduet er forskjellig.
Svar
glViewport spesifiserer affinetransformasjonen av xx og yy fra normaliserte enhetskoordinater til vinduskoordinater. La (xnd , ynd) xndynd være normalisert enhetskoord inates. Deretter beregnes vinduskoordinatene (xw, yw) xwyw som følger:
- «xw = (xnd + 1) (width2) + xxw = xnd + 1width2 + x»
- «yw = (ynd + 1) (høyde2) + åå = ynd + 1 høyde2 + y»
Visningsbredden og høyden er stille fastklemt til et område som avhenger av implementeringen. For å spørre om dette området, ring glGet med argumentet «GL_MAX_VIEWPORT_DIMS»
Parametrene x og y angir nedre venstre hjørne av visningsområdet i piksler, mens bredde og høyde angir bredden og høyden på Viewport