рдЖрдЗрд╕реЛрд╕рд░реНрдлрд╝рд╕ рд░реЗрдВрдбрд░рд┐рдВрдЧ рд░рд┐рдХреНрд╕реНрдЯрд┐рдВрдЧ рдЕрд▓реНрдЧреЛрд░рд┐рдердо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ Isosurface рд░реЗрдВрдбрд░рд┐рдВрдЧ рдпрд╛ isosurface рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдЕрдкрдиреЗ рдХрд╛рдо рдХреА рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП, рдореИрдВ рд▓рдЧрд╛рддрд╛рд░ рдХреЗрд╡рд▓ рдЕрдВрдЧреНрд░реЗрдЬреА рдпрд╛ рдЬрд░реНрдорди рдореЗрдВ рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕рд▓рд┐рдП, рдкрд╛рда рдореЗрдВ рдореИрдВ рдЕрдХреНрд╕рд░ рдХрд┐рд╕реА рднреА рд╢рдмреНрдж рдХреЗ рд▓рд┐рдП рд╢рдмреНрдж рдХреЗ рдЕрдВрдЧреНрд░реЗрдЬреА рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред

рддреЛ, Isosurface рдХреНрдпрд╛ рд╣реИ - рдпрд╣, рдЬреИрд╕рд╛ рдХрд┐ рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ, рд╕рдореЛрдЪреНрдЪ рд░реЗрдЦрд╛ рдХрд╛ рдПрдХ 3-рдЖрдпрд╛рдореА рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ "рдПрдХ рдкрдВрдХреНрддрд┐ рд╣реИ рдЬрд┐рд╕ рдмрд┐рдВрджреБ рдкрд░ рдорд╛рдкрд╛ рдореВрд▓реНрдп рд╕рдорд╛рди рдореВрд▓реНрдп рдХреЛ рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реИ"ред рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдЖрдЗрдП рддрд╕реНрд╡реАрд░реЛрдВ рдХреЛ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рджреЗрдЦреЗрдВред

рдЫрд╡рд┐рдЫрд╡рд┐

рдпреЗ рдЪрд┐рддреНрд░ "рдорд╛рдкреА рдЧрдИ рдорд╛рддреНрд░рд╛" - рдШрдирддреНрд╡ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рддрд╣реЛрдВ рдХреЛ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рдорд╛рди рджреВрд╕рд░реЗ рд╕реЗ рдХрдо рд╣реИред

рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рдореИрдВ рдЪрд┐рдХрд┐рддреНрд╕рд╛ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реВрдВред рдЪрд┐рдХрд┐рддреНрд╕рд╛ рдЙрдкрдХрд░рдгреЛрдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдЖрдВрдХрдбрд╝реЛрдВ рдореЗрдВ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рддрдерд╛рдХрдерд┐рдд рдХрдЪреНрдЪреА рдпрд╛ рдЧреНрд░реЗрд╕реНрдХреЗрд▓ рдЫрд╡рд┐ рд╣реЛрддреА рд╣реИ - 8 рдмрд┐рдЯреНрд╕ (256 рд╢реЗрдбреНрд╕) рд╕реЗ 16 рдмрд┐рдЯреНрд╕ (65,536 рд╢реЗрдбреНрд╕ рдСрдл рдЧреНрд░реЗ)ред рдЪреВрдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ 16 рдмрд┐рдЯреНрд╕ рдмрд╣реБрдд рд╣реИ, рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рдВрд╕реНрдХрд░рдг рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - 12 рдмрд┐рдЯреНрд╕, рдЕрд░реНрдерд╛рдд, рдЙрдЪреНрдЪ рдмрд╛рдЗрдЯ рд╕реЗ рдПрдХ рднрд╛рдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рд╣рдореЗрдВ 4096 рдЧреНрд░реЗ рд░рдВрдЧ рджреЗрддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдЧреНрд░реЗ рдЫрд╡рд┐ рдХреЛ рдПрдХ рд░рдВрдЧ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рддрдерд╛рдХрдерд┐рдд LUT - рдЯреЗрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рддрд╛рд▓рд┐рдХрд╛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ RGBA рдорд╛рди рд╣реЛрддрд╛ рд╣реИред 12 рдмрд┐рдЯреНрд╕ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ 4096 рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣реИрдВред рдФрд░ рдЬрдм рд╣рдо рдХрд┐рд╕реА рд╡реИрдХреНрд╕реАрд▓ рдХреЗ рдорд╛рди рдХреЗ рд╕рд╛рде рдорд┐рд▓рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 542, рддреЛ рд╣рдо рдХреНрд░рдорд╢рдГ рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдХреА 542 рдкрдВрдХреНрддрд┐рдпреЛрдВ рд╕реЗ рд▓реЗрддреЗ рд╣реИрдВ рдЬреЛ рдЖрд░рдЬреАрдмреАрдП рдХреЗ рд╕рдВрдХреЗрдд рд╣реИрдВред
рдпреЗ рдЯреЗрдмрд▓ рдпреЛрдЧреНрдп рдЪрд┐рдХрд┐рддреНрд╕рдХреЛрдВ / рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ рдЬреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ RGBA рдХреЗ рд╕рд╛рде рдШрдирддреНрд╡ рдореВрд▓реНрдп рдХреЛ рдХреИрд╕реЗ рд╕рд╣рд╕рдВрдмрдВрдзрд┐рдд рдХрд░рдирд╛ рд╣реИред рдЕрд▓реНрдлрд╛ рдЪреИрдирд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдЕрд░реНрдерд╛рдд, рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛, рдЖрдкрдХреЛ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рд╣рдо рдХреЗрд╡рд▓ рд╣рдбреНрдбрд┐рдпреЛрдВ, рдпрд╛ рдХреЗрд╡рд▓ рдирд╕реЛрдВ, рдпрд╛ рдзрдордирд┐рдпреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВрдЧреЗ - рдмрд╛рдХреА рдкрд╛рд░рджрд░реНрд╢реА рд╣реЛрдЧрд╛ред рдЕрд░реНрдерд╛рддреН, LUT рдХреЛ рдордХреНрдЦреА рдкрд░ рдмрджрд▓рддреЗ рд╣реБрдП, рд╣рд░ рдмрд╛рд░ рд╣рдореЗрдВ рдЙрд╕реА рд╡рд╕реНрддреБ рдХрд╛ рдПрдХ рдирдпрд╛ рдкреНрд░рджрд░реНрд╢рди рдорд┐рд▓рддрд╛ рд╣реИред

рдЫрд╡рд┐ рдбреЗрдЯрд╛ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХрд╛ рдореБрдЦреНрдп рддрд░реАрдХрд╛ рд╡реЙрд▓реНрдпреВрдо рд░реЗ рдХрд╛рд╕реНрдЯрд┐рдВрдЧ (рд░реВрд╕реА рдХреЗ рд╕рдорд╛рди рдХреБрдЫ - рд╡реЙрд▓реНрдпреВрдо рд░реЗрдВрдбрд░рд┐рдВрдЧ ) рд╣реИред рдореИрдВ рдпрд╣рд╛рдБ рдмрд╣реБрдд рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдБрдЧрд╛ред рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рдХрд╛рдо рдХреЛ рд╕рдордЭрдирд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЗрд╕реЛрд╕реЗрд░реНрдлрд╕ рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рд░реЗ рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЕрдкрдиреА рд╡рд╕реНрддреБ рдХреЛ рдХрд┐рд░рдгреЛрдВ рд╕реЗ рднреЗрджрддреЗ рд╣реИрдВред рдПрдХ рдХрд┐рд░рдг рд╣рдорд╛рд░реА рдЖрдВрдЦ (рдХреИрдорд░рд╛) рд╕реЗ рдЖрддреА рд╣реИ, рд╕реНрдХреНрд░реАрди рдХреЗ рд╣рд░ рдмрд┐рдВрджреБ (рд╣рд░ рдкрд┐рдХреНрд╕реЗрд▓) рд╕реЗ рдЧреБрдЬрд░рддреА рд╣реИ, рдФрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реНрд╡рд░ рдореЗрдВ рд╣рдорд╛рд░реА рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝ рдЬрд╛рддреА рд╣реИ (рдпрджрд┐ рдХреЛрдИ рдЪреМрд░рд╛рд╣рд╛ рд╣реИ)ред рдмреАрдо рдЗрд╕ рдкрд░ рдирд╣реАрдВ рд░реБрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реИ, рдЖрдЧреЗ рдХреЗ рд╕реНрд╡рд░реЛрдВ рдХреЛ рдкрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдВрджреБ рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдЬрдорд╛ рдХрд░рддрд╛ рд╣реИред рдмреАрдо рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдорд╛рдирджрдВрдб рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдмрд╕реЗ рдЖрдо рд╣реИ рдЬрдм рд╕рдВрдЪрд┐рдд рдореВрд▓реНрдп рдХреЗ рдЕрд▓реНрдлрд╛ 1 рдХреЗ рдХрд░реАрдм рд╣реИ (рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, a> 0.95 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), рдпрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рдЫрд╡рд┐ рдХреА рд╕реАрдорд╛рдУрдВ рд╕реЗ рдкрд░реЗ рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣реА рд╣реИ, рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЕрдиреБрд░реЗрдЦрдг рдХреЗ рджреМрд░рд╛рди, рд╣рдо рдкрд╛рд░рджрд░реНрд╢реА рд╕реНрд╡рд░реЛрдВ рдХреЛ рддреНрдпрд╛рдЧ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдкрд╛рд░рднрд╛рд╕реА рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЬрдорд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдПрдХ рдареЛрд╕ рд╡рд╕реНрддреБ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рд╣рдорд╛рд░реА рдХрд┐рд░рдг рдЗрд╕рдХреА рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рдХрд╛рд░рдг рдирд╣реАрдВ рдЧреБрдЬрд░рддреА рд╣реИред рдкрд░рд┐рдгрд╛рдореА рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

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

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

  1. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  2. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  3. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  4. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  5. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  6. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  7. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  8. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  9. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  10. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  11. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  12. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  13. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  14. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  15. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  16. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  17. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  18. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  19. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  20. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  21. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  22. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  23. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  24. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  25. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  26. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  27. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  28. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  29. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  30. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  31. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  32. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  33. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  34. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  35. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  36. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  37. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  38. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  39. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }
  40. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }

______________________
рдкрд╛рда рдХреЛ Blog Editor рдореЗрдВ ┬й SoftCoder.ru рджреНрд╡рд╛рд░рд╛ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

рдХрд┐рд░рдг рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдХрд╛ рдПрдХ рдореБрдЦреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдЯреНрд░реЗрд╕ рд╕реНрдЯреЗрдк рд╣реИ - рдмреАрдо рдХрд┐рд╕ рдЧрддрд┐ рд╕реЗ рд╣рдорд╛рд░реА рд╡рд╕реНрддреБ рд╕реЗ рдЧреБрдЬрд░рддреА рд╣реИред рдпрджрд┐ рд╣рдо рдЖрдпрд╛рдо X * Y * Z рдХрд╛ рдШрди рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрджрд░реНрд╢ рдЧрддрд┐ 1 / MAX (X, Y, Z) рд╣реЛрдЧреАред рдпрд╣реА рд╣реИ, рдХреБрдЫ рднреА рдпрд╛рдж рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╛рд╕ 1 voxel рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рдУрд░, рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛ рдПрдХ рд╕реНрддрд░ рдЬреЛ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЕрдХреНрд╕рд░ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

рдЫрд╡рд┐рдЫрд╡рд┐

рдкреНрд░рд╕реНрддреБрдд рдЫрд╡рд┐рдпреЛрдВ рдореЗрдВ рд╣рдо рд╡рд┐рднрд┐рдиреНрди рдирдореВрдирд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдмрд╕ рдПрдХ рд╣реА рд╕рд╣реА 1 / MAX (рдПрдХреНрд╕, рд╡рд╛рдИ, рдЬреЗрдб) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдЫрд╡рд┐ рдЪрд┐рдХрдиреА рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд▓рдЧреА, рдмрд┐рдирд╛ рджреГрд╢реНрдп рдмрджрд▓рд╛рд╡ рдХреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдПрдХ рднреА рд╕реНрд╡рд░ рдХреЛ рдпрд╛рдж рдирд╣реАрдВ рдХрд░рддреЗ рдереЗ, рд▓реЗрдХрд┐рди! рдПрдлрдкреАрдПрд╕ рдХреЗрд╡рд▓ 13 рдлреНрд░реЗрдо рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рд╣реИред
рджреВрд╕рд░реЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рджреЛ рдмрд╛рд░ рд╕реИрдВрдкрд▓рд░реЗрдЯ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ - рдпрд╛рдиреА рд╣рдордиреЗ рд╣рд░ рджреВрд╕рд░реЗ рд╡реЙрдХреНрд╕реЗрд▓ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛, рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЬреЛ рд╕рд░реНрдХрд▓ рдмрдирддреЗ рд╣реИрдВ, рд╡рд╣ рдЖрдЗрд╕реЛрд╕рд░реНрдл рдХреЗ рдкрд╣рд▓реЗ рд╡реЙрдХреНрд╕рд▓ рдХреЗ рд╕реНрдерд╛рди рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдПрдлрдкреАрдПрд╕ 37 рдлреНрд░реЗрдо рддрдХ рдмрдврд╝ рдЧрдпрд╛ред
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдХреА рдЧрддрд┐ рдХреЛ рдХреИрд╕реЗ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рдП рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЧреБрдгрд╡рддреНрддрд╛ рди рдЦреЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред

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


All Articles