A játékomat legtöbbször az ArchLinux alatt fejlesztem. Nemrégiben úgy döntöttem, hogy kipróbálom az Ubuntu 16.04-en. Nagyon furcsa volt a helyzet, amellyel találkoztam:

  1. Egyáltalán nem glGetError().
  2. Nincsenek hibák, figyelmeztetések, semmi rossz a gl debug kimenetben.
  3. Az összes állítás, amelyet minden rossz helyzetben megfogalmaztam, nem váltotta ki.
  4. glClear sikeresen törölte az I puffereket meghatározott, de:
  5. glDraw* nem rajzolt semmit.

Szerencsére találtam egy megoldást amelynek meg kellett állítania a glViewport beállítást. Azonban nem értem, miért szükséges az Ubuntuban történő rajzoláshoz, de az ArchLinuxban nem szükséges? A különbség a grafikus adapterek között is van: az archlinuxon az NVIDIA 1060-at, az Ubuntunál az integrált HD Graphics P530-at (Skylake GT 2) használom. ).

Ha fontos, akkor az SDL2-t használom az 4.4-es opengl-lel.

Megjegyzések

  • Ez ' fontos, hogy rájöjjön, hogy az operációs rendszer itt nem releváns; Az OpenGL-t GPU-szállítója hajtja végre illesztőprogramjaiban, ezért a fontos tényezők a GPU-k és azok illesztőprogramjai. Ahol érdekes lehet az operációs rendszer ha a GPU-szolgáltató különböző kódbázisokkal rendelkezik a különböző operációs rendszerek számára, de különben ' nem hasznos információ.
  • @MaximusMinimus ez lehet a válasz a kérdésre.

Válasz

Már két jó választ kapott, de lehet, hogy egy kezdő számára nehéz megérteni őket, ezért én “Megmondom, miért van szükségünk valójában a függvény.

Úgy tűnik, hogy a tipikus renderelésnél nincs értelme – csak létrehozol egy ablakot, vagy renderelsz célt és rajzolsz rá, igaz? Azt mondanám, hogy az alkalmazások 95% -a így működik.

De mondjuk, hogy olyan alkalmazásokat írnak, mint a 3DS MAX, ahol az ablakot 4 különböző megjelenítésre osztja. Emlékszel az aktuális osztott pozíció és kezeli az egéreseményeket, így amikor az osztó sáv fölé viszi az egérmutatót, átméretezheti az egérmutatót, stb. Ha az osztott sávot húzza, akkor emlékszik az új helyzetére és így tovább.

Amikor meg szeretné jeleníteni a 3D-s nézeteket, akkor az első 3D-alablak helyével és méretével kalkulálja meg a glViewportot, és futtasson tipikus GL-parancsokat, hogy itt rajzoljon. Az OpenGL automatikusan méretezi a renderelést, így illeszkedik az adott nézetablakhoz. A nézetablakok többi része, és a végén egy ablak jelenik meg, kevés különféle megjelenítéssel, mindegyik a saját paramétereivel. Így annyi különféle megjelenítést jeleníthet meg egyetlen ablakban / renderelés célpontjában, amennyit csak akar.

Miért nem működött egy gépen?

A GPU-k és illesztőprogramjaik sok a megvalósítás részletei és különbségei, így általában meg kell szoknia az ilyen kérdéseket. Egy egyszerű példa: A GLSL shaderben létrehozhat egy 2D-s nullavektort: vec2(0.0,0.0), megpróbálhat egy értéket is megírni: vec2(0.0) és ezzel a kóddal egyes illesztőprogramok korábbi verzióként fogják kezelni, míg mások hibát adnak vissza, és semmit sem renderelnek. Ne feledje, hogy két gyártó illesztőprogramjai jobban különböznek ugyanazon illesztőprogram két verziójától, ezért jó ötlet a kódot nVidia, ATI és Intel GPU-kon tesztelni. Ebben az esetben gyanítom, hogy az nVidia illesztőprogramokban, amikor ne állítsa be a vieportot egyedül, feltételezik, hogy a teljes renderelési célt szeretné használni, míg az Intel illesztőprogramjai ezt nem teszik meg.

Válasz

A glViewport segítségével az opengl tudja, hogyan kell leképezni az NDC koordinátákat a framebuffer koordinátákra.

Alapértelmezés szerint a képernyő puffer teljes méretére van állítva. Tehát csak akkor kell hívnia, amikor az ablak átméretezésre kerül, vagy valóban módosítani akarja.

Megjegyzések

  • Vagy ha framebufferre renderel, feltéve, hogy az ablak mérete eltér.

Válasz

A glViewport meghatározza xx és yy affin transzformációját normalizált eszközkoordinátákról ablakkoordinátákra. Let (xnd , ynd) xndynd normalizált eszközkoordinátor inates. Ezután az (xw, yw) xwyw ablakkoordinátákat a következőképpen számoljuk ki:

  • “xw = (xnd + 1) (szélesség2) + xxw = xnd + 1⁢szélesség2 + x”
  • “yw = (ynd + 1) (magasság2) + yyw = ynd + 1⁢magasság2 + y”

A nézetablak szélessége és magassága némán rögzítve van a az implementáció. A tartomány lekérdezéséhez hívja meg a glGet szót a “GL_MAX_VIEWPORT_DIMS” argumentummal.

Az x és y paraméterek a nézet bal alsó sarkát képpontokban, míg a szélesség és a magasság a nézet szélességét és magasságát határozzák meg

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük