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

В этом шаблоне присутствует минимальный набор действий. Генерация текстуры, отрисовка шейдеров. Как и в прошлом коде, можно ходить, двигать камерой.
Скачать шаблон
#include "app.cc"
#include "myapp.cc"

int main() {

    MyApp* app = new MyApp(960, 960);

    GLuint texture_id = app->stubTexture(0);
    GLuint program_id = app->loadShader("example.c");

    while (app->poll()) {

        app->clear();
        app->doControl();
        app->render();
    }

    app->destroy();
}

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

class MyApp : public App {

protected:
public:

    MyApp(int w, int h, const char* title = "OpenGL SDL2 Demo") : App(w, h, title) { };

    // Обработка движения
    void doControl() {

        vec3 move = {0, 0, 0};
        vec3 look = lookCamera();

        // Обработка движений
        if (pressed(SDL_SCANCODE_W)) { move.x += look.x; move.z += look.z; }
        if (pressed(SDL_SCANCODE_S)) { move.x -= look.x; move.z -= look.z; }
        if (pressed(SDL_SCANCODE_A)) { move.x -= look.z; move.z += look.x; }
        if (pressed(SDL_SCANCODE_D)) { move.x += look.z; move.z -= look.x; }

        // Равномерное движение через нормализацию общего вектора
        moveCamera(normalize(move, 0.1));
        updateCamera();
    }

    // Отрисовка сцены
    void render() {

        uniform1f(program_id_latest, "utime", SDL_GetTicks() / 1000.);

        glLoadIdentity();
        glBegin(GL_POLYGON);
        glTexCoord2f(0.0, 0.0);  glVertex3f(-1.0,  1.0, -1.0);
        glTexCoord2f(1.0, 0.0);  glVertex3f( 1.0,  1.0, -1.0);
        glTexCoord2f(1.0, 1.0);  glVertex3f( 1.0, -1.0, -1.0);
        glTexCoord2f(0.0, 1.0);  glVertex3f(-1.0, -1.0, -1.0);
        glEnd();
    }
};

§ Шейдер example.c

#version 120

uniform sampler2D tex;
uniform float utime;

#define OCTAVES 6
#define PI 3.141592

float atan2(float y, float x) {
    return (PI + atan(y, x)) / (2*PI);
}

float random(vec2 st) {
    return fract(sin(dot(st.xy, vec2(12.9898,78.233)))*43758.5453123);
}

float noise(vec2 st) {

    vec2 i = floor(st);
    vec2 f = fract(st);

    float a = random(i);
    float b = random(i + vec2(1.0, 0.0));
    float c = random(i + vec2(0.0, 1.0));
    float d = random(i + vec2(1.0, 1.0));
    vec2  u = f * f * (3.0 - 2.0 * f);

    return mix(a, b, u.x) + (c-a)*u.y*(1.0-u.x) + (d-b)*u.x*u.y;
}

float fbm(vec2 st) {

    float value     = 0.0;
    float amplitude = .5;
    float frequency = 0.;

    for (int i = 0; i < OCTAVES; i++) {
        value += amplitude * noise(st);
        st *= 2.;
        amplitude *= .5;
    }

    return value;
}

void main() {

    vec2  v = gl_TexCoord[0].st;
    vec4  t = texture2D(tex, v + vec2(0.2*utime, 0.0));
    vec2  k = vec2(v.y-0.5, 0.5-v.x);
    float m = fbm((gl_TexCoord[0].st)*5.0 + vec2(utime, 0.0));
    gl_FragColor =  1.0*(m < 0.5 ? vec4(0.0, 0.0, 1.5*m, 1.0) : t);
}
Файл сборки:
all:
	g++ -o main main.cc -lSDL2 -lGL -lGLEW -lm
	./main