рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдмрдирд╛рд╡рдЯ: рдХреЛрдмрд▓рд╕реНрдЯреЛрди рдмрдирд╛рд╡рдЯ рд╕реГрдЬрди



рд╣рдо рдПрдХ рдЬрдирд░реЗрдЯрд░ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдПрдХ рджрд░реНрдЬрди рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдХреЛрдмрд▓рд╕реНрдЯреЛрди рдмрдирд╛рд╡рдЯ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИред

рдкрд░рд┐рдЪрдп


рдореЗрд░реЗ рд╢реМрдХ рдХрдВрдкреНрдпреВрдЯрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдФрд░ рд╕рд╛рдЗрдХрд┐рд▓ рдХреЗ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рд╣реИрдВред .Kkrieger рдЦреЗрд▓рдиреЗ рдФрд░ рдЗрд╕ рдФрд░ рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдЕрдкрдиреА рдмрдирд╛рд╡рдЯ рдЬрдирд░реЗрдЯрд░ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рд╣реБрдИред рдПрдХ рдмрдирд╛рд╡рдЯ рд╡рд┐рд╖рдп рдХреЗ рд░реВрдк рдореЗрдВ рдХреЛрдмрд▓рд╕реНрдЯреЛрди рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рдЗрд╕реЗ рдЧреВрдЧрд▓ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдПрдХ-рдХреЛрдмрд╕реНрдЯреЛрди рдмрдирд╛рд╡рдЯ рдХреЗ рдЬрдирд░реЗрдЯрд░ рдХреЛ рдЧреВрдЧрд▓ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдерд╛, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ -minecraft рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рднреАред рдЗрд╕ рдмрд╛рдд рдкрд░ рдереВрдХрддреЗ рд╣реБрдП рд╡рд╣ рдЕрдкрдиреЗ рд▓рд┐рдП рд╕реЛрдЪрдиреЗ рд▓рдЧрд╛ред

рдХрд╣рд╛рдВ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ


рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреА рдкрдВрдХреНрддрд┐ рд▓рдЧрднрдЧ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдереА:
- рдореБрдЭреЗ рдкрддреНрдерд░ рдЪрд╛рд╣рд┐рдП
- рдЕрдзрд┐рдХ рдкрддреНрдерд░реЛрдВ рдХреА рдЬрд░реВрд░рдд рд╣реИ! рдПрдХ рдмреЗрд╣рддрд░реАрди рдмрдирд╛рд╡рдЯ рдХреЗ рд▓рд┐рдПред рдФрд░ рдмрдирд╛рд╡рдЯ рдЬрд┐рддрдиреА рдмрдбрд╝реА рд╣реЛрдЧреА, рдкреАрдврд╝реА рдХрд╛ рд╕рдордп рдЙрддрдирд╛ рд╣реА рдЕрдзрд┐рдХ рд╣реЛрдЧрд╛ред рдпрд╣ рдмреБрд░рд╛ рд╣реИред
- рдкрддреНрдерд░ рдЕрд▓рдЧ рд╣реИрдВ (рдЖрдХрд╛рд░ рдФрд░ рд░рдВрдЧ рдореЗрдВ)
- рдЙрддреНрддрд▓ рдкрддреНрдерд░ (рдЙрднрд░рд╛ рд╣реБрдЖ)
- рдЦреБрд░рджрд░реА рдкрддреНрдерд░ рдХреА рдмрдирд╛рд╡рдЯ
- рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрддреНрдерд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЦреБрд░рджрд░реЗрдкрди рд╣реЛрддреЗ рд╣реИрдВ
- рдЪреВрдВрдХрд┐ рдмрдирд╛рд╡рдЯ рдореЗрдВ рд░рдВрдЧ рдФрд░ рд░рд╛рд╣рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрди рдШрдЯрдХреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдПрдХ рд╢реБрджреНрдз рд░рдВрдЧ рдмрдирд╛рд╡рдЯ рдФрд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдирдХреНрд╢рд╛ рд╣реЛрдиреЗ рджреЗрдВред
рд╣рдорд╛рд░реЗ рдЬрдирд░реЗрдЯрд░ рдореЗрдВ, рдмрдирд╛рд╡рдЯ рдЪрд░рдгреЛрдВ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛: рдкрд╣рд▓реЗ рд╣рдо рдПрдХ рдмрдирд╛рд╡рдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдлрд╝рд┐рд▓реНрдЯрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдмрдирд╛рд╡рдЯ рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рддреЗ рд╣реИрдВ, рдЖрджрд┐ рдЕрдм рд╣рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬреНрдЮрд╛рдд рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдпрд╛рдж рд░рдЦрдиреЗ рдпрд╛ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реА рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реБрдП, рдЕрдкрдиреЗ рдЬрдирд░реЗрдЯрд░ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рднреА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╕рд░рд▓ рд░реВрдк рд╕реЗ рд╕реВрдЪреАрдмрджреНрдз рдХрд░реВрдВрдЧрд╛ред
рдореИрдВрдиреЗ QtCreator рдореЗрдВ Qt 4.XY рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ C ++ рдореЗрдВ рдПрдХ рдЬрдирд░реЗрдЯрд░ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВрдиреЗ рдЦреБрдж рдХреЛ рдХреНрдпреВрдЯреА рдХреЗ рдмрд┐рдирд╛ рдЬрдирд░реЗрдЯрд░ рд╡рд░реНрдЧ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред

рдордзреБрдХреЛрд╢ рдХреА рдмрдирд╛рд╡рдЯ

рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЖрдзрд╛рд░ рд╣реИред рдпрд╣ рд╡рд╣ рд╣реИ рдЬреЛ рдкрддреНрдерд░реЛрдВ рдХреЗ рд▓рд┐рдП рдлреНрд░реЗрдо рдмрдирд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдпрд╣ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИ рдХрд┐ рд╕реЗрд▓реБрд▓рд░ рдмрдирд╛рд╡рдЯ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред
рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ, рдЬрдирд░реЗрдЯрд╕реЗрд▓реНрдпреВрдЖрд░ рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ:
рд╕реНрдкреЙрдЗрд▓рд░
unsigned char *ProceduralTexture::generateCelluarTexture(int size){ if (size<2) size = 2; int cellX = w/size+2; int cellY = h/size+2; int pointsX[cellX][cellY]; int pointsY[cellX][cellY]; srand(seed); for (int i=0; i<cellX; i++) for (int j=0; j<cellY; j++){ pointsX[i][j] = i*size+rand()%((int)(size*0.7))+size*0.15-size; pointsY[i][j] = j*size+rand()%((int)(size*0.7))+size*0.15-size; } int distBuff[n]; int maxDist = INT_MIN; for (int i=0; i<n; i++){ int x = i%w; int y = i/w; int min = INT_MAX; int min2 = INT_MAX; int startX = x/size; int finishX = startX+3; for (int cp=-1, point=0; startX<finishX; startX++){ int startY = y/size; int finishY = startY+3; for (; startY<finishY; startY++, point++){ if (startX<0 || startX>=cellX || startY<0 || startY>=cellY) continue; int d = distance(x, y, pointsX[startX][startY], pointsY[startX][startY]); if (d<min){ cp = point; min2 = min; min = d; } if (d<min2 && cp!=point) min2 = d; } } distBuff[i] = min2-min; if (maxDist<distBuff[i]) maxDist = distBuff[i]; } unsigned char *img = new unsigned char[n]; for (int i=0; i<n; i++) img[i] = (distBuff[i]*255)/maxDist; return img; } 



рдлрд╝рдВрдХреНрд╢рди рд╕реЗрд▓ рдХрд╛ рдЖрдХрд╛рд░ рд▓реЗрддрд╛ рд╣реИ, рдмрдирд╛рд╡рдЯ рдХреА рдПрдХ рдХрд╛рд▓реА рдФрд░ рд╕рдлреЗрдж рдЫрд╡рд┐ рджреЗрддрд╛ рд╣реИред рдЕрдм рдереЛрдбрд╝рд╛ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рднреА рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреНрд░рдордмрджреНрдз рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЫрд╡рд┐ рдХреЛ рдПрдХ рджрд┐рдП рдЧрдП рдЖрдХрд╛рд░ рдХреЗ рдЖрдпрддрд╛рдХрд╛рд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╡рд░реНрддрдорд╛рди рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдирд┐рдХрдЯрддрдо рдмрд┐рдВрджреБ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╡рд░реНрддрдорд╛рди рдФрд░ рдкрдбрд╝реЛрд╕реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рд╕реЗ 9 рдЕрдВрдХ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдКрдкрд░ рджрд┐рдП рдЧрдП рд▓рд┐рдВрдХ рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИред
рджреВрд╕рд░реЗ, рд╣рдореЗрдВ "рдИрдорд╛рдирджрд╛рд░" рджреВрд░реА рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВ рджреЛ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рджреВрд░реА рдХрд╛ рд╡рд░реНрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдиреАрдЪреЗ рдЖ рдЬрд╛рдПрдЧрд╛ (рд╣рдо рд░реВрдЯ рдХреЗ рдирд┐рд╖реНрдХрд░реНрд╖рдг рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд▓реЗрддреЗ рд╣реИрдВ) - рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рддрд╕реНрд╡реАрд░ рдЕрдзрд┐рдХ рд╡рд┐рдкрд░реАрдд рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдВрддрд┐рдо рдмрдирд╛рд╡рдЯ рдкрд░ рдирдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИред

рдЪрдордХ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдИ рдиреЗ рдЗрд╕ рдлрд┐рд▓реНрдЯрд░ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдлреЛрдЯреЛрд╢реЙрдк рдпрд╛ рдЕрдиреНрдп рдЧреНрд░рд╛рдлрд┐рдХ рд╕рдВрдкрд╛рджрдХреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ред рдЕрдм рд╣рдо рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реНрд╡рдпрдВ рд▓рд┐рдЦреЗрдВрдЧреЗред
рдХреЛрдб
 void ProceduralTexture::brightnessContrast(unsigned char *img, float brightness, float contrast, bool onePass){ // onePass -   if (brightness!=0){ if (brightness>0){ if (brightness>1) brightness = 1; brightness = 1.0f-brightness; for (int i=0; i<n; i++){ int r = 255-img[i]; r *= brightness; img[i] = 255-r; } } if (brightness<0){ if (brightness<-1) brightness = -1; brightness = 1.0f+brightness; for (int i=0; i<n; i++) img[i] *= brightness; } } if (contrast!=1){ if (contrast<0) contrast = 0; int avbr = 0; if (!onePass){ for (int i=0; i<n; i++) avbr += img[i]; avbr /= n; } else avbr = 127; for (int i=0; i<n; i++){ int res = contrast*(img[i]-avbr)+avbr; if (res<0) res = 0; if (res>255) res = 255; img[i] = res; } } } 


рдлрд╝рдВрдХреНрд╢рди рдЫрд╡рд┐ рдФрд░ рдЪрдордХ рдФрд░ рдХрдВрдЯреНрд░рд╛рд╕реНрдЯ рдЕрдиреБрдкрд╛рдд рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдирдкреБрдЯ рдкреЙрдЗрдВрдЯрд░ рд▓реЗрддрд╛ рд╣реИред рдЧрдгрдирд╛ рдХреЗ рд╕реВрддреНрд░ рдпрд╣рд╛рдВ рд╡рд░реНрдгрд┐рдд рд╣реИрдВ ред

рдкреЗрд░реНрд▓рд┐рди рдХрд╛ рд╢реЛрд░

рдкреЗрд░реНрд▓рд┐рди рд╢реЛрд░ (рд╣реИрдмреЗ рдкрд░ рд╕рд╣рд┐рдд) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд▓реЗрдЦ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рдореИрдВ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдореИрдВ рдХреЗрд╡рд▓ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдФрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рджреВрдВрдЧрд╛ред
рдХреЛрдб
 // : interpolateTable = NULL; powTable = new float[maxOctaves]; for (int i=0; i<maxOctaves; i++) powTable[i] = pow(0.5, i); inline int ProceduralTexture::getRnd(int x, int y){ return (0x6C078965*(seed^((x*2971902361)^(y*3572953751))))&0x7FFFFFFF; } inline int ProceduralTexture::pointOfPerlinNoise(int x, int y, int cellSize){ int dx = x-(x/cellSize)*cellSize; int dy = y-(y/cellSize)*cellSize; int z1 = getRnd(x-dx, y-dy); // z3 --- z4 int z2 = getRnd(x-dx+cellSize, y-dy); // | | int z3 = getRnd(x-dx, y-dy+cellSize); // + z + int z4 = getRnd(x-dx+cellSize, y-dy+cellSize); // z1 --- z2 int z1z3 = z1*(1.0f-interpolateTable[dy])+z3*interpolateTable[dy]; int z2z4 = z2*(1.0f-interpolateTable[dy])+z4*interpolateTable[dy]; return z1z3*(1.0f-interpolateTable[dx])+z2z4*interpolateTable[dx]; } unsigned char *ProceduralTexture::generatePerlinNoise(int octaves){ unsigned char *img = new unsigned char[n]; if (octaves<1) octaves = 1; if (octaves>maxOctaves) octaves = maxOctaves; for (int i=0; i<n; i++) img[i] = 0; float norm = 255.0f/INT_MAX; for (int j=1; j<=octaves; j++){ int f = 1<<(octaves-j); delete[] interpolateTable; interpolateTable = new float[f]; for (int i=0; i<f; i++){ float a = ((float)i/(float)f)*M_PI; interpolateTable[i] = (1.0f-cosf(a))*0.5f; } for (int i=0; i<n; i++) img[i] += pointOfPerlinNoise(i%w, i/w, f)*powTable[j]*norm; } return img; } 



рдкрд╣рд▓рд╛ рдЕрдиреБрдХреВрд▓рди: рд╣рдореЗрдВ рдкреНрд░рдХреНрд╖реЗрдк рдЧреБрдгрд╛рдВрдХ (1.0f-cosf (a)) * 0.5f) рдХреА рдЧрдгрдирд╛ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдорд┐рд▓рддрд╛ рд╣реИ - рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╕рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрддрдиреЗ рд╕рд╛рд░реЗ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИрдВ - рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд░рд╛рдЙрдВрдбред рдЗрд╕рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рд╕рдкреНрддрдХ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рд╕рднреА рдЧреБрдгрд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрдВрдЯрд░рдкреЛрд▓реЗрдЯрдЯреЗрдмрд▓ рд╕рд░рдгреА рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВред
рджреВрд╕рд░рд╛ рдЕрдиреБрдХреВрд▓рди рдкрд╣рд▓реЗ рдХреЗ рд╕рдорд╛рди рд╣реИ - рд╣рдо рдЙрди рд╕рднреА рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╡рд░реНрдЧреЛрдВ рдХреА рдЧрдгрдирд╛ рдкреВрд░реНрд╡-рдЧрдгрдирд╛ рдореВрд▓реНрдпреЛрдВ (рдкреЙрд╡реЗрдЯреЗрдмрд▓) рдХреЗ рд╕рд╛рде рдХреА рдЬрд╛рддреА рд╣реИред
рдореИрдВрдиреЗ рдпрдерд╛рд╕рдВрднрд╡ RNG рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдлреНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдирдВрдмрд░реЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдпрд╛ред

рдирд░рдо рдХрджрдо рдкреНрд░рднрд╛рд╡

рдореИрдВ рд╕реНрд╡рдпрдВ рдЗрд╕ рдкреНрд░рднрд╛рд╡ рдХреЗ рд╕рд╛рде рдЖрдпрд╛ рдерд╛ (рд╢рд╛рдпрдж рдореИрдВрдиреЗ рдПрдХ рд╕рд╛рдЗрдХрд┐рд▓ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдерд╛ - рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛)ред рд▓реЗрдХрд┐рди рд╡рд╣ рдПрдХ рдмреЗрд╣рддрд░ рдирд╛рдо рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЖрдпрд╛ - рдХреНрд╖рдорд╛ рдХрд░реЗрдВред рдлрд╝реЛрдЯреЛрд╢реЙрдк рдореЗрдВ рдкреЛрд╕реНрдЯрд░рд░рд╛рдЗрдЬреЗрд╢рди рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рди рдХреЗрд╡рд▓ рдкреИрд▓реЗрдЯ рдХреЛ рдХрд╛рдЯрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рд╕рдВрдХреНрд░рдордг рдХреЛ рднреА рд╕реБрдЪрд╛рд░реВ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдПрдХ рдЧреНрд░рд╛рдл рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рд░ рдХреЛ рдЪрд┐рддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛:
рдПрдХ рд░реИрдЦрд┐рдХ рдврд╛рд▓ рдХреЗ рд╕реАрдзреА рд░реЗрдЦрд╛ рдЧреНрд░рд╛рдл рдХреЛ рдЪрд┐рдХрдиреА рдХреЛрдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕реАрдврд╝реА рдХреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд░реНрддрдорд╛рди рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рд░рдВрдЧ рддреАрд╡реНрд░рддрд╛ рдХрд╛ рдорд╛рди рд▓реЗрдВ, рдЗрд╕реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ (рдЪрд░рдгреЛрдВ) рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВред рд╣рдореЗрдВ рдкреВрд░рд╛ рднрд╛рдЧ рдФрд░ рд╢реЗрд╖ рднрд╛рдЧ рдпрд╛рдж рд╣реИред рд╢реЗрд╖ рд╕реЗ рдЗрд╕рдХреА рдЕрдзрд┐рдХрддрдо рд╕реАрдорд╛ рдХрд╛ рдЖрдзрд╛ рдШрдЯрд╛рдПрдВ рдФрд░ рдЪрд┐рдХрдирд╛рдИ рдЧреБрдгрд╛рдВрдХ рд╕реЗ рдЧреБрдгрд╛ рдХрд░реЗрдВред рдкрд░рд┐рдгрд╛рдореА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдкреВрд░реНрдгрд╛рдВрдХ рднрд╛рдЧ рдореЗрдВ рд╡рд╛рдкрд╕ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдУрд╣, рдХреЛрдб рдореЗрдВ рджрд┐рдЦрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ:
 void ProceduralTexture::postEffect(unsigned char *img, int iterations, float smooth){ for (int i=0; i<n; i++){ float s = (float)img[i]/255.0f; float ds = s*(float)iterations-(float)((int)(s*iterations)); ds = smooth*(ds-0.5f)+0.5f; if (ds>1) ds = 1; if (ds<0) ds = 0; s = ((float)((int)(s*(float)iterations))+ds)/(float)iterations; img[i] = s*255; } } 

рдлрд╝рдВрдХреНрд╢рди рдЫрд╡рд┐ рдХреЛ рдПрдХ рдЗрдирдкреБрдЯ рдкреЙрдЗрдВрдЯрд░ рд▓реЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдЪрд┐рдХрдирд╛рдИ рдХреА рдбрд┐рдЧреНрд░реАред рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдЫрд╡рд┐ рдлрд╝рд┐рд▓реНрдЯрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреИрд╕реЗ рдмрджрд▓рддрд╛ рд╣реИ, рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛:
рд╣рд░ рдЬрдЧрд╣ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд╛рдВрдЪ рд╣реИред рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ рдХреА рдЪрд┐рдХрдирд╛рдИ рдХреА рдбрд┐рдЧреНрд░реА: 1, 1.5, 2.5

рд╡реИрд╕реЗ, рдЗрд╕ рд╢реАрд░реНрд╖рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреЛрд╕реНрдЯ рд╢реАрд░реНрд╖рдХ рдореЗрдВ рджреВрд╕рд░реА рддрд╕реНрд╡реАрд░ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдорд┐рд╢реНрд░рдг

рджреЛ рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдореНрдорд┐рд╢реНрд░рдг рдлрд┐рд▓реНрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реЗрд▓реБрд▓рд░ рдмрдирд╛рд╡рдЯ рдФрд░ рд╢реЛрд░ рдкрд░реНрд▓рд┐рдиред рдорд┐рд╢реНрд░рдг рдХреЛ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд┐рдпрд╛:
рдорд┐рд╢реНрд░рдг рдХрд░рддреЗ рд╕рдордп, рд╡реИрд▓реНрдпреВрдЯреЗрд╕реНрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдпрд╣ рд╕рдВрдЦреНрдпрд╛ рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рддреАрд╡реНрд░рддрд╛ рдХреЛ рджрд░реНрд╢рд╛рддреА рд╣реИ рдЬрд┐рд╕рдХреЗ рдКрдкрд░ рдпрд╣ (рдкрд┐рдХреНрд╕реЗрд▓) рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЕрдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рднреА рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдорд┐рд╢реНрд░рдг рдХрд░рддреЗ рд╕рдордп рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ред
рдХреЛрдб
 void ProceduralTexture::mix(unsigned char *img1, unsigned char *img2, int valueTest, float opacity){ for (int i=0; i<n; i++) if (img2[i]<=valueTest){ int b = img2[i]; int r = img1[i]; b = ((float)b/valueTest)*255.0f; r = r-(255-b)*opacity; if (r<0) r = 0; img1[i] = r; } } 



рд░рдВрдЧ

рдкреНрд░рддреНрдпреЗрдХ рдХрдВрдХрдбрд╝ рдХрд╛ рдЕрдкрдирд╛ рдЕрд▓рдЧ рд░рдВрдЧ рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпреЗ рд╕рднреА рд░рдВрдЧ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рдорд╛рди рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрдВрдХрдбрд╝ рдХреЛ рд╣рд░рд╛ рдпрд╛ рднреВрд░рд╛ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рд╣рд░реЗ рдпрд╛ рднреВрд░реЗ рд░рдВрдЧ рдХреЗ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рдВрдЧ рд╣реЛрдВрдЧреЗред рдЖрд░рдЬреАрдмреА рдкреИрд▓реЗрдЯ рдРрд╕реЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ "10% рдХреА рд╕реАрдорд╛ рдореЗрдВ рдЧреНрд░реЗ-рдмреНрд░рд╛рдЙрди-рд░рд╛рд╕реНрдкрдмреЗрд░реА рд░рдВрдЧ рдХреЗ рд╕рднреА рд░рдВрдЧреЛрдВ рдХреЛ рджреЗрдВред" рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдЪрдПрд╕рд╡реА рдкреИрд▓реЗрдЯ рдХреЛ рдЪреБрдирд╛ред рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рд░рдВрдЧ рд╕реЗрдЯ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ: рдкрддреНрдерд░реЛрдВ рдХреА рдЪрдордХ, рд╕рдВрддреГрдкреНрддрд┐ рдФрд░ рд░рдВрдЧред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рд╣реНрдпреВ рдХреА рдПрдХ рд╕реАрдорд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдЧрд░ рдореБрдЭреЗ рд░рдВрдЧреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдореИрдВ рд╣реНрдпреВ рдШрдЯрдХ рдХреЛ 60 рдкреНрд▓рд╕ рдпрд╛ рдорд╛рдЗрдирд╕ 10 рдкрд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдЖрд░рдЬреАрдмреА рдкреИрд▓реЗрдЯ рдореЗрдВ, рдореБрдЭреЗ рд╕рднреА рдЪреИрдирд▓реЛрдВ рдХреЗ рд╕рд╛рде рдЯрд┐рдВрдХрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдЪрдПрд╕рд╡реА рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд░рдВрдЧ рд░реВрдкрд╛рдВрддрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ - рдХреНрдпреЛрдВрдХрд┐ рдЕрдВрддрд┐рдо рдЫрд╡рд┐ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЖрд░рдЬреАрдмреА рдореЙрдбрд▓ рд╣реИред рдПрдХ рд╣реА рд╡рд┐рдХреА рд╕реЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд▓реЗрддреЗ рд╣реБрдП, рд╣рдо рдХреЛрдб рд▓рд┐рдЦреЗрдВрдЧреЗ:
рд╕реНрдкреЙрдЗрд▓рд░
 inline ColorRGB ProceduralTexture::hsvToRgb(ColorHSV &hsv){ ColorRGB rgb; if (hsv.s){ hsv.h %= 360; if (hsv.h<0) hsv.h += 360; int i = hsv.h/60; float f = ((float)hsv.h/60.0f)-(float)i; unsigned char c1 = (hsv.v*(100-hsv.s))*0.0255f; unsigned char c2 = (hsv.v*(100-hsv.s*f))*0.0255f; unsigned char c3 = (hsv.v*(100-hsv.s*(1.0ff)))*0.0255f; hsv.v *= 2.55f; switch (i){ case 0: rgb.r = hsv.v; rgb.g = c3; rgb.b = c1; break; case 1: rgb.r = c2; rgb.g = hsv.v; rgb.b = c1; break; case 2: rgb.r = c1; rgb.g = hsv.v; rgb.b = c3; break; case 3: rgb.r = c1; rgb.g = c2; rgb.b = hsv.v; break; case 4: rgb.r = c3; rgb.g = c1; rgb.b = hsv.v; break; case 5: rgb.r = hsv.v; rgb.g = c1; rgb.b = c2; break; } } else rgb.r = rgb.g = rgb.b = hsv.v; return rgb; } 



рдЕрдм рдпрд╣ рдХрдВрдХрдбрд╝ рднрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред рдореИрдВ рдмрд╕ рдЬрд╛рд▓ рдмрдирд╛рд╡рдЯ рдкреАрдврд╝реА рд╕рдорд╛рд░реЛрд╣ рдЕрддрд┐рднрд╛рд░рд┐рддред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкреВрд░реА рдЫрд╛рдпрд╛рдВрдХрди рдЗрд╕ рддрдереНрдп рдкрд░ рдЙрддрд░рддреА рд╣реИ рдХрд┐ рдЬрдм рд╣рдо рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реЗрдЯ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдПрдХ рд░рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред
рд╕реНрдкреЙрдЗрд▓рд░
 ColorRGB *ProceduralTexture::generateCelluarTexture(int size, ColorHSV color, int hueRange){ if (size<2) size = 2; int cellX = w/size+2; int cellY = h/size+2; int pointsX[cellX][cellY]; int pointsY[cellX][cellY]; ColorRGB cellColor[cellX][cellY]; srand(seed); for (int i=0; i<cellX; i++) for (int j=0; j<cellY; j++){ pointsX[i][j] = i*size+rand()%((int)(size*0.7))+size*0.15-size; pointsY[i][j] = j*size+rand()%((int)(size*0.7))+size*0.15-size; } color.h -= (hueRange/2); for (int i=0; i<cellX; i++) for (int j=0; j<cellY; j++){ ColorHSV c = color; ch += rand()%hueRange; cellColor[i][j] = hsvToRgb(c); } ColorRGB *img = new ColorRGB[n]; for (int i=0; i<n; i++){ int x = i%w; int y = i/w; int px = 0; int py = 0; int min = INT_MAX; int startX = x/size; int finishX = startX+3; for (; startX<finishX; startX++){ int startY = y/size; int finishY = startY+3; for (; startY<finishY; startY++){ if (startX<0 || startX>=cellX || startY<0 || startY>=cellY) continue; int d = distance(x, y, pointsX[startX][startY], pointsY[startX][startY]); if (d<min){ px = startX; py = startY; min = d; } } } img[i] = cellColor[px][py]; } return img; } 



рд╕рд╛рдорд╛рдиреНрдп рдирдХреНрд╢рд╛

рд░рд╛рд╣рдд рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рд╢реЗрдбрд░ рд▓рд┐рдЦрд╛, рдЬреЛ рдПрдХ рдмрдирд╛рд╡рдЯ рдФрд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдирдЪрд┐рддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЙрд╕ рдЪрд┐рддреНрд░ рдХреЛ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ рдкреЛрд╕реНрдЯ рд╢реАрд░реНрд╖рдХ рдореЗрдВ рджреЗрдЦрд╛ рдерд╛ред рдореВрд▓ рдЫрд╡рд┐ рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдирдХреНрд╢рд╛ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЖрд╕рдиреНрди рдкрд┐рдХреНрд╕рд▓ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реВрдВ - рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд▓рди рдХреЛрдг рд╣реИред рд╕рднреА рдкрд┐рдХреНрд╕рд▓ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдиреНрдпреВрдирддрдо рдФрд░ рдЕрдзрд┐рдХрддрдо рдХреЛрдг рдвреВрдВрдврддреЗ рд╣реБрдП, рдореИрдВ рдЙрдиреНрд╣реЗрдВ (рдХреЛрдг) рд╕рд╛рдорд╛рдиреНрдп рдХрд░рддрд╛ рд╣реВрдВред
рд╕реНрдкреЙрдЗрд▓рд░
 void ProceduralTexture::generateNormalMap(unsigned char *img){ normalMap = new ColorRG[n]; int maxR = 0; int maxG = 0; for (int i=0; i<n; i++){ int x = i%w; int y = i/w; if (x>0){ int dr = (int)img[y*w+x-1]-(int)img[y*w+x]; if (dr>maxR) maxR = dr; } if (y>0){ int dg = (int)img[(y-1)*w+x]-(int)img[y*w+x]; if (dg>maxG) maxG = dg; } } maxR *= 2; maxG *= 2; for (int i=0; i<n; i++){ int x = i%w; int y = i/w; if (x>0){ int r = 127+(((int)img[y*w+x-1]-(int)img[y*w+x])*255)/maxR; if (r>255) r = 255; if (r<0) r = 0; normalMap[y*w+x].r = r; } else { int r = 127-(((int)img[y*w+x+1]-(int)img[y*w+x])*255)/maxR; if (r>255) r = 255; if (r<0) r = 0; normalMap[y*w+x].r = r; } if (y>0){ int g = 127+(((int)img[(y-1)*w+x]-img[y*w+x])*255)/maxG; if (g>255) g = 255; if (g<0) g = 0; normalMap[y*w+x].g = g; } else { int g = 127-(((int)img[(y+1)*w+x]-img[y*w+x])*255)/maxG; if (g>255) g = 255; if (g<0) g = 0; normalMap[y*w+x].g = g; } } } 



рдФрд░ рдпрд╣реАрдВ рдкрд░ рд╢рдбрд░ рд╣реИред рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдорд╛рдЙрд╕ рдХрд░реНрд╕рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдПрдХ рд╕реНрдкреЙрдЯрд▓рд╛рдЗрдЯ рдмрдирд╛рдпрд╛ (рд╣реЗрдбрд░ рдореЗрдВ рдЪрд┐рддреНрд░реЛрдВ рдореЗрдВ, рдорд╛рдЙрд╕ рдХрд░реНрд╕рд░ рдКрдкрд░реА рдмрд╛рдПрдБ рдХреЛрдиреЗ рдореЗрдВ рдерд╛
рд╕реНрдкреЙрдЗрд▓рд░
 // varying vec4 texCoord; void main(){ gl_Position = gl_ModelViewProjectionMatrix*gl_Vertex; texCoord = gl_MultiTexCoord0; } // uniform sampler2D colorMap; uniform sampler2D normalMap; varying vec4 texCoord; uniform vec2 light; uniform vec2 screen; uniform float dist; void main() { vec3 normal = texture2D(normalMap, texCoord.st).rgb; normal = 2.0*normal-1.0; vec3 n = normalize(normal); vec3 l = normalize(vec3((gl_FragCoord.xy-light.xy)/screen, dist)); float a = dot(n, l); gl_FragColor = a*texture2D(colorMap, texCoord.st); } 



рд╕рдм рдХреБрдЫ рдПрдХ рд╕рд╛рде рдЧреЛрдВрдж


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

рд▓реЗрдХрд┐рди рд╕рд╣рдЬ рдмрдирд╛рд╡рдЯ рдХрд╛ рдХреНрдпрд╛?


рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдореИрдВ рдПрдХ рд╕рд╣рдЬ рдмрдирд╛рд╡рдЯ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдпрд╣ рдЖрд▓рд╕реНрдп рдерд╛ред рдиреБрд╕реНрдЦрд╛ рд╕рд░рд▓ рд╣реИ: рд╕реАрдорд╛рдУрдВ рдкрд░ рджреВрд░реА рдХреА рдЦреЛрдЬ рдХрд░рддреЗ рд╕рдордп рдПрдХ рдЬрд╛рд▓ рдмрдирд╛рд╡рдЯ рдкреИрджрд╛ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдмрдирд╛рд╡рдЯ рдХреЗ рд╡рд┐рдкрд░реАрдд рддрд░рдл рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдФрд░ рдЬрдм рдкреНрд░рддрд┐рдзреНрд╡рдирд┐ рдкреИрджрд╛ рд╣реЛрддреА рд╣реИ ... рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рднреА рдирд╣реАрдВ рд▓рдЧрддрд╛ред рд╢рд╛рдпрдж рдРрд╕рд╛ рд╣реА рдХреБрдЫред

рдХреБрдЫ рдЕрдиреБрдХреВрд▓рдиред рдХреНрдпрд╛ рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдерд╛?


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреЛрдб рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдиреЗ рдХрд╛рдлреА рдзреАрд░реЗ-рдзреАрд░реЗ рдХрд╛рдо рдХрд┐рдпрд╛, рдмрд╣реБрдд рд╕рд╛рд░реЗ рдлреНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдирдВрдмрд░, рдЕрдирд╛рд╡рд╢реНрдпрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдФрд░ рдЧрдгрдирд╛рдПрдВ рдереАрдВред рдореИрдВрдиреЗ рдЬреЛ рдХреБрдЫ рднреА рдХрд┐рдпрд╛ рдерд╛, рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрд╕рдВрднрд╡ рд╣реЛ, рдЧрдгрдирд╛ рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдирд┐рдпрдд-рдмрд┐рдВрджреБ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░реЗрдВред рдирддреАрдЬрддрди, рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рд╡рд░реНрддрдорд╛рди рдХреЗ рдмреАрдЪ рдкреНрд░рджрд░реНрд╢рди рд▓рдЧрднрдЧ 10 рдЧреБрдирд╛ рдмрдврд╝ рдЧрдпрд╛ рд╣реИред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╡рд┐рдЪрд╛рд░ рдерд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рд╕рдВрджреЗрд╣ рдХреЗ рдХрд╛рд░рдг рдХрд┐ рд╕рдм рдХреБрдЫ рд╕реНрдореГрддрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рдЯрд┐рдХреА рд╣реБрдИ рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ред

рд╕реНрд░реЛрдд рдХреЛрдб


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

рдХреБрдЫ рдФрд░ рдЙрджрд╛рд╣рд░рдг



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


All Articles