§ Код основного файла 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