OpenGL - matematické knihovny

V této kapitole představím dvě knihovny, které vám mohou pomoci s matematickými výpočty.

Matematické knihovny

Z grafické pipeline vás budou zajímat 3 kroky. Nahrání vertex dat do bufferů, vertex shader a fragment shader.

V prvním kroku musíte nějak uložit data (souřadnice vertexů), případně přepočítat jejich pozici. Matematiku, jak se pozice v 2D/3D prostoru pomocí matic) přepočítává už znáte. Máte už jistě i dostatek znalostí na to, abyste dokázali tuto matematiku převést do algoritmů v jazyku C, ale tuto práci už naštěstí udělal někdo jiný.

Matematické knihovny se postarají o to, jakým způsobem data zapsat a případně jak je transformovat.

glm

První knihovna, kterou vám představím, je OpenGL Mathematics zkráceně glm.

Tato knihovna je speciálně navržena pro práci s OpenGL. Používá např. stejné pojmenování jako GLSL (programovací jazyk pro shadery).

Má však jednu drobnou nevýhodu. Je pouze pro jazyk C++. Ačkoliv je určitě lépe propracovaná než následující knihovna, kterou vám představím, z tohoto důvodu ji v tomto tutoriálu nebudu používat.

U této knihovny stačí jen stáhnout zdrojové soubory a přidat je do projektu. Nemusíte nic překládat (kromě vlastního projektu samozřejmě), ani nastavovat cesty ke knihovnám.

linmath

Já budu v tutoriálu používat jednoduchou knihovnu linmath.h (z projektu glfw/glfw). Jedná se jen o jeden hlavičkový soubor, ve kterém jsou definované všechny funkce a struktury, které budete potřebovat.

Jak se tyto funkce používají, to vám budu průběžně ukazovat během výkladu.

glm vs linmath.h

Abych vám trochu usnadnil přechod od glm k linmath (nebo opačně), ukáži vám několik příkladů řešených pomocí obou knihoven. Jak už jsem psal, glm je v C++. Pokud C++ ještě neznáte, nenechte se vyvést z míry syntaxí, které nerozumíte (např. k čemu jsou ty dvě dvojtečky za glm …). Až se jednou C++ naučíte, bude vám to hned jasné. (A vlastně až pak vám bude toto srovnání k užitku.)

glm linmath
#include "glm/glm.hpp"
#include "glm/gtc/matrix_transform.hpp"
#include "glm/gtc/type_ptr.hpp"
#include "linmath.h"
// inicializace jednickove matice
glm::mat4 transform;
// inicializuje jednickove matice
mat4x4 transform;
mat4x4_identity(transform);
transform = glm::translate(transform, glm::vec3(0.5f, -0.5f, 0.0f));
mat4x4_translate_in_place(transform, 0.5f, -0.5f, 0.0f);
// rotace o 50 stupnu kolem osy Z
glm::rotate(transform, glm::radians(50.0f), glm::vec3(0.0f, 0.0f, 1.0f));
// rotace o 50 stupnu kolem osy Z
mat4x4_rotate_Z(transform, transform, (GLfloat) (50.0f*3.14f/180.0f));
//predani odkazu na data do OpenGL funkce
glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(transform));
//predani odkazu na data do OpenGL funkce
glUniformMatrix4fv(transformLoc, 1, GL_FALSE, (const GLfloat*) transform);
// projekce
glm::mat4 projection = glm::perspective(zoom, (GLfloat)WIDTH / (GLfloat)HEIGHT, 0.1f, 100.0f);
// projekce
mat4x4 projection;
mat4x4_perspective(projection, zoom, (float)WIDTH / (float)HEIGHT, 0.1f, 1000.0f);

Funkcí je samozřejmě mnohem více. Jak můžete vidět, v knihovnách se jmenují funkce různě, a občas dělají trochu něco jiného. Knihovna linmath.h ukládá výsledek do odkazu, který je prvním argumentem funkce, knihovna glm vrací výsledek jako návratovou hodnotu funkce. Obě knihovny ale řeší ty samé problémy, rotace, transformace, projekce atd.

Použití funkcí z linmath.h budu podrobněji popisovat až u příkladů, kde budou potřeba.

Komentář Hlášení chyby
Created: 24.12.2016
Last updated: 24.11.2017
Tato stánka používá ke svému běhu cookies, díky kterým je možné monitorovat, co tu provádíte (ne že bych to bez cookies nezvládl). Také vás tu bude špehovat google analytics. Jestli si myslíte, že je to problém, vypněte si cookies ve vašem prohlížeči, nebo odejděte a už se nevracejte :-). Prohlížením tohoto webu souhlasíte s používáním cookies. Dozvědět se více..