OpenGL Tutorialy
| C++ Builder | Delphi nové | Delphi starší |
! ! ! ! ! ! ! ! ! Upozornění ! ! ! ! ! ! ! ! !
Zjistil jsem, že rendering pomocí TTimer je nejpomalejší. Pomocí vláken Thread běží plynule, ale případné zprávy od klávesnice či myši můžou být zpožděny. Nejlepší je použít funkci PeekMessage() viz. Nehe zdroják v Delphi. Ano, mohl bych všechny tutorialy opravit, ale doufám že pochopíte, že by to byla pěkně zdlouhavá práce. Proto jsem se rozhodl, že vám tyto nové poznatky jen zdělím a energii, kterou bych vložil do opravy všech starých tutorialů vložím do tutorialů nových. Děkuji.
Kwan
Čtverec bez textury
Vytvoření jednoduchého objektu. Podrobný popis základních funkcí, potřebných k rozjetí OpegnGL.
Čtverec s texturou
Otexturování jednoduchého čtverce.
Procházení scénou, ve které rotuje krychle
Ve scéně je jedna krychle statická a druhá rotuje kolem svého středu. Kolem obou krychlí lze volně pobíhat.
Mlha
Jednoduchý příklad na vytvoření mlhy ve scéně.
Koule bez textury
Vytvoření koule pomocí příkazu gluSphere().
Koule potažená texturou
Vytvoření koule pomocí příkazu gluSphere(). Příkaz gluQuadricTexture() na otexturování.
Kužel bez textury
Vytvoření kužele pomocí příkazu gluCylinder(). Příkaz gluDisk() pro vytvoření základny kužele.
Kužel potažený texturou
Vytvoření kužele pomocí příkazu gluCylinder(). Příkaz gluDisk() pro vytvoření základny kužele. Příkaz gluQuadricTexture() na otexturování.
Válec s průhlednou texturou
V tomto příkladě poprvé používám místo časovače (Timer) funkci BeginThread(nil, 0, Tread, nil, 0, ThreadID); Tato funkce vytvoří oddělený proces. Docílí se tím plynulého a rychlejšího překreslování scény. Dále jsem použil novou knihovnu OpenGL.pas a příkaz s ní spojený glBindTexture(GL_TEXTURE_2D, 0); který by se také měla podílet na rychlejším překreslování. Válec jsem vytvořil pomocí příkazu gluCylinder() a dvě základny válce pomocí příkazu gluDisk(). Průhlednost válce jsem docílil příkazem glEnable(GL_BLEND) , který zapíná průhlednost a příkazem glBlendFunc(GL_ONE, GL_ONE), pomocí kterého se nastavují vlastnosti průhlednosti.
GLDrawElements
Příkaz GLDrawElements() načítá předem vytvořená pole barev, texturových koordinací, pozic bodů a z těchto hodnot renderuje objekty. Pole hodnot se mohou načíst jen jednou a potom se v nekonečné smyčce volá příkaz GLDrawElements(), čímž se docílí rychlejšího překreslování scény, než u klasické metody renderování přes příkaz glBegin() .... glEnd. Pro zajímavost, renderování pomocí příkazu GLDrawElements() se údajně používá v Quake3.
glClipPlane - Řez objektem
Příklad jak oříznout kužel, pomocí příkazu glClipPlane().
Ořezávání scény, která je za kamerou, pomocí příkazu 'glClipPlane'. Příkaz 'glDrawElements' - urychlení překreslování scény. FullScreen
Vytvořil jsem jednoduchou místnost, pomocí příkazu glDrawElements(). Příkaz glClipPlane() ořezává scénu, která se nachází za kamerou. Když kamerou otočíte směrem nahoru 'klávesa Home', nebo dolu 'klávesa End' ,můžete se přesvědčit, jestli se opravdu ořezává vše za kamerou. Prográmek jde přepnout 'Entrem' do 'FullScreenu 640*480 16b'.
Detekce kolizí
Výpočet detekce kolizí s objekty.
Multitexturing
Příklad, jak načíst dvě textury do jednoho objektu. Textury načítá z obrázků, které jsou ve formátu 'jpg' . Pozor!!! Pokud vaše grafárna neumí multitexturing, příkládek hodí error.
Výpočet koule, normálových vektorů, texturové koordinace
Pro výpočet koule nepoužívám příkaz gluSphere(), ale napsal jsem algoritmus pro výpočet všech bodů. Příklad zobrazí kouli v bodech příkazem glBegin(GL_Points), v čarách příkazem glBegin(GL_Lines) , nebo v trojúhleníkách příkazem glBegin(GL_Triangles). Dále příklad obsahuje algoritmus pro výpočet normálových vektorů, aby včechny plochy koule byly správně vystínovaný. Další algoritmus je pro výpočet texturové koordinace, aby se textura roztáhla rovnoměrně po celé kouli.
Načítání 3D objektů ze souboru (*.dxf) (Autocad, 3D MAX...)
Příklad, jak načíst 3D objekt ze souboru (*.dxf). DXF je textový formát (Autocad, 3D MAX...), který je rozdělen na různé sekce a skupiny. Tento prográmek umí číst pouze sekci (ENTITIES) a skupinu (3DFACE).
Lesklé předměty
V příkladu používám 'Sphere Environment Mapping' a 'Multitexturing'. Jedna textura je textura předmětu (mramor), druhá textura je textura okolí, která pomocí 'Sphere Environment Mapping'u je stále na stejném místě, to znamená, že nereaguje na pohyb předmětu a vytváří dojem lesklého povrchu.
3D Fonty, výpočet FPS
Příklad, jak vytvořit 3d text a jak tento text potáhnout texturou. Navíc jsem přidal výpočet FPS. Výsledná hodnota FPS se generuje do 3d textu.
Míření
Příklad, jak vypočítat souřadnice bodu, kam zrovna ukazuje myš, pomocí funkce 'glReadPixels'..
Průhledný okraj textury
Při standartním blendingu je průhledná jedna barva (třeba černá) a ostatní barvy jsou průhledné podle toho, kolik obsahují černé barvy. V některých případech však potřebujeme, aby byl průhledný jen okraj a vše ostatní neprůhledný.
Alpha Blending
Průhledný okraj textury se jednodušeji vytvoří pomocí 'Alpha Blendingu'.
Emboss Bumpmapping
Hrbolaté textury.
Lepší detekce kolizí
Detekci kolizí, kterou jsem řešil v jednom předešlém tutorialu není moc dokonalá. Proto jsem se rozhodl najít lepší řešení.
Kolize koule a kamery se stěnama místnosti
Trochu jsem zdokonalil předešlý tutorial na detekci kolizí. Vytvořil jsem jednoduchou místnost se sloupem. V místnosti skáče koule a odráží se od stěn. Přidal jsem i detekci kolize kamery se stěnama. Aplikace běží v odděleném procesu 'Thread', který jsem trochu vylepšil.