рдЗрд╕ рдмреНрд▓реЙрдЧ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдЕрдкрдиреА рдкрд╕рдВрджреАрджрд╛ рддрдХрдиреАрдХ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдЬрд┐рд╕реЗ рдореИрдВ рдЕрдкрдиреЗ рд╡рд╛рдЧрд╛рдмреЛрдВрдб рдЧреЗрдо рдореЗрдВ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ: рдкреИрд▓реЗрдЯреНрд╕ рдХреЛ рдмрджрд▓рдирд╛ред
рдкреИрд▓реЗрдЯ рд╕реНрд╡реИрдкрд┐рдВрдЧ рдмрдирд╛рд╡рдЯ рдкреИрд▓реЗрдЯ рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╣реИред рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдЗрд╕реЗ shaders рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдкреБрд░рд╛рдиреЗ рджрд┐рдиреЛрдВ рдореЗрдВ, рдпрд╣ рдПрдХ рдЙрдкрдпреЛрдЧреА рддрдХрдиреАрдХ рдереА, рдЬреЛ рдЖрдкрдХреЛ рд╕реНрдореГрддрд┐ рдХреА рдЕрдирд╛рд╡рд╢реНрдпрдХ рдмрд░реНрдмрд╛рджреА рдХреЗ рдмрд┐рдирд╛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рдереАред рдЖрдЬ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирдП рд╕рдВрд╕рд╛рдзрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдкреАрдврд╝реА рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЫрд╡рд┐ рддреИрдпрд╛рд░ рдХрд░рдирд╛
рдкрд╣рд▓рд╛ рдЪрд░рдг рдкреИрд▓реЗрдЯреНрд╕ рдХреА рдЬрдЧрд╣ рдХреЗ рд▓рд┐рдП рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рд╣реИред рдПрдХ
рдмрд┐рдЯрдореИрдк рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдореЗрдВ рдПрдХ рд░рдВрдЧ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд░рдВрдЧ рдХреЛ рдкреИрд▓реЗрдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдХрд╛рд░рдг, рд╣рдо рдЫрд╡рд┐ рд╕рдВрд░рдЪрдирд╛ (рд╕рдорд╛рди рд░рдВрдЧ рдХреЗ рдХреНрд╖реЗрддреНрд░) рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░рдВрдЧреЛрдВ рд╕реЗ рдЕрд▓рдЧ рдХрд░ рджреЗрдВрдЧреЗред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреБрдЫ рдЫрд╡рд┐ рдкреНрд░рд╛рд░реВрдк рдЗрд╕ рд╕рдВрдЧреНрд░рд╣рдг рд╡рд┐рдзрд┐ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рдкреАрдПрдирдЬреА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЕрдиреБрдХреНрд░рдорд┐рдд рд░рдВрдЧреЛрдВ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдХрдИ рдЗрдореЗрдЬ рд▓реЛрдбрд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд░рдВрдЧ рдХреА рдПрдХ рд╕рд░рдгреА рдмрдирд╛рддреЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рдЫрд╡рд┐ рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдореЛрдб рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рд╣реЛред рдпрд╣ рдПрд╕рдПрдлрдПрдордПрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдЕрдВрджрд░, рдпрд╣
stb_image рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ "рдкреИрд▓реЗрдЯ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ", рдЕрд░реНрдерд╛рддреНред рдЗрд╕реА рдкреИрд▓реЗрдЯ рд░рдВрдЧ рдХреЗ рд╕рд╛рде рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдмрджрд▓рддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЫрд╡рд┐ рдФрд░ рдкреИрд▓реЗрдЯ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЫрд╡рд┐ рдЧреНрд░реЗ рд░рдВрдЧ рдореЗрдВ рджрд░реНрдЬ рдХреА рдЧрдИ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХрд╛ рдЧреНрд░реЗ рд╕реНрддрд░ рдкреИрд▓реЗрдЯ рдореЗрдВ рдЗрд╕рдХреЗ рд░рдВрдЧ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ:
рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ рдЫреЛрдЯреЗ рдкрд╛рдпрдерди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ
рдкрд┐рд▓реЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:
import io import numpy as np from PIL import Image def convert_to_indexed_image(image, palette_size):
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдлрд╝рдВрдХреНрд╢рди рдЫрд╡рд┐ рдХреЛ рдкреИрд▓реЗрдЯ рдореЛрдб рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░рддрд╛ рд╣реИред рд╡рд╣ рдлрд┐рд░ рдЗрд╕реЗ рдПрдХ рдЧреНрд░реЗрд╕реНрдХреЗрд▓ рдЫрд╡рд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдкреБрди: рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддреА рд╣реИред рдлрд┐рд░ рдкреИрд▓реЗрдЯ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдкрд┐рд▓реЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╢реЗрдбрд░
рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдкреИрд▓реЗрдЯ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ shader рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред рдПрдХ рдкреИрд▓реЗрдЯ рдХреЛ рдПрдХ рд╢реЗрдбрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рд░рдгрдиреАрддрд┐рдпрд╛рдВ рд╣реИрдВ: рдЖрдк рдПрдХ рдмрдирд╛рд╡рдЯ рдпрд╛ рдПрдХ рд╕рдЬрд╛рддреАрдп рд╕рд░рдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рдПрдХ рд╕рдЬрд╛рддреАрдп рд╕рд░рдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд▓рдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред
рдпрд╣рд╛рдБ рдореЗрд░рд╛ shader рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕реЗ GLSL рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ shaders рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░реА рднрд╛рд╖рд╛ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
#version 330 core in vec2 TexCoords; uniform sampler2D Texture; uniform vec4 Palette[32]; out vec4 Color; void main() { Color = Palette[int(texture(Texture, TexCoords).r * 255)]; }
рд╣рдо рд╡рд░реНрддрдорд╛рди рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд▓рд╛рд▓ рдЪреИрдирд▓ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рдмрдирд╛рд╡рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд▓рд╛рд▓ рдЪреИрдирд▓ 0 рд╕реЗ 1 рддрдХ рдХреА рд╕реАрдорд╛ рдореЗрдВ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдмрд┐рдВрджреБ рдорд╛рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ 255 рд╕реЗ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ 0 рд╕реЗ 255 рддрдХ рдореВрд▓ рдЧреНрд░реЗ рд╕реНрддрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
int
рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЫрд╡рд┐ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддрд╛ рд╣реИред рдЕрдЧрд▓рд╛ рд╣рдо рдкреИрд▓реЗрдЯ рд╕реЗ рд░рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдиреАрдореЗрд╢рди рдЗрди-рдЧреЗрдо рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдореИрдВ рдЪрд░рд┐рддреНрд░ рдХреЗ рд╢рд░реАрд░ рдХрд╛ рд░рдВрдЧ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреИрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ: