OpenGL (6.) - Co je to MiniGL

Mám pro Vás nový článek. Dnes píši o MiniGL. Ptáte se co je to za standart, jak vznikl, proč vznikl, co to umí atd? Odpovědí na tyto otázky je dnešní článek.

Historie MiniGL

Prostředí bylo originálně vyvinuto pro hru Quake od Id Softu, a je chápáno jako částečná implementace příkazů OpenGL. Ačkoliv MiniGL bylo vyvinuto jen pro hru Quake, programátoři si toto prostředí pohotově přijaly jako druhý standard pro programování v OpenGL pod Win32. MiniGL má jediný účel: dělá hry hratelnými. Proto se i v hardwarovýchi akcelerátorech často implementuje MiniGL místo plného OpenGL.

Každé MiniGL je různé

Je nemožné říci, že MiniGL je všeobecně dobré. Tak jako 3Dfx Woodoo2 podporuje víc akcelerovaných funkcí nežli Diamond Edge 3D, vše dělají jejich ovladače. Předpokládejme, že 3D karta "A" podporuje renderování čar hardwarově a karta "B" nikoliv. Tudíž MiniGL pro kartu "A" by mělo podporovat glBegin(GL_LINE_STRIP) a pro kartu "B" nikoliv. Programátor ovladačů zahrne jen funkce, které budou akcelerovány danou kartou. Všechny ostatní funkce přesměruje jinam. OpenGL pro 3Dfx nepodporuje úplnou sadu OpenGL instrukcí, ale pokusí se simulovat neakcelerované funkce softwarově, tedy ne jako MiniGL.

Nezaměřujme se na verze ovladačů. 3Dfx MiniGL byly vytvořeny v roce 1997 a není nutné vytvářet ty samé ovladače v roce 2002. Ačkoli to vypadá triviálně, je důležité si zapamatovat jednu věc. Jako novější vyspělejší hardware jsou také uvolněny nové MiniGL ovladače, které potenciálně podporují více OpenGL funkcí. To neznamená, že nová karta "HYPER3D 4" bude mít víc funkcí. Novější funkce, které nepracují na starší kartě pravděpodobně padají kvůli softwaru.

Porovnání dvou implementací MiniGL
P

ř

í

k

a

z

y




O

p

e

n

G

L
3dfx Quake 1&2 MiniGL
Rendition MiniGL
  • glAlphaFunc
  • glAreTexturesResident
  • glArrayElementEXT
  • glBegin
  • glBindTexture
  • glBlendFunc
  • glClear
  • glClearColor
  • glClearDepth
  • glColor3f
  • glColor3{f ub}[v]
  • glColor4{f ub}[v]
  • glColorPointerEXT
  • glCullFace
  • glDeleteTextures
  • glDepthFunc
  • glDepthMask
  • glDepthRange
  • glDisable
  • glDisableClientState
  • glDrawArraysEXT
  • glDrawBuffer
  • glDrawElements
  • glEdgeFlagPointerEXT
  • glEnable
  • glEnableClientState
  • glEnd
  • glFinish
  • glFlush
  • glFrontFace
  • glFrustrum
  • glGenTextures
  • glGetError
  • glGetFloatv
  • glGetIntegerv
  • glGetPointervEXT
  • glGetString
  • glIndexPointerEXT
  • glInterleaveArrays
  • glIsTexture
  • glLoadIdentity
  • glLoadMatrixf
  • glMatrixMode
  • glMultMatrix{df}
  • glOrtho
  • glPixelStoref
  • glPixelStorei
  • glPolygonMode
  • glPolygonOffset
  • glPopMatrix
  • glPrioritizeTextures
  • glPushMatrix
  • glReadBuffer
  • glReadPixels
  • glRotated
  • glRotatef
  • glScaled
  • glScalef
  • glScissor
  • glShadeModel
  • glTexCoord2f
  • glTexCoord3fv
  • glTexCoordPointerEXT
  • glTextEnvf
  • glTextEnvfv
  • glTexImage2D
  • glTexParameterf
  • glTexParameterfv
  • glTexSubImage2D
  • glTranslated
  • glTranslatef
  • glViewport
  • glVertex2f[v]
  • glVertex3f[v]
  • glVertexPointerEXT
  • wglCreateContext
  • wglDeleteContext
  • wglGetCurrentContext
  • wglGetCurrentDC
  • wglMakeCurrent
  • wglSetPixelFormat
  • wglSwapBuffers
  • glAlphaFunc
  • glAreTexturesResident
  • glArrayElementEXT
  • glBegin
  • glBindTexture
  • glBlendFunc
  • glClear
  • glClearColor
  • glClearDepth
  • glColor3f
  • glColor3{f ub}[v]
  • glColor4f{f ub}[v]
  • glColorPointerEXT
  • glCullFace
  • glDeleteTextures
  • glDepthFunc
  • glDepthMask
  • glDepthRange
  • glDisable
  • glDisableClientState
  • glDrawArraysEXT
  • glDrawBuffer
  • glDrawElements
  • glEdgeFlagPointerEXT
  • glEnable
  • glEnableClientState
  • glEnd
  • glFinish
  • glFlush
  • glFrontFace
  • glFrustrum
  • glGenTextures
  • glGetError
  • glGetFloatv
  • glGetIntegerv
  • glGetPointervEXT
  • glGetString
  • glIndexPointerEXT
  • glInterleaveArrays
  • glIsTexture
  • glLoadIdentity
  • glLoadMatrixf
  • glMatrixMode
  • glMultMatrix{df}
  • glOrtho
  • glPixelStoref
  • glPixelStorei
  • glPolygonMode
  • glPopMatrix
  • glPrioritizeTextures
  • glPushMatrix
  • glReadBuffer
  • glReadPixels
  • glRotated
  • glRotatef
  • glScaled
  • glScalef
  • glScissor
  • glShadeModel
  • glTexCoord2f[v]
  • glTexCoordPointerEXT
  • glTextEnvf
  • glTextEnvfv
  • glTexImage2D
  • glTexParameterf
  • glTexParameterfv
  • glTexSubImage2D
  • glTranslated
  • glTranslatef
  • glVertex2f[v]
  • glVertex3f[v]
  • glVertexPointerEXT
  • glViewport
  • wglCreateContext
  • wglDeleteContext
  • wglGetCurrentContext
  • wglGetCurrentDC
  • wglMakeCurrent
  • wglSetPixelFormat
  • wglSwapBuffers
Příklazy označené žluťě neexistují v ovladačích MiniGL pro Quake1. Ačkoliv některé jsou pravděpodobně v ovladačích pro Quake2 (jako glFlush & glFinish) a jiné pravděpodobně ne (glScaled), všechny žluté příkazy jsou nepotvrzené.
MiniGL pro Quake1 nepodporuje lines, points, single buffered mode, flat shading a display lists.
Zelené příkazy nejsou potvrzené. Několik naznačení na http://news.rendition.com ukazuje, že nemusí existovat.
Příkazy začínající na wgl jsou specifika Microsoft Windows a jsou primárně určeny na vytváření a uzavírání renderovacích kontextů.

Pěkný seznam, ne? Ale je docela zajímavé, že dokonce ani to není plný seznam OpenGL funkcí. Ale k vytvoření 3D herního enginu je potřeba jen pár příkazů. Mimo několika nastavovacích funkcí, nejdůležitější funkce směřují k glBegin, glEnd, glVertex, glColor. Bez nich by vytváření základních primitiv jako jsou rojúhelníky bylo téměř nemožné.

MiniGL: Nezbytné zlo?

Je opravdu MiniGL zbytečné v roce 2002? Teoreticky ano, prakticky ne. Dovolte mi vysvětlit. S rozšířením 3D akcelerátorů, výrobci hardwaru potřebují poskytnout vývojářům a svým zákazníkům možnost výběru ovladače aby bylo možný zůstat konkurenceschopný. Quake2 nepodporuje jen Direct3D. Zanedbávající podpora pro tak důležitý typ hry může přinést pád novému výrobci 3D hardwaru. Je to ta samá soutěž, která může vést výrobce k prosperujícímu produktům. Od plné podpory OpenGL ze strany ovladačů dělí dlouhá doba k vývoji, výrobci jsou často nuceni vypustit hardware bez plné podpory OpenGL. Je to navzdory jejich schopnosti produkovat plné ovladače.

Jaká je střední cesta? MiniGL. Je daleko snadnější vyvinout a uvolnit částečnou implementaci nežli plnou. Bohužel náhrada MiniGL za plné OpenGL není dobré řešení. Může zabrat měsíce, ne-li roky, vydat plné OpenGL po vydání originálního produktu. Když už je vydán hotový ovladač, často je v beta-verzi (další špatné řešení). Vydání bety není navždy. Až v té době, kdy výrobci hardwaru budou vydávat kompletní produkty, nebo přestane existovat volná soutěž, bude MiniGL vyloučené.

Pravidla pro programování v MiniGL (Platí samozřejmě i pro OpenGL)

1) Nechej OpenGL "otevřené". Používej příkazy běžné pro největší počet 3D karet. Rozšíření OpenGL nejsou standarty, ačkoli v budoucnu být mohou.

2) Ne všechny karty podporují ty samé Video mody a vlastnosti.

3) Piš ve zdrojáku ošetření proti chybám pro karty, které nemají podporu všech vlastností. Nezapomeň na to.

4) Buď si vědom vývojem posledních driverů

5) Neboj se studovat zdrojáky v OpenGL někoho jiného.

6) Dělej zdroják přenostný. Čím více technik závislých na OS použiješ, tím těžší bude přenos zdrojáku.

Vyšlo 27.12.2001, v blogu: 0 1 2 3 4 5 6 7 8

Děkuji, že jste se rozhodl(a) přečíst tento článek. Budu rád i za komentář. Pokud Vás tento článek zaujal a rádi byste jej doporučili ostatním, podpořte mně prosím tím, že věnujete minutku svého času a uděláte mi reklamu na linkuj.cz, vybrali.sme.sk či jagg.cz. Přeji příjemné čtení

Poslední články

Diskuse k blogu

Zatím nikdo nevložil komentář. Chcete být první? Přidání příspěvku
©PC-guru.cz 2000-2008 | Optimalizováno pro 1024*768