Jeg udvikler mit spil det meste af tiden under ArchLinux. Jeg har besluttet at prøve det på Ubuntu 16.04 for nylig. Den situation, jeg stødte på, var virkelig underlig:
- Nej
glGetError()
overhovedet. - Ingen fejl, advarsler, noget dårligt i gl-fejlfindingsoutputtet.
- Alle påstande, som jeg fremsatte for alle dårlige situationer, udløste ikke.
-
glClear
ryddede med succes bufferne I angivet, men: -
glDraw*
tegnede ikke noget.
Heldigvis har jeg fundet en løsning som skulle indstille glViewport
. Jeg forstår dog ikke helt, hvorfor er det nødvendigt at tegne Ubuntu, men ikke nødvendigt i ArchLinux? Forskellen er også mellem grafikkort: på archlinux bruger jeg NVIDIA 1060, på Ubuntu bruger jeg integreret HD Graphics P530 (Skylake GT 2
Hvis det er vigtigt, bruger jeg SDL2 med opengl 4.4.
Kommentarer
- Det ' er vigtigt for dig at indse, at operativsystemet ikke er relevant her; OpenGL implementeres af din GPU-leverandør i deres drivere, så de vigtige faktorer er dine GPUer og deres drivere. Hvor operativsystemet kan være interessant er hvis din GPU-leverandør har forskellige codebaser til forskellige OSer, men ellers er det ' ikke nyttige oplysninger.
- @MaximusMinimus kan dette være svaret på spørgsmålet.
Svar
Du har allerede to gode svar, men det kan være svært at forstå for en nybegynder, så jeg “Jeg fortæller dig, hvorfor har vi virkelig brug for -funktion.
I typisk gengivelse ser det ud til at ikke have nogen mening – du opretter bare et vindue eller gengiver mål og trækker på det, ikke? Jeg vil sige, at 95 +% af apps fungerer på den måde.
Men lad os sige, at du skriver en app som 3DS MAX, hvor du har dit vindue opdelt i 4 forskellige gengivelser. Du husker din nuværende splitposition, og du administrerer musebegivenheder, så når du holder markøren over splitbjælken, kan du ændre musemarkøren til at ændre størrelsen på en osv. Når du trækker din splitbjælke, husker du dens nye position osv.
Når du vil gengive dine 3D-visninger, kalder du glViewport med position og størrelse på din første 3D-undervindue og kører typiske GL-kommandoer for at tegne her. OpenGL skalerer automatisk gengivelsen, så den passer ind i den givne visningsport. Du gør det samme for resten af dine visningsporte, og i slutningen får du et vindue med få forskellige gengivelser, hver med sine egne parametre. På denne måde kan du have så mange forskellige gengivelser på enkelt vindue / gengivelsesmål, som du vil.
Hvorfor fungerede det ikke på en maskine?
GPUer og deres drivere har meget implementeringsdetaljer og forskelle, så generelt skal du vænne dig til sådanne problemer. Et simpelt eksempel: I GLSL shader kan du oprette en 2D-nulvektor sådan: vec2(0.0,0.0)
, du kan også prøve at skrive en værdi: vec2(0.0)
og med denne kode vil nogle drivere behandle den som tidligere version, mens andre returnerer fejl og gengiver intet. Husk, at drivere fra to leverandører adskiller sig mere end to versioner af den samme driver, så det er en god ide at teste din kode på nVidia, ATI og Intel GPUer. I dette tilfælde mistænker jeg, at i nVidia-drivere, når du ikke indstille vieporten selv, de antager, at du vil bruge hele gengivelsesmål, mens Intel-drivere ikke gør det.
Svar
glViewport lader opengl vide, hvordan man kortlægger NDC-koordinaterne til framebuffer-koordinaterne.
Som standard er det indstillet til den fulde størrelse af skærmbufferen. Så du behøver kun at ringe til det, når vinduet bliver ændret, eller du vil faktisk ændre det.
Kommentarer
- Eller når du gengiver til en framebuffer, forudsat at størrelsen på vinduet er anderledes.
Svar
glViewport angiver affinetransformationen af xx og yy fra normaliserede enhedskoordinater til vinduskoordinater. Lad (xnd , ynd) xndynd være normaliseret enhedskoord inates. Derefter beregnes vindueskoordinaterne (xw, yw) xwyw som følger:
- “xw = (xnd + 1) (width2) + xxw = xnd + 1width2 + x”
- “yw = (ynd + 1) (height2) + yyw = ynd + 1height2 + y”
Viewport bredde og højde er lydløst fastspændt til et område, der afhænger af implementeringen. For at forespørge om dette interval skal du ringe til glGet med argumentet “GL_MAX_VIEWPORT_DIMS”
Parameterne x og y angiver det nederste venstre hjørne af visningsporten i pixels, mens bredde og højde angiver bredden og højden af Viewport