Osnove
========
`OpenGL `__ je knjižnica za risanje 2D in 3D vektorske
grafike. Opengl je trenutno na verziji 4.5, mi pa se bomoučili verzijo 3.x, ki
je že dovolj stara, da jo podpira večina računalnikov, hkrati pa je dovolj
nova, da je že potreben noveji pristop, z razliko od OpenGL 2.
Kako deluje
-----------
Open GL je knjižnica, ki komunicira s storjno opremo na računalniku,
predvsem z grafično kartico, da doseže strojno pospešeno risanje. Zaradi
tega so njeni ukazi na precej nižjem nivoju kot običajno. Najbolj običajna
implementacija OpenGL na Linux-u je Mesa, nVidia pa ima na primer svojo
implementacijo.
Proces si lahko natančneje prebere `tukaj
`__,
za nas pa naj bo dovolj naslednjih 7 korakov, ki opisujejo, kako poteka pot
ptrevarjanja podatkov v risbo.
* seznam točk -- podatki za risbo
* globalno stanje in teksture -- globalni podatki, ki so na voljo shaderju
* vertex shader -- računanje pozicij
* sestavljanje trikotnikov
* rasterizacija -- spreminjanje gladkih robov v piksle
* fragment shader -- dobi slke, ustvari svetlobo, vrne seznam barv (najbolj zahteven korak)
* buffers and blending -- nariše na zaslon, več bufferjev, globina
.. image:: img/pipeline.png
Instalacija
-----------
Potrebovali bomo ``g++``, ``cmake`` in knjižnice za ``opengl``, ``glut`` in
``glew``. Sledili bomo gradivu na `opengl-tutorial.org
`__, kodo pa lahko dobite z
.. code-block:: bash
git clone https://github.com/opengl-tutorials/ogl
Projekt zgradite tko kot ponavadi, če ste v mapi ``ogl/`` naredite ``build/`` folder in poženete
``cmake``. Programe zaganjate preko launch skript, ki jih ustvari ``cmake``.
.. code-block:: bash
mkdir - build/
cd build/
cmake ..
make
./launch-tutorial01_first_window.sh
Prvo okno
---------
.. code-block:: cpp
// Include standard headers
#include
#include
// Include GLEW
#include
// Include GLFW
#include
GLFWwindow* window;
// Include GLM
#include
using namespace glm;
int main(void) {
// Initialise GLFW
if (!glfwInit()) {
fprintf(stderr, "Failed to initialize GLFW\n");
getchar();
return -1;
}
glfwWindowHint(GLFW_SAMPLES, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
// To make MacOS happy; should not be needed
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
// Open a window and create its OpenGL context
window = glfwCreateWindow(1024, 768, "Tutorial 01", NULL, NULL);
if (window == NULL) {
fprintf(stderr,
"Failed to open GLFW window. If you have an Intel GPU, "
"they are not 3.3 compatible. Try the 2.1 "
"version of the tutorials.\n");
getchar();
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
// Initialize GLEW
if (glewInit() != GLEW_OK) {
fprintf(stderr, "Failed to initialize GLEW\n");
getchar();
glfwTerminate();
return -1;
}
// Ensure we can capture the escape key being pressed below
glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);
// Dark blue background
glClearColor(0.0f, 0.0f, 0.4f, 0.0f);
do {
// Clear the screen. It's not mentioned before Tutorial 02,
// but it can cause flickering, so it's there nonetheless.
glClear(GL_COLOR_BUFFER_BIT);
// Draw nothing, see you in tutorial 2 !
// Swap buffers
glfwSwapBuffers(window);
glfwPollEvents();
} // Check if the ESC key was pressed or the window was closed
while (glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS &&
glfwWindowShouldClose(window) == 0);
// Close OpenGL window and terminate GLFW
glfwTerminate();
return 0;
}