§ Основные положения
С помощью этого шаблона можно рисовать шейдерами на поверхности. Скачать
шаблон.
§ 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
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}