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 texturyVytvoření jednoduchého objektu. Podrobný popis základních funkcí, potřebných k rozjetí OpegnGL.
Čtverec s texturouOtexturování jednoduchého čtverce.
Procházení scénou, ve které rotuje krychleVe scéně je jedna krychle statická a druhá rotuje kolem svého středu. Kolem obou krychlí lze volně pobíhat.
MlhaJednoduchý příklad na vytvoření mlhy ve scéně.
Koule bez texturyVytvoření koule pomocí příkazu gluSphere().
Koule potažená texturouVytvoření koule pomocí příkazu gluSphere(). Příkaz gluQuadricTexture() na otexturování.
Kužel bez texturyVytvoření kužele pomocí příkazu gluCylinder(). Příkaz gluDisk() pro vytvoření základny kužele.
Kužel potažený texturouVytvoř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 texturouV 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.
GLDrawElementsPří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 objektemPří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. FullScreenVytvoř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.
MultitexturingPří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é koordinacePro 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ětyV 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 FPSPří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 texturyPř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 BlendingPrůhledný okraj textury se jednodušeji vytvoří pomocí 'Alpha Blendingu'.
Emboss BumpmappingHrbolaté 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ístnostiTrochu 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.