§ Код основного файла 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
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); }#version Файл сборки:
all: g++ -o main main.cc -lSDL2 -lGL -lGLEW -lm ./main