рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП 1k / 4k рдЗрдВрдЯреНрд░реЛ рдмрдирд╛рдирд╛, рднрд╛рдЧ 1

"рд░реВрд╕реА рдордВрдЪ рдкрд░, рд╣рдо рд╕рдм рдкрд░ рдХреБрдЫ рдХрд░рдХреЗ рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдХрд░рддреЗ рд╣реИрдВ," ┬й рдордиреЗ
(рд▓реЛрдХрддрд╛рдВрддреНрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдкрд░ SCRIMERS рдХреА рд╕реНрдерд┐рддрд┐ /forum рд╕реЗ)

рдкрд╛рдВрдЪ рдорд┐рдирдЯ рдХреА рдореЗрдЯрд╛: рдЗрд╕ рдкрд╛рда рдореЗрдВ, рдЖрдк, рдмрд┐рд▓реНрд▓реА рдХреЗ рдмрдЪреНрдЪреЗ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝реЗрдВрдЧреЗ рдХрд┐ рдЕрдкрдирд╛ рд╕рдордп рдХреИрд╕реЗ рд╡реНрдпрддреАрдд рдХрд░рдирд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдореА рдЙрддреНрдкрд╛рдж рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдЕрдиреБрдкрд╛рдд рдФрд░ рдЦрд░реНрдЪ рдХрд┐рдП рдЧрдП рд╕рдордп рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкреНрд░рднрд╛рд╡реА рд╣реИред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо 4kb рдореЗрдВ рдЗрдВрдЯреНрд░реЛ рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рджреБрд╖реНрдЯ рд╣реИрдВ рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд┐рдВрдбреЛрдЬрд╝ рдХреЗ рд▓рд┐рдП рдкреИрд╕реЗ рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рд╢рд╛реЕрд░реНрдб рдХреЗ рд╕рд╛рде рдПрдХ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рд╣реИ рдЬреЛ рдмреНрд░рд╛рдВрдЪрд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдпрд╛ рд╣рдо рд╕рд┐рд░реНрдл apack / crinkler / sonant / 4klang / god-what-there-still-have рд╕реЗ рдорд╛рдирдХ рд╕реЗрдЯ рдирд╣реАрдВ рд▓реЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЕрдЧрд▓реЗ рдПрдХ "рдпрд╣ рд╕рдм рджреЗрдЦреЗрдВ! рдореИрдВ рднреА, рджреВрд░реА рдХреЗ рдЦреЗрддреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдорд╛рд░реНрдЪ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдБ! тАЭрдФрд░ рджрд╕рд┐рдпреЛрдВ рдпрд╛ рд╕реИрдХрдбрд╝реЛрдВ рдПрдХ рд╣реА рд▓реЛрдЧреЛрдВ рдХреЗ рдмреАрдЪ рдЦреЛ рдЬрд╛рддреЗ рд╣реИрдВ ред рдЦреИрд░, рдпрд╛ рд╣рдо рд╕рд┐рд░реНрдл рдХрд┐рд╕реА рднреА рддрд░рд╣ рджрд┐рдЦрд╛рд╡рд╛ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд▓рдбрд╝рдХрд┐рдпрд╛рдВ рдЖрдЦрд┐рд░рдХрд╛рд░ рд╣рдорд╛рд░реА рдУрд░ рдзреНрдпрд╛рди рджреЗрдВрдЧреАред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдордЬреЛрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛рд░реНрдб рдХреЗ рд╕рд╛рде рдмрд╕ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд▓рд┐рдирдХреНрд╕ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рд╕рднреА рдпреБрд╡рд╛ рдЖрдЧреЗ рд╣реИрдВред рдЕрдм рдЗрди рд╕рднреА рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЖрдХрд╛рд░ 1024 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░реЗрдЧрд╛ред





рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ X11 рдФрд░ OpenGL рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рдХрдо рд╕реЗ рдХрдо рд░рдХреНрдд рд╕реЗ рдХреИрд╕реЗ рдЖрд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
  1. рд╕реАрдзреЗ Xlib, GLX рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ
    +: рдпрд╣ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЧрд╛рд░рдВрдЯреА рд╣реИ;
    - - 11 рдХреЙрд▓ рд╕рд┐рд░реНрдл рдЬреАрдПрд▓ рд╕рдВрджрд░реНрдн рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП
  2. рднрд░рдорд╛рд░
    +: рдЬреАрдПрд▓ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП 4-5 рдХрд╛рд░реНрдп;
    - - рд╣рд░ рдЬрдЧрд╣ рд╕реЗ рдмрд╣реБрдд рджреВрд░
  3. рдПрд╕рдбреАрдПрд▓
    +: рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП 2 рдХреЙрд▓, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдирдХ, рд▓рдЧрднрдЧ рд╣рд░ рдЬрдЧрд╣ рд╣реИрдВ;
    - - рдпрд╣ рдЕрдЪрд╛рдирдХ рдХрд╣реАрдВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЕрдиреБрдХреВрд▓рддрд╛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХреНрд░реЙрд▓ рдХрд░ рд╕рдХрддреА рд╣реИ
  4. рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдкрд░ рд╣рдереМрдбрд╝рд╛ рдорд╛рд░реЗрдВ рдФрд░ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рд╕рдм рдХреБрдЫ рдХрд░реЗрдВ
    +: рдЖрдк рдбрд╛рдпрдирд╛рдорд┐рдХ рд▓рд┐рдВрдХ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдлрд╡рд╛рд╣реЛрдВ (viznut?) рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, CL рд╕рдВрджрд░реНрдн рдХреЛ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ 300 рдмрд╛рдЗрдЯреНрд╕
    - - рдЬрдм рддрдХ рдЖрдк рдЗрд╕рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛ рд▓реЗрддреЗ рддрдм рддрдХ рдЖрдк рдЦреБрдж рд╣реА рд╕рдм рдХреБрдЫ рддреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ


рдмрд╛рдж рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдирд┐рд╕реНрд╕рдВрджреЗрд╣ рд╕рдмрд╕реЗ рдХрдард┐рди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЕрдм рддрдХ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рддрдкрд╕реНрдпрд╛ рдХрд░реЗрдВрдЧреЗред

рдЖрдЗрдП gcc рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░реЗрдВ рдФрд░ рд╣рд░ рдЙрд╕ рдЪреАрдЬрд╝ рдХреЛ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ, рдЬрд┐рд╕рд╕реЗ рд╣рдореЗрдВ рдирд┐рдкрдЯрдирд╛ рд╣реИред рдЖрдЗрдП рд╣рдорд╛рд░реЗ рдЗрдВрдЯреНрд░рд╛ рдХреЗ рдХрдВрдХрд╛рд▓ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВ - рдУрдкрдирдЬреАрдПрд▓ рд╕рдВрджрд░реНрдн рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВ, рд╡реНрдпреВрдкреЛрд░реНрдЯ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ рдФрд░ рдПрдХ рд╕рд░рд▓ рдИрд╡реЗрдВрдЯрд▓реВрдк рдЪрд▓рд╛рдПрдВ рдЬреЛ рдХрд┐рд╕реА рднреА рдХреБрдВрдЬреА рдХреЛ рджрдмрд╛рдП рдЬрд╛рдиреЗ рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддрд╛ рд╣реИ:

#include <SDL.h> #define W 1280 #define H 720 #define FULLSCREEN 0//SDL_FULLSCREEN int main(int argc, char* argv) { SDL_Init(SDL_INIT_VIDEO); SDL_SetVideoMode(W, H, 32, SDL_OPENGL | FULLSCREEN); glViewport(0, 0, W, H); SDL_Event e; for(;;) { SDL_PollEvent(&e); if (e.type == SDL_KEYDOWN) break; // -    SDL_GL_SwapBuffers(); } SDL_Quit(); return 0; } 


(рдпрд╣рд╛рдБ рдПрдХ рдЪреМрдХрд╕ рдкрд╛рдардХ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ:рдореИрдВ рдЬрд╡рд╛рдм рджреВрдВрдЧрд╛: рдХреНрдпрд╛ рдпрд╣ рдЕрднреА рднреА рд╣реЛрдЧрд╛! "

рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ:

(рдиреЛрдЯ 1: рдмрд╛рдЗрдирд░реА рдбрд┐рд╕реНрдЯреНрд░реАрдмреНрдпреВрд╢рди рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП: рдЖрдкрдХреЛ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ (рдЬреАрд╕реАрд╕реА), рдУрдкрдирдЬреАрдПрд▓ рдХреЗ рд▓рд┐рдП рд╣реЗрдбрд░ рдлрд╛рдЗрд▓реЗрдВ (рдЖрдорддреМрд░ рдкрд░ рдореАрд╕рд╛ рдореЗрдВ) рдФрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрд╕рдбреАрдПрд▓ рд╕рдВрд╕реНрдХрд░рдг (libsdl-dev, рдпрд╛ рдРрд╕рд╛ рд╣реА рдХреБрдЫ) рдЪрд╛рд╣рд┐рдПред)
(Note2: -m32 рдзреНрд╡рдЬ рдХреЗрд╡рд▓ 64-рдмрд┐рдЯ рд╡рд┐рддрд░рдг рдХреЗ рдорд╛рд▓рд┐рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ)

 cc -m32 -o intro intro.c `pkg-config --libs --cflags sdl` -lGL 


рдФрд░ рд╣рдо рднрдпрднреАрдд рд╣реЛрдВрдЧреЗ рдХрд┐ рдЗрддрдирд╛ рд╕рд░рд▓ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рдЧрднрдЧ 7kb рд▓реЗрддрд╛ рд╣реИ!

рд╣рдо рд╢рд▓рдЬрдо рдХреЛ рдХрд╛рдЯрддреЗ рд╣реИрдВ, рд╣рдо рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ crt рдФрд░ рдЕрдиреНрдп рдмреБрд░реНрдЬреБрдЖ рдЬреНрдпрд╛рджрддрд┐рдпреЛрдВ рдиреЗ рдЕрдВрдЬреАрд░ рдХреЛ рдирд╣реАрдВ рдЫреЛрдбрд╝рд╛, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдЙрдиреНрд╣реЗрдВ рдХрд╛рдЯ рджрд┐рдпрд╛ред
рдЖрд╡рд╢реНрдпрдХ:

 #include <SDL.h> #define W 1280 #define H 720 #define FULLSCREEN 0//SDL_FULLSCREEN void _start() { SDL_Init(SDL_INIT_VIDEO); SDL_SetVideoMode(W, H, 32, SDL_OPENGL | FULLSCREEN); glViewport(0, 0, W, H); SDL_Event e; for(;;) { SDL_PollEvent(&e); if (e.type == SDL_KEYDOWN) break; // -    SDL_GL_SwapBuffers(); } SDL_Quit(); asm ( \ "xor %eax,%eax\n" \ "inc %eax\n" \ "int $0x80\n" \ ); } 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рдЬреАрд╕реАрд╕реА рд╡рд┐рдХрд▓реНрдк -nostartfiles рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рддреБрд░рдВрдд рдмрд╛рдЗрдирд░реА рдкрдЯреНрдЯреА:
 cc -m32 -o intro intro.c `pkg-config --libs --cflags sdl` -lGL -Os -s -nostartfiles 


рд╣рдореЗрдВ ~ 4.7 рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рдорд┐рд▓рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ ~ 30% рдмреЗрд╣рддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдмрд╣реБрдд рдХреБрдЫ рд╣реИред
рдЙрдкрдпреЛрдЧреА рдХреЛрдб рдХреЗ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ, рдмрд┐рд▓реНрд▓реА рднреА рд░реЛрдИ, рдФрд░ рд▓рдЧрднрдЧ рд╕рднреА рдЬрдЧрд╣ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдпреЛрдЧрд┐рдиреА-рд╣реЗрдбрд░ рдХрд╛ рдХрдмреНрдЬрд╛ рд╣реИред рд╣реЗрдбрд░ рд╕реЗ рдмреЗрдХрд╛рд░рддрд╛ рдХреЛ рдХрд╛рдЯрдиреЗ рдХреЗ рд▓рд┐рдП, рдПрд▓реНрдлрд┐рдХрд░реНрд╕ рд╕реЗрдЯ (http://www.muppetlabs.com/~breadbox/software/elfkickers.html) рд╕реЗ рдПрдХ sstrip рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╣реИ:
 sstrip intro 

рдпрд╣ рд╣рдореЗрдВ рд▓рдЧрднрдЧ 600 рдФрд░ рдмрд╛рдЗрдЯреНрд╕ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЦрддрд░рдирд╛рдХ рд░реВрдк рд╕реЗ рдмрд╛рдЗрдирд░реА рдХрд╛ рдЖрдХрд╛рд░ 4kb рддрдХ рд▓рд╛рддрд╛ рд╣реИред рдФрд░ рд╡рд╣ рдЕрднреА рднреА рдХреБрдЫ рднреА рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИред

рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╣рдо рдкрд░реЗрд╢рд╛рди рд╣реИрдВ, рд╣рдо рд╣реЗрдХреНрд╕ рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдЕрдкрдиреЗ рдмрд╛рдЗрдирд░реА рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рд╢реВрдиреНрдп рдкрд╛рддреЗ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗред рдФрд░ рд╢реВрдиреНрдп рдФрд░ рдЕрдиреНрдп рдкрд╣рдЪрд╛рди рд╕реЗ рд▓рдбрд╝рдиреЗ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХреМрди рд╣реИ?
рд╕рд╣реА:
 cat intro | 7z a dummy -tGZip -mx=9 -si -so > intro.gz 

(рдиреЛрдЯ 1-рд╕реНрдкрд╖реНрдЯрддрд╛: рдЖрдкрдХреЛ p7zip рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред p7zip рдЗрддрдирд╛ рдЬрдЯрд┐рд▓ рдХреНрдпреЛрдВ рд╣реИ? рдХреНрдпреЛрдВрдХрд┐: (a) gzip рдФрд░ рдЕрдиреНрдп рдХреБрдЫ рдкреНрд░рддрд┐рд╢рдд рдЦрд░рд╛рдм рдХрд░ рджреЗрддреЗ рд╣реИрдВ, (b) рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХреА рддрд░рд╣, рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд╕реЗ gz-рд╣реИрдбрд░ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ)
(рдиреЛрдЯ 2: рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ gzip рдХреНрдпреЛрдВ рд╣реИ, рдФрд░ рдирд╣реАрдВ, рдмреЛрд▓реЛ, bzip2! рдХреНрдпреЛрдВрдХрд┐ рдЖрдиреБрднрд╡рд┐рдХ рд░реВрдк рд╕реЗ p7zip -tGZip рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЖрдЬрдорд╛рдИ рдЧрдИ рд╣рд░ рдЪреАрдЬ рд╕реЗ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЬрд┐рд╕рдХреЗ рдЕрдирдкреИрдХ рд╣рд░ рдЬрдЧрд╣ рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рд╣реЛрддреЗ рд╣реИрдВред
intro.gz рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рдЧрднрдЧ 650 рдмрд╛рдЗрдЯреНрд╕ рд▓реЗрддрд╛ рд╣реИ! рдпрд╣ рдХреЗрд╡рд▓ рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ unpack_header рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ:
 T=/tmp/i;tail -n+2 $0|zcat>$T;chmod +x $T;$T;rm $T;exit 

рдФрд░ рдЗрд╕ рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдХреЛ рд╣рдорд╛рд░реЗ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдЪрд┐рдкрдХрд╛рдПрдБ:
 cat unpack_header intro.gz > intro.sh 

рдЪрд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЬреЛ рд╣рдореЗрдВ рдорд┐рд▓рд╛ рдЙрд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ:
 chmod +x intro.sh ./intro.sh 

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдкреЗрдиреА рдмрд╛рдЗрдЯ рдХреЗ рд╕рд╛рде рдпреЗ 700 рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЦрд╛рд▓реА рдЦрд┐рдбрд╝рдХреА рдмрдирд╛рддреЗ рд╣реИрдВред
рдЬреЛ рд╣рдордиреЗ рдЕрднреА рдХрд┐рдпрд╛ рд╣реИ рдЙрд╕реЗ рдЧрдЬрд╝рд┐рдк-рдбреНрд░реЙрдкрд┐рдВрдЧ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреА рдЬрдбрд╝реЗрдВ рдХреИрдм-рдбреНрд░реЙрдкрд┐рдВрдЧ рд╡рд┐рдзрд┐ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рддреА рд╣реИрдВ, рдЬреЛ рдЕрдкрдиреЗ рд╕рдордп рдореЗрдВ рд▓реЛрдХрдкреНрд░рд┐рдп рдереА (рдХреНрд░рд┐рдВрдХрд▓рд░ рдФрд░ рджреЛрд╕реНрддреЛрдВ рдХреЗ рдпреБрдЧ рд╕реЗ рдкрд╣рд▓реЗ), рдЬреЛ рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рд╣реА рдХрд╛рдо рдХрд░рддреА рдереА, рд▓реЗрдХрд┐рди рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рддрд╣рддред

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╢реЗрд╖ 300 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдХрд┐рддрдирд╛ рдЖрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкрд░рдВрдкрд░рд╛рдЧрдд рд░реВрдк рд╕реЗ, рд╣рдо рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ: рд╕рдВрдкреВрд░реНрдг рд╕реНрдХреНрд░реАрди рдкрд░ glRect рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдкреНрд░рдкрддреНрд░ рд░рдВрдЧ = f (x, y) рдХреЗ рд╡рд┐рд╢реЗрд╖ рд╢реЗрдб рджреНрд╡рд╛рд░рд╛ рдЦреАрдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 #include <SDL.h> #include <GL/gl.h> #define W 1280 #define H 720 #define FULLSCREEN 0//SDL_FULLSCREEN char* shader_vtx[] = { "varying vec4 p;" "void main(){gl_Position=p=gl_Vertex;}" }; char* shader_frg[] = { "varying vec4 p;" "void main(){" "gl_FragColor=p;" "}" }; void shader(char** src, int type, int p) { int s = glCreateShader(type); glShaderSource(s, 1, src, 0); glCompileShader(s); glAttachShader(p, s); } void _start() { SDL_Init(SDL_INIT_VIDEO); SDL_SetVideoMode(W, H, 32, SDL_OPENGL | FULLSCREEN); glViewport(0, 0, W, H); int p = glCreateProgram(); shader(shader_vtx, GL_VERTEX_SHADER, p); shader(shader_frg, GL_FRAGMENT_SHADER, p); glLinkProgram(p); glUseProgram(p); SDL_Event e; for(;;) { SDL_PollEvent(&e); if (e.type == SDL_KEYDOWN) break; glRecti(-1,-1,1,1); SDL_GL_SwapBuffers(); } SDL_Quit(); asm ( \ "xor %eax,%eax\n" \ "inc %eax\n" \ "int $0x80\n" \ ); } 

рдХреЛрдб рдХрд╛рдлреА рдкрд╛рд░рджрд░реНрд╢реА рд╣реИ, рд╕рд┐рд╡рд╛рдп, рд╢рд╛рдпрдж, рдЕрд▓рдЧ-рдЕрд▓рдЧ vec4 рдкреА рдХреЗ рд╕рд╛рде, рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдХреНрд░реАрди рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рд╡рд░реНрдЯрд┐рд╢рд░ shader рд╕реЗ рдЯреБрдХрдбрд╝рд╛ рдПрдХ рддрдХ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рд╡рд┐рдВрдбреЛ рдХреЗ рднреМрддрд┐рдХ рдЖрдХрд╛рд░ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рдмрдирд╛рддрд╛ рд╣реИред

рддреЛ, рдЪрд▓реЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ:
 cc -m32 -o intro intro.c `pkg-config --libs --cflags sdl` -lGL -Os -s -nostartfiles && \ sstrip intro && \ cat intro | 7z a dummy -tGZip -mx=9 -si -so > intro.gz && \ cat unpack_header intro.gz > intro.sh && chmod +x intro.sh && \ wc -c intro.sh && \ ./intro.sh 


рд╣рдо рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рддрд┐рдкрд╣рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрддрд┐рд░рд┐рдХреНрдд 50 рдмрд╛рдЗрдЯ рдкрдХрдбрд╝ рдЪреБрдХреЗ рд╣реИрдВ, рдФрд░ рдЕрдиреБрдордд рдПрдХ рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рдХреНрд░реЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред "рддреБрдо рдЕрдм рднреА рдореЗрд░реЗ рд╕рд╛рде рдирд╛рдЪреЛрдЧреЗ, рддреБрдо рдирд╛рдЪреЛрдЧреЗ!", рд╣рдо рд╕реЛрдЪрддреЗ рд╣реИрдВ, рдФрд░ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдмреЙрд╕ рд╕реЗ рдЖрдЦрд┐рд░реА рдЪрд╛рд▓ рдорд┐рд▓рддреА рд╣реИ: рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓реЛрдб рдХрд░рдирд╛:
 #include <dlfcn.h> #include <SDL.h> #include <GL/gl.h> #define W 1280 #define H 720 #define FULLSCREEN 0//SDL_FULLSCREEN const char* shader_vtx[] = { "varying vec4 p;" "void main(){gl_Position=p=gl_Vertex;}" }; const char* shader_frg[] = { "varying vec4 p;" "void main(){" "gl_FragColor=p;" "}" }; const char dl_nm[] = "libSDL-1.2.so.0\0" "SDL_Init\0" "SDL_SetVideoMode\0" "SDL_PollEvent\0" "SDL_GL_SwapBuffers\0" "SDL_Quit\0" "\0" "libGL.so.1\0" "glViewport\0" "glCreateProgram\0" "glLinkProgram\0" "glUseProgram\0" "glCreateShader\0" "glShaderSource\0" "glCompileShader\0" "glAttachShader\0" "glRecti\0\0\0"; // : #define _SDL_Init ((void(*)(int))dl_ptr[0]) #define _SDL_SetVideoMode ((void(*)(int,int,int,int))dl_ptr[1]) #define _SDL_PollEvent ((void(*)(void*))dl_ptr[2]) #define _SDL_GL_SwapBuffers ((void(*)())dl_ptr[3]) #define _SDL_Quit ((void(*)())dl_ptr[4]) #define _glViewport ((void(*)(int,int,int,int))dl_ptr[5]) #define _glCreateProgram ((int(*)())dl_ptr[6]) #define _glLinkProgram ((void(*)(int))dl_ptr[7]) #define _glUseProgram ((void(*)(int))dl_ptr[8]) #define _glCreateShader ((int(*)(int))dl_ptr[9]) #define _glShaderSource ((void(*)(int,int,const char**,int))dl_ptr[10]) #define _glCompileShader ((void(*)(int))dl_ptr[11]) #define _glAttachShader ((void(*)(int,int))dl_ptr[12]) #define _glRecti ((void(*)(int,int,int,int))dl_ptr[13]) void* dl_ptr[14]; //  -    void dl() { const char* pn = dl_nm; void** pp = dl_ptr; for(;;) //    { void* f = dlopen(pn, RTLD_LAZY); //  for(;;) //    precious  { while(*(pn++) != 0); //         if (*pn == 0) break; //    ,     so' *pp++ = dlsym(f, pn); } //     if (*++pn == 0) break; //   -  ,  ,   } } void shader(const char** src, int type, int p) { int s = _glCreateShader(type); _glShaderSource(s, 1, src, 0); _glCompileShader(s); _glAttachShader(p, s); } void _start() { dl(); _SDL_Init(SDL_INIT_VIDEO); _SDL_SetVideoMode(W, H, 32, SDL_OPENGL | FULLSCREEN); _glViewport(0, 0, W, H); int p = _glCreateProgram(); shader(shader_vtx, GL_VERTEX_SHADER, p); shader(shader_frg, GL_FRAGMENT_SHADER, p); _glLinkProgram(p); _glUseProgram(p); SDL_Event e; for(;;) { _SDL_PollEvent(&e); if (e.type == SDL_KEYDOWN) break; _glRecti(-1,-1,1,1); _SDL_GL_SwapBuffers(); } _SDL_Quit(); asm ( \ "xor %eax,%eax\n" \ "inc %eax\n" \ "int $0x80\n" \ ); } 

рд╡рд╛рд╣! рдЕрдВрдд рдореЗрдВ, рдпрд╣ рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рдорд╛рдВрд╕рд▓ рдФрд░ рднреНрд░рдорд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ!
рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ: рд╣рдо рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╢реВрдиреНрдп рд╡рд┐рднрд╛рдЬрдХреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрдЬрд╛рдп рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рд╕рдм рдбреЗрдЯрд╛ рдПрд▓реНрдл рд╣реЗрдбрд░ рдХреЗ рдЕрдВрджрд░ рдмрд╣реБрдд рдвреАрд▓реЗ рдФрд░ рдЦрд░рд╛рдм рдкреИрдХ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдпред рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рдХрд╛рд░реНрдп рдХреЗрд╡рд▓ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рд▓реЛрдб рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╣реА рд╕рдордп рдкрд░ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдЙрдЪрд┐рдд рд╕реАрдорд╛ рддрдХ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ - рд╡реЗ рдЕрднреА рднреА рд╕реНрдЯреИрдХ рдкрд░ 4 рдмрд╛рдЗрдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдФрд░ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рд╡реИрд╕реЗ рднреА, рд╕рдореНрдореЗрд▓рди рджреНрд╡рд╛рд░рд╛, рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди, eax рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЗрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ, рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рдХреЗрд╡рд▓ рд╕реНрд▓реЛрдм рдФрд░ рд▓рддреНрддрд╛ рд╣реИ рдЬреЛ рдХреЛрдИ рднреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИред
рдмрд┐рд▓реНрдб рдЯреАрдо рдореЗрдВ, рд╣рдо рдмрд╛рдЗрдирд░реА рдХреЛ рд▓рдХреНрд╖реНрдп рддрдХ рд╕реНрдЯреНрд░рд┐рдк рдХрд░реЗрдВрдЧреЗ, рдЗрд╕реЗ рдХреЗрд╡рд▓ ld-linux.so рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд╕рд╛рде рдЫреЛрдбрд╝рдХрд░ (рдПрдХ рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдбрд╛рдпрдиреЗрдорд┐рдХ рд▓рд┐рдВрдХрд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ), рдФрд░ libld.so, рдЬрд┐рд╕рдореЗрдВ dlben рдФрд░ dlsym рдлрд╝рдВрдХреНрд╢рди рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
 cc -Wall -m32 -c intro.c `pkg-config --cflags sdl` -Os -nostartfiles && \ ld -melf_i386 -dynamic-linker /lib32/ld-linux.so.2 -ldl intro.o -o intro && \ sstrip intro && \ cat intro | 7z a dummy -tGZip -mx=9 -si -so > intro.gz && \ cat unpack_header intro.gz > intro.sh && chmod +x intro.sh && \ wc -c intro.sh && \ ./intro.sh 

899 рдмрд╛рдЗрдЯреНрд╕! рд╡рд╕рд╛ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реМ рдЕрдзрд┐рдХ рдХреНрд░рд┐рдПрдЯрд┐рд╡рд┐рдЯреА тДв рдХреЗ рд╕рд╛рде рд╕реНрдХреЛрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ!

рдЖрдк рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рдлрд┐рдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреБрд░рд╛рдиреА рд╕реБрд░рдВрдЧ рдкреНрд░рднрд╛рд╡, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рд╣рд░ рдХреЛрдИ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреАрдорд╛рд░ рд╣реИ (рд╣рд╛рдБ, рдКрдкрд░ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рд╕реЗ рдПрдХ рд╣реИ)ред
рдкрд╣рд▓реЗ рд╣рдореЗрдВ рд╕рдордп рдХреЛ рдЫрд╛рдпрд╛ рдореЗрдВ рдЦреАрдВрдЪрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рд╣рдо gluniform рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ nerds рдХреА рддрд░рд╣ рдпрд╣ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рддрд░реАрдХреЗ рд╕реЗ рдХрд░реЗрдВрдЧреЗ, рдЬреИрд╕реЗ рдХрд┐ рдпрд╛рд░реНрдб рд▓рдбрд╝рдХреЗ:
 float t = _SDL_GetTicks() / 1000. + 1.; _glRectf(-t, -t, t, t); 

рдкреНрд░рдХреНрд╖реЗрдк рдореЗрдВ рд╕рдордп рди рдЧрдВрд╡рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╢реАрд░реНрд╖рд╛рд╕рди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕реЗ рдереЛрдбрд╝реА рдорджрдж рдЪрд╛рд╣рд┐рдП:
 const char* shader_vtx[] = { "varying vec4 p;" "void main(){gl_Position=p=gl_Vertex;pz=length(p.xy);}" }; 

рдпрд╣реА рд╣реИ, рдЕрдм pz рдШрдЯрдХ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд░реНрддрдорд╛рди рд╕рдордп рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдЗрд╕реЗ рд╕реБрд░рдВрдЧ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред
рд╕реБрд░рдВрдЧ рдмрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдХреЛрдг рд╣реИ = рдЕрддрди (px, py) рдФрд░ рдПрдХ рджреЗрд╣рд╛рддреА рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп: z = 1. / рд▓рдВрдмрд╛рдИ (p.xy), рдпрд╣ рдХреЗрд╡рд▓ рдХреБрдЫ рдмрдирд╛рд╡рдЯ рдХрд╛ рд░рдВрдЧ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИ = f (a, z, t) )ред рдмреЗрд╢рдХ, рдЖрдк рдЦреБрдж рдХреЛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рд╕рдордп рднреА рдорд┐рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рдм рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдмрдХрд╡рд╛рд╕ nafig рдХреЛ рдкрдврд╝рдирд╛ рдЫреЛрдбрд╝ рджреЗрдВ рдФрд░ рдЯрд╣рд▓рдиреЗ рдЬрд╛рдПрдВ - рдЗрд╕ рддрд░рд╣ рдХреЗ рднрдпрд╛рдирдХ рд╕реНрдкрд╖реНрдЯ рдореМрд╕рдо, рдмрдбрд╝реЗ рд╕реНрд╡рдЪреНрдЫ рд╕реНрдиреЛрдбреНрд░рд┐рдлрд╝реНрд╕ рдФрд░ рдПрдХ рджреЗрд╡рджрд╛рд░ рдХреЗ рдЬрдВрдЧрд▓ рд╕реЗ рдкрддреНрдерд░ рдХрд╛ рдШрд░ рд╣реИ!



рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкреНрд░рд╣рд╛рд░ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:
 #include <dlfcn.h> #include <SDL.h> #include <GL/gl.h> #define W 1280 #define H 720 #define FULLSCREEN 0//SDL_FULLSCREEN const char* shader_vtx[] = { "varying vec4 p;" "void main(){gl_Position=p=gl_Vertex;pz=length(p.xy);}" }; const char* shader_frg[] = { "varying vec4 p;" "void main(){" "float " "z=1./length(p.xy)," "a=atan(px,py)+sin(p.z+z);" "gl_FragColor=" "2.*abs(.2*sin(pz*3.+z*3.)+sin(p.z+a*4.)*p.xyxx*sin(vec4(z,a,a,a)))+(z-1.)*.1;" "}" }; const char dl_nm[] = "libSDL-1.2.so.0\0" "SDL_Init\0" "SDL_SetVideoMode\0" "SDL_PollEvent\0" "SDL_GL_SwapBuffers\0" "SDL_GetTicks\0" "SDL_Quit\0" "\0" "libGL.so.1\0" "glViewport\0" "glCreateProgram\0" "glLinkProgram\0" "glUseProgram\0" "glCreateShader\0" "glShaderSource\0" "glCompileShader\0" "glAttachShader\0" "glRectf\0\0\0"; // : #define _SDL_Init ((void(*)(int))dl_ptr[0]) #define _SDL_SetVideoMode ((void(*)(int,int,int,int))dl_ptr[1]) #define _SDL_PollEvent ((void(*)(void*))dl_ptr[2]) #define _SDL_GL_SwapBuffers ((void(*)())dl_ptr[3]) #define _SDL_GetTicks ((unsigned(*)())dl_ptr[4]) #define _SDL_Quit ((void(*)())dl_ptr[5]) #define _glViewport ((void(*)(int,int,int,int))dl_ptr[6]) #define _glCreateProgram ((int(*)())dl_ptr[7]) #define _glLinkProgram ((void(*)(int))dl_ptr[8]) #define _glUseProgram ((void(*)(int))dl_ptr[9]) #define _glCreateShader ((int(*)(int))dl_ptr[10]) #define _glShaderSource ((void(*)(int,int,const char**,int))dl_ptr[11]) #define _glCompileShader ((void(*)(int))dl_ptr[12]) #define _glAttachShader ((void(*)(int,int))dl_ptr[13]) #define _glRectf ((void(*)(float,float,float,float))dl_ptr[14]) static void* dl_ptr[15]; //  -    static void dl() __attribute__((always_inline)); static void dl() { const char* pn = dl_nm; void** pp = dl_ptr; for(;;) //    { void* f = dlopen(pn, RTLD_LAZY); //  for(;;) //    precious  { while(*(pn++) != 0); //         if (*pn == 0) break; //    ,     so' *pp++ = dlsym(f, pn); } //     if (*++pn == 0) break; //   -  ,  ,   } } static void shader(const char** src, int type, int p) __attribute__((always_inline)); static void shader(const char** src, int type, int p) { int s = _glCreateShader(type); _glShaderSource(s, 1, src, 0); _glCompileShader(s); _glAttachShader(p, s); } void _start() { dl(); _SDL_Init(SDL_INIT_VIDEO); _SDL_SetVideoMode(W, H, 32, SDL_OPENGL | FULLSCREEN); _glViewport(0, 0, W, H); int p = _glCreateProgram(); shader(shader_vtx, GL_VERTEX_SHADER, p); shader(shader_frg, GL_FRAGMENT_SHADER, p); _glLinkProgram(p); _glUseProgram(p); SDL_Event e; for(;;) { _SDL_PollEvent(&e); if (e.type == SDL_KEYDOWN) break; float t = _SDL_GetTicks() / 400. + 1.; _glRectf(-t, -t, t, t); _SDL_GL_SwapBuffers(); } _SDL_Quit(); asm ( \ "xor %eax,%eax\n" \ "inc %eax\n" \ "int $0x80\n" \ ); } 


рдпрд╣ nyashka рдореЗрд░реЗ gcc-4.5.3 рдореЗрдВ рдмрд┐рд▓рдХреБрд▓ 1024 рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рдареАрдХ рд╣реИ, рд╣рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ, рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рдмреЗрд╣рддрд░ рдпрд╛ рдХрдард┐рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓рдЧрднрдЧ рдЦреБрдж рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ, рд╣рдо рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рд╢реНрд░реЗрдгреА рдХреЗ рдЕрдиреНрдп рд▓реЛрдЧ рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ ...

рдФрд░ рд╣рдо рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрдЪрд╛ рд╣реИ, рдЖрдкрдХреЛ рдЕрд╕реЗрдВрдмрд▓рд░ рдореЗрдВ рдЪрдврд╝рдирд╛ рд╣реЛрдЧрд╛ред
рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдЧрд▓реА рдмрд╛рд░ рдХрд┐рд╕реА рддрд░рд╣ред

Source: https://habr.com/ru/post/In134551/


All Articles