Az első window
Hozzunk létre egy új Xcode projektet és adjuk hozzá a projekthez a glad.c fájt.
#include <glad/glad.h> // always include glad before glfw
#include <GLFW/glfw3.h>
#include <iostream>
Hozzuk létre a main függvényt, amiben inicializálni fogjuk a GLFW window-t.
int main() {
// glfw: initialize and configure
// ------------------------------
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_RESIZABLE, GL_TRUE);
#ifdef __APPLE__
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // only with OS X
#endif
}
A következő lépésben létre hozzuk a window objektumot, mely tárolja és kezeli a window-hoz kötődő adatokat.
GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", nullptr, nullptr);
if (window == nullptr) {
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
GLAD
Mielőtt bármilyen GL függvényt hívnánk, először inicializálnunk kell a GLAD-et. A GLAD operációs rendszer specifikusan meghatározza, az egyes GL függvény pointerek helyét.if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
Viewport
Mielőtt elkezdhetnénk rajzolni, meg kell mondanunk az OpenGL-nek a window méretét, hogy fel tudja építeni a koordinátarendszert. Az első két paraméter a bal alső sarok koordinátái, még az utolső két paraméter a szélesség és a magasság. Ez lehet kisebb, mint a tényleges window méret.glViewport(0, 0, 800, 600);
Ahhoz hogy a window átméretezhető legyen, frissítenünk kell a viewport-ot. Ehhez egy callback függvényt regisztrálunk a window-hoz és ha a user szeretné átméretezni a window-t, akkor a callback függvényen keresztül a viewport átméretezi az ablakot.
void framebuffer_size_callback(GLFWwindow* window, int width, int height) {
glViewport(0, 0, width, height);
}
Ha a window mérete változik, akkor a framebuffer_size_callback függvény meghívódik és a paraméterben kapott window-t a megfelelő méretre változtatja. Ahhoz, hogy ez működjön, a GLFW-n keresztül a window-hoz kell regisztrálnunk a callback függvényt.
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
Render loop
while(!glfwWindowShouldClose(window)) {
processInput(window); // user inputs
// rendering commands here ...
glfwSwapBuffers(window);
glfwPollEvents();
}
Double buffering
Miután kiléptünk a render loop-ból, fel kell szabadítanunk az összes window-hoz tartozó erőforrást. Ezt a glfwTerminate függvény meghívásával tehetjük meg.
Input
void processInput(GLFWwindow *window) {
if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
}
Mostmár készen állunk futtatni a kódot, mely megjeleníti az első ablakunkat. Jelenleg még nem rendereltünk rá semmit, ezért az alap fekete színű window-t látjuk.