Jag utvecklar mitt spel mestadels under ArchLinux. Jag har bestämt mig för att prova det på Ubuntu 16.04 nyligen. Situationen jag stötte på var riktigt konstig:
- Nej
glGetError()
s alls. - Inga fel, varningar, något dåligt i gl-felsökningsutgången.
- Alla påståenden som jag gjorde för alla dåliga situationer utlöste inte.
-
glClear
rensade framgångsrikt buffertarna I specificerad, men: -
glDraw*
ritade inte något.
Lyckligtvis har jag hittat en lösning som skulle ställa in glViewport
. Men jag förstår inte riktigt, varför är det nödvändigt att rita i Ubuntu men inte nödvändigt i ArchLinux? Skillnaden är också mellan grafikkort: på archlinux använder jag NVIDIA 1060, på Ubuntu använder jag integrerad HD Graphics P530 (Skylake GT 2 ).
Om det är viktigt använder jag SDL2 med opengl 4.4.
Kommentarer
- Det ' är viktigt för dig att inse att operativsystemet inte är relevant här. OpenGL implementeras av din GPU-leverantör i deras drivrutiner, så de viktigaste faktorerna är dina grafikprocessorer och deras drivrutiner. Där operativsystemet kan vara intressant är om din GPU-leverantör har olika kodbaser för olika operativsystem, men annars är det ' inte användbar information.
- @MaximusMinimus kan detta vara svaret på frågan.
Svar
Du har redan fått två bra svar men det kan vara svårt att förstå för en nybörjare så jag ”Jag berättar varför behöver vi verkligen -funktion.
I typisk återgivning kan det tyckas inte ha någon mening – du skapar bara ett fönster eller gör mål och ritar på det, eller hur? Jag skulle säga att 95+% av apparna fungerar på det sättet.
Men låt oss säga att du skriver en app som 3DS MAX, där du har ditt fönster uppdelat i fyra olika återgivningar. Du kommer ihåg din nuvarande delad position och du hanterar mushändelser, så när du svävar över delningsfältet kan du ändra muspekaren för att ändra storlek på en etc. När du drar delningsfältet kommer du ihåg dess nya position och så vidare.
När du vill återge dina 3D-vyer kalmerar du glViewport med position och storlek på din första 3D-underfönster och kör typiska GL-kommandon för att rita här. OpenGL skalar automatiskt upp rendering så att den passar in i visad visning. Du gör samma sak för resten av dina visningsportar och i slutet får du ett fönster med få olika återgivningar, var och en med sina egna parametrar. På så sätt kan du ha så många olika återgivningar på ett fönster / renderingsmål som du vill.
Varför fungerade det inte på en dator?
GPU: er och deras drivrutiner har mycket implementeringsdetaljer och skillnader så i allmänhet måste du vänja dig vid sådana frågor. Ett enkelt exempel: I GLSL Shader kan du skapa en 2D-nollvektor så här: vec2(0.0,0.0)
, du kan också försöka skriva ett värde: vec2(0.0)
och med den här koden kommer vissa drivrutiner att behandla den som tidigare version medan andra returnerar fel och gör ingenting. Tänk på att drivrutiner från två leverantörer skiljer sig mer från två versioner av samma drivrutin, så det är en bra idé att testa din kod på nVidia, ATI och Intel GPU: er. I detta fall misstänker jag att det i nVidia-drivrutiner, när du ställ inte in vieporten själv, de antar att du vill använda hela renderingsmålet, medan Intel-drivrutiner inte gör det.
Svar
glViewport låter opengl veta hur man kartlägger NDC-koordinaterna till frambufferkoordinaterna.
Som standard är den inställd på skärmbuffertens fulla storlek. Så du behöver bara ringa det när fönstret blir storleksändrad eller vill du faktiskt ändra den.
Kommentarer
- Eller när du gör till en rambuffert, förutsatt att fönstrets storlek är annorlunda. / li>
Svar
glViewport anger affinetransformationen av xx och yy från normaliserade enhetskoordinater till fönsterkoordinater. Låt (xnd , ynd) xndynd vara normaliserad enhetskoord inates. Sedan beräknas fönsterkoordinaterna (xw, yw) xwyw enligt följande:
- ”xw = (xnd + 1) (width2) + xxw = xnd + 1width2 + x”
- ”yw = (ynd + 1) (höjd2) + åå = ynd + 1höjd2 + y”
Visningsportens bredd och höjd kläms tyst till ett område som beror på genomförandet. För att fråga detta intervall, ring glGet med argumentet ”GL_MAX_VIEWPORT_DIMS”
Parameterna x och y anger det nedre vänstra hörnet av visningsområdet i pixlar, medan bredd och höjd anger bredden och höjden på Viewport