§ Код основного файла main.cc

В этом шаблоне присутствует минимальный набор действий. Генерация текстуры, отрисовка шейдеров. Как и в прошлом коде, можно ходить, двигать камерой.
Скачать шаблон
1#include "app.cc"
2#include "myapp.cc"
3
4int main() {
5
6    MyApp* app = new MyApp(960, 960);
7
8    GLuint texture_id = app->stubTexture(0);
9    GLuint program_id = app->loadShader("example.c");
10
11    while (app->poll()) {
12
13        app->clear();
14        app->doControl();
15        app->render();
16    }
17
18    app->destroy();
19}

§ Реализация класса myapp.cc

1class MyApp : public App {
2
3protected:
4public:
5
6    MyApp(int w, int h, const char* title = "OpenGL SDL2 Demo") : App(w, h, title) { };
7
8    // Обработка движения
9    void doControl() {
10
11        vec3 move = {0, 0, 0};
12        vec3 look = lookCamera();
13
14        // Обработка движений
15        if (pressed(SDL_SCANCODE_W)) { move.x += look.x; move.z += look.z; }
16        if (pressed(SDL_SCANCODE_S)) { move.x -= look.x; move.z -= look.z; }
17        if (pressed(SDL_SCANCODE_A)) { move.x -= look.z; move.z += look.x; }
18        if (pressed(SDL_SCANCODE_D)) { move.x += look.z; move.z -= look.x; }
19
20        // Равномерное движение через нормализацию общего вектора
21        moveCamera(normalize(move, 0.1));
22        updateCamera();
23    }
24
25    // Отрисовка сцены
26    void render() {
27
28        uniform1f(program_id_latest, "utime", SDL_GetTicks() / 1000.);
29
30        glLoadIdentity();
31        glBegin(GL_POLYGON);
32        glTexCoord2f(0.0, 0.0);  glVertex3f(-1.0,  1.0, -1.0);
33        glTexCoord2f(1.0, 0.0);  glVertex3f( 1.0,  1.0, -1.0);
34        glTexCoord2f(1.0, 1.0);  glVertex3f( 1.0, -1.0, -1.0);
35        glTexCoord2f(0.0, 1.0);  glVertex3f(-1.0, -1.0, -1.0);
36        glEnd();
37    }
38};

§ Шейдер example.c

1#version 120
2
3uniform sampler2D tex;
4uniform float utime;
5
6#define OCTAVES 6
7#define PI 3.141592
8
9float atan2(float y, float x) {
10    return (PI + atan(y, x)) / (2*PI);
11}
12
13float random(vec2 st) {
14    return fract(sin(dot(st.xy, vec2(12.9898,78.233)))*43758.5453123);
15}
16
17float noise(vec2 st) {
18
19    vec2 i = floor(st);
20    vec2 f = fract(st);
21
22    float a = random(i);
23    float b = random(i + vec2(1.0, 0.0));
24    float c = random(i + vec2(0.0, 1.0));
25    float d = random(i + vec2(1.0, 1.0));
26    vec2  u = f * f * (3.0 - 2.0 * f);
27
28    return mix(a, b, u.x) + (c-a)*u.y*(1.0-u.x) + (d-b)*u.x*u.y;
29}
30
31float fbm(vec2 st) {
32
33    float value     = 0.0;
34    float amplitude = .5;
35    float frequency = 0.;
36
37    for (int i = 0; i < OCTAVES; i++) {
38        value += amplitude * noise(st);
39        st *= 2.;
40        amplitude *= .5;
41    }
42
43    return value;
44}
45
46void main() {
47
48    vec2  v = gl_TexCoord[0].st;
49    vec4  t = texture2D(tex, v + vec2(0.2*utime, 0.0));
50    vec2  k = vec2(v.y-0.5, 0.5-v.x);
51    float m = fbm((gl_TexCoord[0].st)*5.0 + vec2(utime, 0.0));
52    gl_FragColor =  1.0*(m < 0.5 ? vec4(0.0, 0.0, 1.5*m, 1.0) : t);
53}
Файл сборки:
1all:
2	g++ -o main main.cc -lSDL2 -lGL -lGLEW -lm
3	./main