Kehitän pelini suurimman osan ajasta ArchLinuxin alla. Olen päättänyt kokeilla sitä Ubuntu 16.04: ssä äskettäin. Tapaamani tilanne oli todella outo:

  1. Ei lainkaan glGetError().
  2. Ei virheitä, varoituksia, mitään pahaa gl-virheenkorjausulostulossa.
  3. Kaikki väitteet, jotka tein kaikista pahoista tilanteista, eivät laukaistu.
  4. glClear tyhjensivät puskurit I määritetty, mutta:
  5. glDraw* ei piirtänyt mitään.

Onneksi olen löytänyt ratkaisun , jonka oli määrä asettaa glViewport . En kuitenkaan ymmärrä, miksi se on tarpeen piirustukselle Ubuntussa, mutta ei välttämätöntä ArchLinuxissa? Ero on myös grafiikkasovittimien välillä: archlinuxissa käytän NVIDIA 1060: ta, Ubuntussa integroitua HD Graphics P530: ta (Skylake GT 2) ).

Jos se on tärkeää, käytän SDL2: ta ja opengl 4.4: ää.

Kommentit

  • Se ' on tärkeää, että ymmärrät, että käyttöjärjestelmällä ei ole merkitystä tässä; GPU-toimittaja toteuttaa OpenGL: n ohjaimissaan, joten tärkeitä tekijöitä ovat GPU: t ja niiden ohjaimet. Missä käyttöjärjestelmä saattaa olla mielenkiintoinen, on jos GPU-myyjälläsi on eri kooditietokannat eri käyttöjärjestelmille, mutta muuten se ' ei ole hyödyllistä tietoa.
  • @MaximusMinimų tämä voi olla vastaus kysymykseen.

Vastaus

Sinulla on jo kaksi hyvää vastausta, mutta aloittelijoille voi olla vaikea ymmärtää niitä, joten ”Kerron sinulle, miksi todella tarvitsemme -toiminto.

Tyypillisessä renderöinnissä sillä ei ehkä näytä olevan mitään järkeä – luot vain jonkin ikkunan tai piirrät kohteen ja vedät siihen, eikö? Sanon, että yli 95% sovelluksista toimii tällä tavalla.

Mutta sanotaan, että kirjoitat sovelluksen, kuten 3DS MAX, jossa ikkuna on jaettu neljään erilliseen renderöintiin. Muistat nykyinen jaettu sijainti ja hallinnoit hiiren tapahtumia, joten kun viet hiiren jakopalkin päälle, voit muuttaa hiiren kohdistimen koon muuttamiseksi tms. Kun vedät jakopalkkia, muistat sen uuden sijainnin ja niin edelleen.

Kun haluat hahmottaa 3D-näkymän, laske glViewport ensimmäisen 3D-alaikkunasi sijaintiin ja kokoon ja piirrä tähän tyypillisiä GL-komentoja. OpenGL skaalaa hahmonnuksen automaattisesti siten, että se sopii annettuun näkymään. Teet saman myös loput näkymäikkunoistasi ja lopussa saat yhden ikkunan, jossa on vähän erilaista renderöintiä, jokaisella on omat parametrit. Tällä tavoin yhdellä ikkunalla / renderöintikohteella voi olla niin monta erillistä hahmonnusta kuin haluat.

Miksi se ei toiminut yhdellä koneella?

Näytönohjaimissa ja niiden ohjaimissa on paljon toteutuksen yksityiskohdat ja erot, joten sinun on yleensä totuttava tällaisiin asioihin. Yksi yksinkertainen esimerkki: GLSL shaderissa voit luoda 2D-nollavektorin, joka on näin: vec2(0.0,0.0), voit yrittää kirjoittaa myös yhden arvon: vec2(0.0) ja tällä koodilla jotkut ohjaimet käsittelevät sitä edellisenä versiona, kun taas toiset palauttavat virheen eivätkä tee mitään. Muista, että kahden toimittajan ohjaimet eroavat enemmän kuin saman ohjaimen kaksi versiota, joten on hyvä testata koodisi nVidia-, ATI- ja Intel-GPU: lla. Tässä tilanteessa epäilen, että nVidia-ohjaimissa, kun älä aseta vieporttia itse, sillä heidän oletetaan haluavan käyttää koko renderöintikohdetta, kun taas Intel-ohjaimet eivät tee sitä.

Vastaa

glViewport antaa openglille tietää, kuinka NDC-koordinaatit kartoitetaan kehyspuskurikoordinaatteihin.

Oletuksena se on asetettu näytön puskurin täysikokoiseksi. Joten sinun on soitettava sille vain, kun ikkuna muutetaan tai haluat todella muuttaa sitä.

Kommentit

  • Tai kun hahmonnetaan kehyspuskurille, olettaen, että ikkunan koko on erilainen.

vastaus

glViewport määrittää xx: n ja yy: n affiinimuunnoksen normalisoiduista laitekoordinaateista ikkunakoordinaatteihin. Let (xnd , ynd) xndynd on normalisoitu laitteen koordinaatti inaatit. Sitten ikkunakoordinaatit (xw, yw) xwyw lasketaan seuraavasti:

  • ”xw = (xnd + 1) (leveys2) + xxw = xnd + 1⁢leveys2 + x”
  • ”yw = (ynd + 1) (korkeus2) + yyw = ynd + 1⁢korkeus2 + y”

Näkymän leveys ja korkeus kiinnitetään äänettömästi alueeseen, joka riippuu toimeenpano. Voit kysyä tätä aluetta kutsumalla glGet argumentilla ”GL_MAX_VIEWPORT_DIMS”

Parametrit x ja y määrittävät näkymän vasemman alakulman pikseleinä, kun taas leveys ja korkeus määrittävät näkymän leveyden ja korkeuden

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *