Glad vs Glew
Odkazy na moderní OpenGL funkce a rozšíření musíte získávat dynamicky za běhu programu. S tím vám pomohou knihovny Glad nebo Glew. Nejsou to jediné multiplatformní knihovny, které to umí. Glew jsem pro tento tutoriál vybral, protože jej používá www.learnopengl.com, kterým jsem se nechal při psaní tohoto tutoriálu inspirovat. Glad proto, protože se jednodušeji instaluje.
OpenGL Loading Library (OLL)
OpenGL Loading Library je knihovna, která se stará o získání odkazů na moderní OpenGL funkce a rozšíření. Pomocí nich také za běhu programu zjišťujete, jaké rozšíření váš počítač podporuje. V této kapitole proberu dva zástupce — GLEW a GLAD.
Tyto knihovny jsou multiplatformní a tak před vámi skrývají rozdíly získávání odkazů na různých platformách.
V předchozí kapitole jsem používal jen staré OpenGL funkce z verze 1.1,
proto jsem OLL nepotřeboval. V příštím tutoriálu už použiji novější funkce,
například funkci glCreateShader()
pro vytvoření shaderu.
Bez použití OLL program přeložíte i spustíte, ale v okamžiku zavolání
glCreateShader()
skončí chybou Access violation executing location 0x00000000.
Což je přesně to, že glCreateShader
odkazuje na NULL,
protože odkaz na implementaci této funkce nikdo neinicializoval.
V této kapitole ještě OpenGL popisovat nebudu, takže mi prozatím výše popsané chování budete muset věřit.
Protože v tomto tutoriálu nebudu používat žádná rozšíření, použítí OLL se omezí na pouhé vložení hlavičkových souborů a zavolání jedné OLL funkce, která inicializuje odkazy na moderní OpenGL funkce.
Hlavičkové soubory OLL se vkládají před hlavičkové soubory GLFW/Freeglut. Inicializační funkce OLL se naopak musí zavolat až za vytvořením OpenGL kontextu (za vytvořením okna).
GLEW
GLEW je zkratka pro The OpenGL Extension Wrangler Library. A to je asi vše, co potřebujete o GLEW vědět :-).
Pokud vás zajímá, jak GLEW použít pro získávání rozšíření (extensions), podívejte se do dokumentace.
V tomto tutoriálu si vystačíte s vložením hlavičkového souboru a zavoláním funkce glewInit()
.
Vložení hlaviček vypadá takto:
#define GLEW_STATIC
#include <GL/glew.h>
// GLFW
#include <GLFW/glfw3.h>
GLEW_STATIC
říká, že chceme použít statické slinkování GLEW do programu.
Díky tomu nebudete muset šaškovat s glew32.dll knihovnou.
Funkce glewInit()
se zavolá až po vytvoření OpenGL kontextu:
glfwInit();
//...
GLFWwindow* window = glfwCreateWindow(screenWidth, screenHeight, "Hello World", NULL, NULL);
glfwMakeContextCurrent(window);
// Initialize GLEW to setup the OpenGL Function pointers
glewExperimental = GL_TRUE;
glewInit();
Nastavení glewExperimental
na GL_TRUE
zpřístupní nějaké další, nové funkce OpenGL.
A to je vše, víc už se s GLEW nemusíte zabývat.
Použití v Linuxu
Nainstalujte si balíčky glew-devel a glew. A překládat (spolu s glfw) můžete takto:
$ gcc -o glewtest glewtest.c `pkg-config --cflags --libs glfw3 glew`
Použití ve Windows
Stáhněte si binární distribuci z oficiálních stránkek.
Obdobně jako pro GLFW, musíte překladačí říci cestu k adresáři include/, k adresáři s .lib knihovnou (glew-2.1.0\lib\Release\Win32) a přidat do závislostí glew32s.lib (to s znamená static).
GLAD
glad je program, který vám vygeneruje zdrojový kód (hlavičkový soubor), který přidáte ke svému projektu a tím je hotovo. Tento program si můžete přeložit na svém PC a pak použít, ale není to nutné. Stačí jít na stránku webservices a vygenerovat si zmíněné soubory tam.
Ve formuláři na výše zmíněné stránce vyberte Language C/C++, gl Version 3.3, Specification OpenGL, Profile Core. Zbytek nechte jak je a klikněte na tlačítko GENERATE.
Stáhněte si a rozbalte soubor glad.zip. Nastavte cestu pro include/ adresář a přidejte glad.c do svého projektu a máte hotovo. Nemusíte nastavovat žádné knihovny :-). Proto mám GLAD raději než GLEW. Přesto budu ve zbytku tutoriálu používat GLEW. A to proto, protože tutoriál, na který vás na konci seriálu odkáži, také používá GLEW.
Mohli byste si vygenerovat i novější verzi než 3.3, protože novější verze (zatím) neodstranili žádné funkce z 3.3 core.
Ve svém zdrojovém kódu pak přidáte hlavičkový soubor <glad/glad.h>.
#include <GLFW/glfw3.h>
A ve funkci main()
zavoláte, po vytvoření kontextu, funkci gladLoadGL()
.
Překladači gcc/clang předáte cestu k include/ souborům pomocí volby -I
,
takže překlad (spolu s glfw) vypadá nějak takto:
$ clang `pkg-config --cflags glfw3` -o gladtest gladtest.c glad/src/glad.c `pkg-config --libs glfw3` -Iglad/include/ -ldl
Poznámka: Musíte ještě přidat standardní knihovnu dl, kterou glad využívá pro dynamické načtení funkcí.
Pokud jste si vygenerovali zdrojáky pro Core Profile (a ne Compatibility), pak nebudete mít dostupné
staré funkce, jako je glBegin()
atd. Program z předchozí kapitoly tak s těmito funkcemi
ani nepřeložíte (a to je dobře, ať si na ty staré funkce nezvykáte).
Zatímco GLEW se rozhoduje za běhu programu, jakou verzi OpenGL funkcí nahrát, u GLADu je rozhodnuto už v době,
kdy si generujete zdrojové kódy.
Ve Windows je použití také jednoduché. Zase jen musíte nastavit cestu k include/ adresáři. Pak přidáte soubor glad.c do projektua hotovo. A tím je hotova i tato kapitola :-).