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  Čtverec bez textury

Vytvoření jednoduchého objektu. Podrobný popis základních funkcí, potřebných k rozjetí OpegnGL.


Čtverec s texturou  Čtverec s texturou

Otexturování jednoduchého čtverce.


Procházení scénou, ve které rotuje krychle  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  Mlha

Jednoduchý příklad na vytvoření mlhy ve scéně.


Koule bez textury  Koule bez textury

Vytvoření koule pomocí příkazu gluSphere().


Koule potažená texturou  Koule potažená texturou

Vytvoření koule pomocí příkazu gluSphere(). Příkaz gluQuadricTexture() na otexturování.


Kužel bez textury  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  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á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  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  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  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í  Detekce kolizí

Výpočet detekce kolizí s objekty.


Multitexturing  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  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...)  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  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  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í  Míření

Příklad, jak vypočítat souřadnice bodu, kam zrovna ukazuje myš, pomocí funkce 'glReadPixels'..


Průhledný okraj textury  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  Alpha Blending

Průhledný okraj textury se jednodušeji vytvoří pomocí 'Alpha Blendingu'.


Emboss Bumpmapping  Emboss Bumpmapping

Hrbolaté textury.


Lepší detekce kolizí  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  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.


Home