Svou hru vyvíjím většinu času pod ArchLinuxem. Nedávno jsem se rozhodl to zkusit na Ubuntu 16.04. Situace, na kterou jsem narazil, byla opravdu podivná:

  1. Ne glGetError() s vůbec.
  2. Žádné chyby, varování, nic špatného ve výstupu ladění gl.
  3. Všechna tvrzení, která jsem uvedl pro všechny špatné situace, se nespustil.
  4. glClear úspěšně vymazal vyrovnávací paměti, které jsem uvedeno, ale:
  5. glDraw* nic nenakreslil.

Naštěstí jsem našel řešení který měl nastavit glViewport . Nerozumím však, proč je to nutné pro kreslení v Ubuntu, ale není to nutné v ArchLinuxu? Rozdíl je také mezi grafickými adaptéry: na archlinuxu používám NVIDIA 1060, na Ubuntu používám integrovanou HD Graphics P530 (Skylake GT 2 ).

Pokud je to důležité, používám SDL2 s openglem 4.4.

Komentáře

  • It ' je důležité si uvědomit, že OS zde není relevantní; OpenGL implementuje váš prodejce GPU do svých ovladačů, takže důležitými faktory jsou vaše GPU a jejich ovladače. Kde by mohl být OS zajímavý, pokud má váš prodejce grafických procesorů různé základny kódů pro různé operační systémy, ale jinak to není ' užitečné informace.
  • @MaximusMinimus, mohlo by to být odpovědí na otázku.

Odpověď

Už jste dostali dvě dobré odpovědi, ale pro začátečníka může být těžké je pochopit, takže „Řeknu vám, proč opravdu potřebujeme funkce.

Při typickém vykreslování se může zdát, že to nemá smysl – stačí vytvořit nějaké okno nebo vykreslit cíl a nakreslit ho, že? Řekl bych, že 95% aplikací funguje tímto způsobem.

Ale řekněme, že píšete aplikaci, jako je 3DS MAX, kde máte okno rozdělené na 4 různá vykreslení. aktuální rozdělená pozice a spravujete události myši, takže když umístíte ukazatel myši nad rozdělený pruh, můžete změnit kurzor myši na změnu velikosti jednoho atd. Když přetáhnete rozdělený pruh, zapamatujete si jeho novou pozici atd.

Pokud chcete vykreslit vaše 3D pohledy, vyřiďte glViewport s pozicí a velikostí vašeho prvního 3D podokna a spusťte zde typické příkazy GL. OpenGL automaticky změní měřítko vykreslení tak, aby se vešlo do daného výřezu. Totéž uděláte pro zbytek výřezů a na konci získáte jedno okno s několika různými vykresleními, každé s vlastními parametry. Tímto způsobem můžete mít tolik odlišných vykreslení v jednom okně / cíli vykreslení, kolik chcete.

Proč to nefungovalo na jednom počítači?

GPU a jejich ovladače mají spoustu podrobnosti implementace a rozdíly, takže si obecně musíte na takové problémy zvyknout. Jeden jednoduchý příklad: Ve shaderu GLSL můžete vytvořit 2D nulový vektor takto: vec2(0.0,0.0), můžete zkusit napsat také jednu hodnotu: vec2(0.0) a s tímto kódem některé ovladače budou s ním zacházet jako s předchozí verzí, zatímco jiné vrátí chybu a nevykreslí nic. Mějte na paměti, že ovladače od dvou prodejců se budou lišit více než dvě verze stejného ovladače, takže je dobré otestovat váš kód na GPU nVidia, ATI a Intel. V tomto případě mám podezření, že v ovladačích nVidia, když nenastavujte si sami sebe, předpokládají, že chcete použít celý cíl vykreslení, zatímco ovladače Intel to nedělají.

Odpovědět

glViewport umožňuje opengl vědět, jak mapovat souřadnice NDC na souřadnice framebufferu.

Ve výchozím nastavení je nastavena na plnou velikost vyrovnávací paměti obrazovky. Takže jej musíte zavolat pouze v případě, že okno dostane změnu velikosti, nebo ji skutečně chcete změnit.

Komentáře

  • Nebo při vykreslování do framebufferu za předpokladu, že velikost okna je jiná.

Odpověď

glViewport určuje afinní transformaci xx a yy z normalizovaných souřadnic zařízení na souřadnice okna. Nechť (xnd , ynd) xndynd být normalizovaný coord zařízení inates. Pak se souřadnice okna (xw, yw) xwyw vypočítají takto:

  • „xw = (xnd + 1) (width2) + xxw = xnd + 1⁢width2 + x“
  • „yw = (ynd + 1) (height2) + yyw = ynd + 1⁢height2 + y“

Šířka a výška výřezu jsou tiše upnuty na rozsah, který závisí na implementace. Chcete-li zadat dotaz na tento rozsah, zavolejte glGet s argumentem „GL_MAX_VIEWPORT_DIMS“

Parametry x a y určují levý dolní roh výřezu v pixelech, zatímco šířka a výška určují šířku a výšku výřezu

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *