Die OpenGL Bibliothek ist Modular aufgebaut. Das Betriebssystem bringt dabei nur einen Teil der Funktionen mit. Der Rest wird vom Grafikkartentreiber bereitgestellt. Je nach Grafikkarte kann es dabei vorkommen, dass auf manchen Systemen andere Funktionen bereitstehen als woanders. Insbesondere AMD, NVIDIA und Intel unterscheiden sich hier.

Damit wir Zugriff auf die neuen Funktionen des Core Profiles bekommen, benötigen wir einen Loader der die Funktionen des aktuellen Systems verfügbar macht. Wir nutzen dazu GLAD. Sie finden eine sehr gute Beschreibung dieses Themas auf LearnOpenGL.

GLAD herunterladen

Der Einfachheit halber habe ich eine aktuelle Version von GLAD für unsere Zwecke erstellt. Laden Sie sich die GLAD.zip herunter uns entpacken Sie sie in Ihren libraries Ordner. Anschließend sollte es bei Ihnen so aussehen:

Makefile anpassen

Damit GLAD verwendet werden kann müssen wir dem Compiler den Pfad zum glad/include Verzeichnis übergeben. Das funktioniert ganz einfach in unserem Makefile durch die folgende Anpassung:

UNAME = $(shell uname -s)
ifeq ($(findstring NT-10,$(UNAME)),NT-10)
    # Windows 10
	INC = -I../libraries/glfw-3.3.4.bin.WIN64/include -I../libraries/glad/include
	LIB = -L../libraries/glfw-3.3.4.bin.WIN64/lib-mingw-w64
	LNK = -l glfw3 -l gdi32 -l opengl32
	OPT = -Wno-incompatible-pointer-types
else ifeq ($(findstring Darwin,$(UNAME)),Darwin)
	# macOS
	INC = -I../libraries/glfw-3.3.4.bin.MACOS/include -I../libraries/glad/include
	LIB = -L../libraries/glfw-3.3.4.bin.MACOS/lib-universal
	LNK = -l glfw3 -framework Cocoa -framework OpenGL -framework IOKit
	OPT = -arch arm64 -arch x86_64
else ifeq ($(findstring Linux,$(UNAME)),Linux)
	# Linux
	INC = -I../libraries/glad/include
	LIB = 
	LNK = -lglfw -lrt -lm -ldl -lGL
	OPT =
endif

Include statements

GLAD Implementierung laden. Hierfür passen wir unsere graphics.cpp wie folgt an.

Fügen Sie als allererstes Statement, bevor GLFW geladen wird, die glad.c Datei ein und entfernen Sie das bisherige define statement:

#include <glad.c>
#define GLFW_INCLUDE_GLEXT
#include <GLFW/glfw3.h>
...

An den Anfang von graphicsStart kommt folgender Code.

bool graphicsStart(Settings props)
{
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    {
        std::cout << "Failed to initialize GLAD" << std::endl;
        return false;
    }
    ...

Sonstige Stellen

Aktuell ist das die einzige notwendige Änderung. Die glad.c bindet implizit die glad.h ein. Wir werden in nachfolgenden Kapiteln sehen, dass wir an machen Stellen manuell ebenfalls die glad.h einbinden müssen.

Hinweis

Es ist normal, dass nach diesem Schritt einige Codezeilen in der graphics.cpp als Fehler angezeigt werden und das Programm nicht mehr kombilierbar ist. Das liegt daran, dass wir nun alles für die neue API vorbereitet haben, aber noch Code aus der alten API aufrufen. Das stellen wir in den folgenden Abschnitten um.