
рдУрдкрдирдЬреАрдПрд▓ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдЕрд╡рдХрд╛рд╢ рдкрд░ рдордЬрд╝реЗрджрд╛рд░, рдореИрдВрдиреЗ рдпрд╣ рд╕реАрдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреИрд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рдП, рд╕рд┐рд╕реНрдЯрдо рдирд╣реАрдВред Googled glReadPixels рдмрд╣реБрдд рдЬрд▓реНрджреА, рд▓реЗрдХрд┐рди рддрд╕реНрд╡реАрд░ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рдереАред рдореБрдЭреЗ рдкреБрд░рд╛рдиреЗ рджрд┐рдиреЛрдВ рдХреА рдпрд╛рдж рдЖ рдЧрдИ рдЬрдм рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрдкрдиреЗ рдХреЛрдб рдХреЗ рд╕рд╛рде bmp рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣реЗрдЬрд╛ рдерд╛, tga рдореЗрдВ рд╕реЗрд╡ рдлрдВрдХреНрд╢рди рдкрд╛рдпрд╛, рдореИрдВрдиреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдЗрди рд╕рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕рд╛рдЗрдХрд┐рд▓ рдЬреИрд╕реА рдЧрдВрдз рдЖрддреА рд╣реИ рдФрд░ рдПрдХ рд╡реНрдпрд╛рдкрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкрд╕рдВрдж libpng рдкрд░ рдЧрд┐рд░ рдЧрдИред
рдЖрдЧреЗ рд░реЗрдХ рдЧрдпрд╛ред
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд░реВрд╕реА рдореЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдХреЛрдИ рд╡рд┐рд╡рд░рдг рдирд╣реАрдВ рд╣реИ (рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ рдЕрдм рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ), рдФрд░ рдЕрдВрдЧреНрд░реЗрдЬреА рдкреНрд░рд▓реЗрдЦрди рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЗ рд╕реЗ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд╛ рд╕рд░рд▓рддрдо рдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг рднреА рдирд╣реАрдВ рд╣реИред
рдиреАрдЪреЗ рдореИрдВ рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ libpng рд╕рдмрд╕реЗ рд╕рд░рд▓ рдорд╛рдорд▓реЗ рдореЗрдВ рдЫрд╡рд┐ рдХреЛ рдмрдЪрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
#include <png.h>
рдЬрд┐рд╕ рдлрд╝рдВрдХреНрд╢рди / рдкрджреНрдзрддрд┐ рдореЗрдВ рд╣рдо рдЫрд╡рд┐ рдХреЛ рд╕рд╣реЗрдЬреЗрдВрдЧреЗ, рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЦреЛрд▓реЗрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд╕рд╣реЗрдЬреЗрдВрдЧреЗ рдФрд░ png рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдПрдВрдЧреЗред
void Renderer::screenshoot(const std::string& name) { FILE *fp = fopen(name.c_str(), "wb"); if (!fp) { return; } png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr); if (!png_ptr) { goto close_file; }
рдЕрдм рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреАрдПрдирдЬреА, рдХреЙрд▓ рд╕реЗрдЯрдЬрдореНрдк, рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдПрдХ рдврд╛рдВрдЪрд╛ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдПрдХ рдлрд╛рдЗрд▓ рдореЗрдВ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
png_infop png_info; if (!(png_info = png_create_info_struct(png_ptr))) { goto destroy_write; } if (setjmp(png_jmpbuf(png_ptr))) { goto destroy_write; } png_init_io(png_ptr, fp);
рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдЫрд╡рд┐ рдкреИрд░рд╛рдореАрдЯрд░ (рдЖрдХрд╛рд░, рд░рдВрдЧреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛, рд░рдВрдЧ рдЪреИрдирд▓ рдкреНрд░рддрд┐ рдмрд┐рдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛, рдЗрдВрдЯрд░рд▓реЗрд╕рд┐рдВрдЧ рдФрд░ рдХрдореНрдкреНрд░реЗрд╢рди) рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рдЫрд╡рд┐ рдХреА рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реЗрдЦрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫрд╡рд┐ рдФрд░ рд╕рдВрдХреЗрдд рдХрд╛ рдПрдХ рд╕рд░рдгреА рднреА рдмрдирд╛рдПрдВред
рдпрд╣рд╛рдВ рд░реЗрдХ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред
рд░реЗрдХ рдирдВрдмрд░ 1: glReadPixels рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдЫрд╡рд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рд▓рд╛рдЗрдиреЗрдВ рдиреАрдЪреЗ рд╕реЗ рдКрдкрд░ рддрдХ рдЬрд╛рддреА рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдорддреМрд░ рдкрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рд╣рдорд╛рд░рд╛ рдорддрд▓рдм рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рд╣реЛрддрд╛ рд╣реИред
рд░реЗрдХ рдирдВрдмрд░ 2: рдпрджрд┐ рдЖрдк glReadPixels рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдо RGBA рд░рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдо рдЙрдиреНрд╣реЗрдВ ARGB рдХреНрд░рдо рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдПрдХ рдШрдВрдЯреЗ рдХрд╛ рд╕рдордп рд▓рдЧрд╛, рдЬрд┐рд╕рдХреЗ рджреМрд░рд╛рди рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ рд░рдВрдЧреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХреНрдпреЛрдВ рдирд╣реАрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ред
рд╣рдо рдбреЗрдЯрд╛ рд╕рд░рдгреА рдШреЛрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ libpng рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╣реЛрдЧрд╛, рдФрд░ argb_data рд╕рд░рдгреА, рдЬрд┐рд╕рдореЗрдВ OpenGL рд╕реЗ рдбреЗрдЯрд╛ рд╣реЛрдЧрд╛, рдареАрдХ рд╣реИ, рдЪрд▓реЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд╕рд░рдгреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рднреВрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред
png_set_IHDR(png_ptr, png_info, width, height, 0, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); unsigned char data[width*height*3], argb_data[width*height*4]; unsigned char *rows[height]; render(); glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, argb_data); for (int i = 0; i < height; ++i) { rows[height - i - 1] = data + (i*width*3); for (int j = 0; j < width; ++j) { int i1 = (i*width+j)*3; int i2 = (i*width+j)*4; data[i1++] = argb_data[++i2]; data[i1++] = argb_data[++i2]; data[i1++] = argb_data[++i2]; } }
рдЕрдм рдпрд╣ рдЖрдкрдХреЗ рдКрдкрд░ рд╣реИ рдХрд┐ рдЖрдк рдЫрд╡рд┐ рдХреЛ рдмрдЪрд╛рдПрдВ, рдЗрдирдкреБрдЯ рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдВ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдВред
png_set_rows(png_ptr, png_info, rows); png_write_png(png_ptr, png_info, PNG_TRANSFORM_IDENTITY, nullptr); png_write_end(png_ptr, png_info); destroy_write: png_destroy_write_struct(&png_str, nullptr); close_file: fclose(fp); }
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ, рдЖрдк рдЫрд╡рд┐ рдХреЛ png рдореЗрдВ рд╕рд╣реЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдордд рд╕реЛрдЪреЛ рдХрд┐ рдпрд╣ рд╕рдм рдХреБрдЫ рд╣реИ рдЬреЛ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред рдЖрдк рдмрдЪрдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкрд╛рд▓рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд╝рд┐рд▓реНрдЯрд░ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрдВрдЯрд░рд▓рд╛рдХрд┐рдВрдЧ, рд╕рдВрдкреАрдбрд╝рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ... рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдореВрд▓
рджрд╕реНрддрд╛рд╡реЗрдЬ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпреБрдкреАрдбреАред GlReadPixels рдФрд░ рдкрдВрдХреНрддрд┐ рдХреНрд░рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд▓рд┐рдП
MrGobus рдХреЛ рдзрдиреНрдпрд╡рд╛рджред