§ Основные положения

С помощью этого шаблона можно рисовать шейдерами на поверхности. Скачать шаблон.

§ main.cc

1#include <glut.cc>
2
3GLUT* glut;
4uint  texture_id, program_id;
5int   clocked;
6
7void glmain(int event) {
8
9    glut->cls();
10    glut->uniform(program_id, "utime", (float)(clocked++) / 50);
11
12    // Ортографическая проекция
13    glut->setcamera(1);
14
15    // Рисование текстуры перед собой
16    glut->draw2d();
17
18    // Запись серии ppm-скриншотов в файлы
19    glut->record();
20}
21
22// Инициализация
23int main(int argc, char *argv[])
24{
25    glut = new GLUT(argc, argv, 25);
26    glut->window("Nickolas Flamele", 1024, 768);
27
28    // Загрузка ресурсов
29    texture_id = glut->texture_xor(256, 256);
30    program_id = glut->load_shader("main.fs");
31
32    // Запуск программы
33    glUseProgram(program_id);
34    glutMainLoop();
35
36    return 0;
37}

§ main.fs

Фрагментный шейдер
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);
50    float m = fbm((gl_TexCoord[0].st)*8.0 + vec2(utime, 0.0));
51
52    gl_FragColor = t + 0.5*(m < 0.5 ? vec4(0.0, 0.0, 1.5*m, 1.0) : vec4(m*0.5, m, m*0.5, 1.));
53}