OpenSceneGraph: рдмрдирд╛рд╡рдЯ рдореВрд▓ рдмрд╛рддреЗрдВ

рдЫрд╡рд┐

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


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

OSG рдХрдИ рдмрдирд╛рд╡рдЯ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдФрд░ рдмрдирд╛рд╡рдЯ рдореЛрдб рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди, рдмрдирд╛рд╡рдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдУрдПрд╕рдЬреА рдмрд┐рдЯрдореИрдк рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред рд░реЗрдЦрд╛рдкреБрдВрдЬ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдСрд╕реНрдЧ :: рдЫрд╡рд┐, рдЬреЛ рдЗрд╕рдХреЗ рдЕрдВрджрд░ рдЫрд╡рд┐ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдЙрджреНрджреЗрд╢реНрдп, рдЕрдВрддрддрдГ, рд╡рд╕реНрддреБ рдХреЛ рдмрдирд╛рд╡рдЯ рдХреЗ рд▓рд┐рдПред

1. рд░реЗрдЦрд╛рдкреБрдВрдЬ рдЫрд╡рд┐ рдбреЗрдЯрд╛ рдХреА рдкреНрд░рд╕реНрддреБрддрд┐ред Osg рд╡рд░реНрдЧ :: рдЫрд╡рд┐


рдбрд┐рд╕реНрдХ рд╕реЗ рдПрдХ рдЫрд╡рд┐ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ osgDB :: readImageFile () рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдпрд╣ osg :: readNodeFile () рдХреЙрд▓ рдХреЗ рд╕рдорд╛рди рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдореЗрдВ рдКрдм рдЪреБрдХрд╛ рд╣реИред рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ picture.bmp рдирд╛рдо рдХрд╛ рдмрд┐рдЯрдореИрдк рд╣реИ, рддреЛ рдЗрд╕реЗ рд▓реЛрдб рдХрд░рдирд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛

osg::ref_ptr<osg::Image> image = osgDB::readImageFile("picture.bmp"); 

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

  1. рдЯреА (), рдПрд╕ () рдФрд░ рдЖрд░ () - рдЫрд╡рд┐ рдХреА рдЪреМрдбрд╝рд╛рдИ, рдКрдВрдЪрд╛рдИ рдФрд░ рдЧрд╣рд░рд╛рдИ рд▓реМрдЯрд╛рдПрдВред
  2. data () - "рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд" рдЫрд╡рд┐ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд char * рдХрд╛ рдкреЙрдЗрдВрдЯрд░ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рд╕реВрдЪрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдбреЗрд╡рд▓рдкрд░ рдЫрд╡рд┐ рдбреЗрдЯрд╛ рдкрд░ рд╕реАрдзреЗ рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЖрдк getPixalFormat () рдФрд░ getDataType () рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЫрд╡рд┐ рдбреЗрдЯрд╛ рдкреНрд░рд╛рд░реВрдк рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрдирдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдорд╛рди, OpenGL рдлрд╝рдВрдХреНрд╢рди glTexImage * () рдХреЗ рдкреНрд░рд╛рд░реВрдк рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЪрд┐рддреНрд░ рдореЗрдВ GL_RGB рдкрд┐рдХреНрд╕реЗрд▓ рдкреНрд░рд╛рд░реВрдк рд╣реИ рдФрд░ рдкреНрд░рдХрд╛рд░ GL_UNSIGNED_BYTE рд╣реИ, рддреЛ RGB рд░рдВрдЧ рдШрдЯрдХ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреАрди рд╕реНрд╡рддрдВрддреНрд░ рддрддреНрд╡реЛрдВ (рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдмрд╛рдЗрдЯреНрд╕) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ



рдЖрдк рдПрдХ рдирдИ рдЫрд╡рд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 osg::ref_ptr<osg::Image> image = new osg::Image; image->allocateImage(s, t, r, GL_RGB, GL_UNSIGNED_BYTE); unsigned char *ptr = image->data(); //         

рдпрд╣рд╛рдБ s, t, r рдЫрд╡рд┐ рдЖрдХрд╛рд░ рд╣реИрдВ; GL_RGB рдкрд┐рдХреНрд╕реЗрд▓ рдкреНрд░рд╛рд░реВрдк рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ GL_UNSIGNED_BYTE рдПрдХрд▓ рд░рдВрдЧ рдШрдЯрдХ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдЖрд╡рд╢реНрдпрдХ рдЖрдХрд╛рд░ рдХрд╛ рдПрдХ рдЖрдВрддрд░рд┐рдХ рдбреЗрдЯрд╛ рдмрдлрд░ рд╕реНрдореГрддрд┐ рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЕрдЧрд░ рдЗрд╕ рдЫрд╡рд┐ рдХрд╛ рдПрдХ рднреА рд▓рд┐рдВрдХ рдирд╣реАрдВ рд╣реИред

OSG рдкреНрд▓рдЧ-рдЗрди рд╕рд┐рд╕реНрдЯрдо рд▓рдЧрднрдЧ рд╕рднреА рд▓реЛрдХрдкреНрд░рд┐рдп рдЫрд╡рд┐ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ: * .jpg, * .bmp, * * .ng, * .tif рдФрд░ рдЗрддрдиреЗ рдкрд░ред рдпрд╣ рд╕реВрдЪреА рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд▓рдЧрдЗрди рдХреЛ рд▓рд┐рдЦрдХрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдФрд░ рдЪрд░реНрдЪрд╛ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИред

2. рдмрдирд╛рд╡рдЯ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ


рддреАрди-рдЖрдпрд╛рдореА рдореЙрдбрд▓ рдореЗрдВ рдмрдирд╛рд╡рдЯ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрдИ рдЪрд░рдгреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

  1. рдЬреНрдпрд╛рдорд┐рддреАрдп рд╡рд╕реНрддреБ (3 рдбреА рдбрд┐рдЬрд╛рдЗрдирд░реЛрдВ рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ, рдпрд╣ рдПрдХ рдпреВрд╡реА рд╕реНрдХреИрди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рдХреЗ рд▓рд┐рдП рдХреЛрдиреЗ рдХреЗ рдмрдирд╛рд╡рдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред
  2. 1 рдбреА, 2 рдбреА, 3 рдбреА, рдпрд╛ рдХреНрдпреВрдмрд┐рдХ рдмрдирд╛рд╡рдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдирд╛рд╡рдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВред
  3. рдмрдирд╛рд╡рдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдЫрд╡рд┐рдпрд╛рдВ рд╕реЗрдЯ рдХрд░реЗрдВред
  4. рддреИрдпрд╛рд░ рдХреА рдЬрд╛ рд░рд╣реА рд╡рд╕реНрддреБ рдкрд░ рд▓рд╛рдЧреВ рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдирд╛рд╡рдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдФрд░ рдореЛрдб рд╕рдВрд▓рдЧреНрди рдХрд░реЗрдВред

рдУрдПрд╕рдЬреА рдСрд╕реНрдЧ :: рдЯреЗрдХреНрд╕рдЪрд░ рдХреНрд▓рд╛рд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕рднреА рддрд░рд╣ рдХреЗ рдЯреЗрдХреНрд╕рдЪрд░ рдХреЛ рдЗрдирдХреИрдкреНрд╕ рдХрд░рддрд╛ рд╣реИред Subclasses osg :: Texture1D, osg :: Texture2D, osg :: Texture3D рдФрд░ osg :: TextureCubeMap рдХреЛ рдЗрд╕рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рдЬреЛ рдУрдкрдирдЬреАрдПрд▓ рдореЗрдВ рдЕрдкрдирд╛рдИ рдЧрдИ рд╡рд┐рднрд┐рдиреНрди рдмрдирд╛рд╡рдЯ рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВред

рд╕рдмрд╕реЗ рдЖрдо рдУрд╕реНрдЧ :: рдЯреЗрдХреНрд╕рдЪрд░ рдХреНрд▓рд╛рд╕ рд╡рд┐рдзрд┐ рд╕реЗрдЯрд┐рдореЗрдЬ () рд╣реИ, рдЬреЛ рдмрдирд╛рд╡рдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдЫрд╡рд┐ рдХреЛ рд╕реЗрдЯ рдХрд░рддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

 osg::ref_ptr<osg::Image> image = osgDB::readImageFile("picture.bmp"); osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D; texture->setImage(image.get()); 

рдпрд╛, рдЖрдк рдЯреЗрдХреНрд╕рдЪрд░ рдХреНрд▓рд╛рд╕ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдЗрдореЗрдЬ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реАрдзреЗ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

 osg::ref_ptr<osg::Image> image = osgDB::readImageFile("picture.bmp"); osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D(image.get()); 

GetImage () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдЫрд╡рд┐ рдХреЛ рдмрдирд╛рд╡рдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рдЕрдиреНрдп рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рдСрд╕реНрдЧ :: рдЬреНрдпреЛрдореЗрдЯреНрд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдХреЗ рд▓рд┐рдП рдмрдирд╛рд╡рдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╕реЗрдЯ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЗрди рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХреЛрдВ рдХрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдСрд╕ :: Vec2Array рдФрд░ osg :: Vec3Array рдРрд░реЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ setTexCoordArray () рд╡рд┐рдзрд┐ рд╕реЗ рд╣реЛрддрд╛ рд╣реИред

рдмрдирд╛рд╡рдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдмрдирд╛рд╡рдЯ рд╕реНрд▓реЙрдЯ рдирдВрдмрд░ (рдпреВрдирд┐рдЯ) рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ OSG рдПрдХ рд╣реА рдЬреНрдпрд╛рдорд┐рддрд┐ рдкрд░ рдХрдИ рдмрдирд╛рд╡рдЯреЛрдВ рдХреЛ рд╕реБрдкрд░рдЗрдореНрдкреЛрдЬрд╝ рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдПрдХрд▓ рдмрдирд╛рд╡рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЗрдХрд╛рдИ рд╕рдВрдЦреНрдпрд╛ рд╣рдореЗрд╢рд╛ 0. рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреА рдЗрдХрд╛рдИ 0 рдХреЗ рд▓рд┐рдП рдмрдирд╛рд╡рдЯ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИред

 osf::ref_ptr<osg::Vec2Array> texcoord = new osg::Vec2Array; texcoord->push_back( osg::Vec2(...) ); ... geom->setTexCoordArray(0, texcoord.get()); 

рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдмрдирд╛рд╡рдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рд╕реЗрдЯ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдмрдирд╛рд╡рдЯ рдореЛрдб (рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг GL_TEXTURE_2D рдореЗрдВ) рдХреЛ рдЪрд╛рд▓реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдЬреНрдпрд╛рдорд┐рддрд┐ рд╡рд╛рд▓реЗ рдЬреНрдпрд╛рдорд┐рддрд┐ рдпрд╛ рдиреЛрдб рдХреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

 geom->getOrCreateStateSet()->setTextureAttributeAndModes(texture.get()); 

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ OpenGL рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХреА рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдореЗрдореЛрд░реА рдореЗрдВ рдЫрд╡рд┐ рдбреЗрдЯрд╛ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд┐рд╕реНрдЯрдо рдбреЗрдЯрд╛ рдореЗрдВ рд╕реНрдерд┐рдд рд╕рдорд╛рди рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде osg :: Image рдСрдмреНрдЬреЗрдХреНрдЯред рдирддреАрдЬрддрди, рд╣рдо рдЗрд╕ рддрдереНрдп рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╣рдордиреЗ рдПрдХ рд╣реА рдбреЗрдЯрд╛ рдХреА рджреЛ рдкреНрд░рддрд┐рдпрд╛рдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рд╣реИрдВ, рдЬреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдореЛрд░реА рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд░рд╣реА рд╣реИред рдпрджрд┐ рдпрд╣ рдЪрд┐рддреНрд░ рдХрдИ рдмрдирд╛рд╡рдЯ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ OpenGL рджреНрд╡рд╛рд░рд╛ рд╡реАрдбрд┐рдпреЛ рдПрдбреЙрдкреНрдЯрд░ рдореЗрдореЛрд░реА рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдЗрд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдореЛрд░реА рд╕реЗ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдУрдПрд╕рдЬреА :: рдмрдирд╛рд╡рдЯ рд╡рд░реНрдЧ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╡рд┐рдзрд┐ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

 texture->setUnRefImageDataAfterApply( true ); 

3. рдПрдХ 2 рдбреА рдмрдирд╛рд╡рдЯ рдХреЛ рд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВ


рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рддрдХрдиреАрдХ 2 рдбреА рдЯреЗрдХреНрд╕рдЪрд░рд┐рдВрдЧ рд╣реИ - рдПрдХ рддреНрд░рд┐-рдЖрдпрд╛рдореА рд╕рддрд╣ рдХреЗ рдХрд┐рдирд╛рд░реЗ рдкрд░ рдПрдХ рджреЛ-рдЖрдпрд╛рдореА рдЫрд╡рд┐ (рдпрд╛ рдЫрд╡рд┐рдпрд╛рдВ) рдУрд╡рд░рд▓реЗрдЗрдВрдЧред рдЪрддреБрд╖реНрдХреЛрдгреАрдп рдмрд╣реБрднреБрдЬ рдореЗрдВ рдПрдХрд▓ рдмрдирд╛рд╡рдЯ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ

рдмрдирд╛рд╡рдЯ рдЙрджрд╛рд╣рд░рдг
main.h

 #ifndef MAIN_H #define MAIN_H #include <osg/Texture2D> #include <osg/Geometry> #include <osgDB/ReadFile> #include <osgViewer/Viewer> #endif 

main.cpp

 #include "main.h" int main(int argc, char *argv[]) { (void) argc; (void) argv; osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array; vertices->push_back( osg::Vec3(-0.5f, 0.0f, -0.5f) ); vertices->push_back( osg::Vec3( 0.5f, 0.0f, -0.5f) ); vertices->push_back( osg::Vec3( 0.5f, 0.0f, 0.5f) ); vertices->push_back( osg::Vec3(-0.5f, 0.0f, 0.5f) ); osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array; normals->push_back( osg::Vec3(0.0f, -1.0f, 0.0f) ); osg::ref_ptr<osg::Vec2Array> texcoords = new osg::Vec2Array; texcoords->push_back( osg::Vec2(0.0f, 0.0f) ); texcoords->push_back( osg::Vec2(0.0f, 1.0f) ); texcoords->push_back( osg::Vec2(1.0f, 1.0f) ); texcoords->push_back( osg::Vec2(1.0f, 0.0f) ); osg::ref_ptr<osg::Geometry> quad = new osg::Geometry; quad->setVertexArray(vertices.get()); quad->setNormalArray(normals.get()); quad->setNormalBinding(osg::Geometry::BIND_OVERALL); quad->setTexCoordArray(0, texcoords.get()); quad->addPrimitiveSet( new osg::DrawArrays(GL_QUADS, 0, 4) ); osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D; osg::ref_ptr<osg::Image> image = osgDB::readImageFile("../data/Images/lz.rgb"); texture->setImage(image.get()); osg::ref_ptr<osg::Geode> root = new osg::Geode; root->addDrawable(quad.get()); root->getOrCreateStateSet()->setTextureAttributeAndModes(0, texture.get()); osgViewer::Viewer viewer; viewer.setSceneData(root.get()); return viewer.run(); } 


рдЪреЗрд╣рд░реЗ рдХреЛ рдХреЛрдиреЗ рдФрд░ рдорд╛рдирджрдВрдб рдХреА рдПрдХ рд╕рд░рдгреА рдмрдирд╛рдПрдБ

 osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array; vertices->push_back( osg::Vec3(-0.5f, 0.0f, -0.5f) ); vertices->push_back( osg::Vec3( 0.5f, 0.0f, -0.5f) ); vertices->push_back( osg::Vec3( 0.5f, 0.0f, 0.5f) ); vertices->push_back( osg::Vec3(-0.5f, 0.0f, 0.5f) ); osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array; normals->push_back( osg::Vec3(0.0f, -1.0f, 0.0f) ); 

рдмрдирд╛рд╡рдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдПрдХ рд╕рд░рдгреА рдмрдирд╛рдПрдБ

 osg::ref_ptr<osg::Vec2Array> texcoords = new osg::Vec2Array; texcoords->push_back( osg::Vec2(0.0f, 0.0f) ); texcoords->push_back( osg::Vec2(0.0f, 1.0f) ); texcoords->push_back( osg::Vec2(1.0f, 1.0f) ); texcoords->push_back( osg::Vec2(1.0f, 0.0f) ); 

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

рдЗрд╕рдХреЗ рдмрд╛рдж, рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ, рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреЛ рд╡рд░реНрдЯрд┐рдХрд▓ рдХрд╛ рдПрдХ рд╕рд░рдгреА рдФрд░ рдорд╛рдирджрдВрдбреЛрдВ рдХрд╛ рдПрдХ рд╕рд░рдгреА рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ

 osg::ref_ptr<osg::Geometry> quad = new osg::Geometry; quad->setVertexArray(vertices.get()); quad->setNormalArray(normals.get()); quad->setNormalBinding(osg::Geometry::BIND_OVERALL); quad->setTexCoordArray(0, texcoords.get()); quad->addPrimitiveSet( new osg::DrawArrays(GL_QUADS, 0, 4) ); 

рдПрдХ рдмрдирд╛рд╡рдЯ рд╡рд╕реНрддреБ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдЫрд╡рд┐ рдХреЛ рд▓реЛрдб рдХрд░реЗрдВред

 osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D; osg::ref_ptr<osg::Image> image = osgDB::readImageFile("../data/Images/lz.rgb"); texture->setImage(image.get()); 

рджреГрд╢реНрдп рдХрд╛ рд░реВрдЯ рдиреЛрдб рдмрдирд╛рдПрдВ рдФрд░ рд╣рдо рд╡рд╣рд╛рдВ рдмрдирд╛рдИ рдЧрдИ рдЬреНрдпрд╛рдорд┐рддрд┐ рдбрд╛рд▓реЗрдВ

 osg::ref_ptr<osg::Geode> root = new osg::Geode; root->addDrawable(quad.get()); 

рдФрд░ рдЕрдВрдд рдореЗрдВ рдЯреЗрдХреНрд╕рдЪрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдЙрд╕ рдиреЛрдб рдкрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдЬреНрдпрд╛рдорд┐рддрд┐ рд░рдЦреА рдЧрдИ рд╣реИ

 root->getOrCreateStateSet()->setTextureAttributeAndModes(0, texture.get()); 



Osg :: Texture2D рд╡рд░реНрдЧ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдмрдирд╛рд╡рдЯ рдХреА рдЫрд╡рд┐ рдХрд╛ рдЖрдХрд╛рд░ рджреЛ рдХреА рд╢рдХреНрддрд┐ рдХреЗ рдЧреБрдгрдХ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 64x64 рдпрд╛ 256x512), рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрди рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рд╕реНрдХреЗрд▓ рдХрд░рдирд╛ рдЬреЛ рдЖрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдкрдпреБрдХреНрдд рд╣реИрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ OpenGL gluScitImage () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╡рд╣рд╛рдБ рдПрдХ setResizeNonPowerOfTwoHint () рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдЫрд╡рд┐ рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдХреБрдЫ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдбреЛрдВ рдХреЛ рджреЛ рдХреА рд╢рдХреНрддрд┐ рдХреА рдПрдХ рдЫрд╡рд┐ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрдмрдХрд┐ osg :: Texture2D рд╡рд░реНрдЧ рдПрдХ рдордирдорд╛рдирд╛ рдмрдирд╛рд╡рдЯ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

рдмрдирд╛рд╡рдЯ рд╕рдореНрдорд┐рд╢реНрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ


рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд╣рд╛ рд╣реИ, рдмрдирд╛рд╡рдЯ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ 0 рд╕реЗ 1. рдмрд┐рдВрджреБ (0, 0) рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╣реЛрддреЗ рд╣реИрдВ, рдЫрд╡рд┐ рдХреЗ рдКрдкрд░реА рдмрд╛рдПрдВ рдХреЛрдиреЗ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдмрд┐рдВрджреБ (1, 1) рдирд┐рдЪрд▓реЗ рджрд╛рдПрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрдирд╛рд╡рдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ?

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

рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ osg :: Texture class рдХреЗ setWrap () рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рд╡рд┐рдзрд┐ рдЕрдХреНрд╖ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рд▓реЗ рдЬрд╛рддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдорд┐рд╢реНрд░рдг рдореЛрдб рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

 //     s texture->setWrap( osg::Texture::WRAP_S, osg::Texture::REPEAT ); //     r texture->setWrap( osg::Texture::WRAP_R, osg::Texture::REPEAT ); 

рдпрд╣ рдХреЛрдб рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрд╕ рдФрд░ рдЖрд░ рдХреБрд▓реНрд╣рд╛рдбрд╝рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдмрдирд╛рд╡рдЯ рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЬрди рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдмрдирд╛рд╡рдЯ рдХрд╛ рдорд╛рди рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред рдмрдирд╛рд╡рдЯ рдорд╛рдирдЪрд┐рддреНрд░рдг рдореЛрдб рдХреА рдкреВрд░реА рд╕реВрдЪреА:

  1. REPEAT - рдмрдирд╛рд╡рдЯ рджреЛрд╣рд░рд╛рдПрдВред
  2. MIRROR - рдЗрд╕реЗ рджреЛрд╣рд░рд╛рддреЗ рд╣реБрдП, рдмрдирд╛рд╡рдЯ рдХреЛ рджреЛрд╣рд░рд╛рдПрдВред
  3. CLAMP_TO_EDGE - рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдЬреЛ 0 рд╕реЗ 1 рдХреЗ рдкрд╛рд░ рдЬрд╛рддреЗ рд╣реИрдВ, рдмрдирд╛рд╡рдЯ рдХреЗ рд╕рдВрдЧрдд рдХрд┐рдирд╛рд░реЗ рдкрд░ рддрдбрд╝рдХ рдЬрд╛рддреЗ рд╣реИрдВред
  4. CLAMP_TO_BORDER - рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдЬреЛ 0 рд╕реЗ 1 рддрдХ рдЬрд╛рддреЗ рд╣реИрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕реАрдорд╛ рд░рдВрдЧ рджреЗрдЧрд╛ред

4. рдмрдирд╛рд╡рдЯ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдкрд╛рджрди


рдмрдирд╛рд╡рдЯ рд░реЗрдВрдбрд░рд┐рдВрдЧ рддрдХрдиреАрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдХреБрдЫ рддреНрд░рд┐-рдЖрдпрд╛рдореА рдЙрдк-рджреГрд╢реНрдп рдпрд╛ рдореЙрдбрд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирд╛рд╡рдЯ рдмрдирд╛рдиреЗ рдФрд░ рдЗрд╕реЗ рдореБрдЦреНрдп рджреГрд╢реНрдп рдореЗрдВ рд╕рддрд╣ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдПрдХ рд╕рдорд╛рди рддрдХрдиреАрдХ рдХреЛ рдЕрдХреНрд╕рд░ рдмрдирд╛рд╡рдЯ "рдмреЗрдХрд┐рдВрдЧ" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдПрдХ рдмрдирд╛рд╡рдЯ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдмреЗрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рддреАрди рдЪрд░рдг рдкреВрд░реЗ рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ:

  1. рдЗрд╕рдореЗрдВ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЗрдХреНрд╕рдЪрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВред
  2. рдПрдХ рдмрдирд╛рд╡рдЯ рдореЗрдВ рджреГрд╢реНрдп рд░реЗрдВрдбрд░ рдХрд░реЗрдВред
  3. рдЗрдЪреНрдЫрд┐рдд рдмрдирд╛рд╡рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рд╣рдореЗрдВ рдПрдХ рдЦрд╛рд▓реА рдмрдирд╛рд╡рдЯ рд╡рд╕реНрддреБ рдмрдирд╛рдиреА рдЪрд╛рд╣рд┐рдПред рдУрдПрд╕рдЬреА рдЖрдкрдХреЛ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдЖрдХрд╛рд░ рдХреА рдПрдХ рдЦрд╛рд▓реА рдмрдирд╛рд╡рдЯ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред SetTextureSize () рд╡рд┐рдзрд┐ рдЖрдкрдХреЛ рдмрдирд╛рд╡рдЯ рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд░рд╛рдореАрдЯрд░ (3 рдбреА рдмрдирд╛рд╡рдЯ рдХреЗ рд▓рд┐рдП) рдХреА рдЧрд╣рд░рд╛рдИ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред

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

 camera->attach( osg::Camera::COLOR_BUFFER, texture.get() ); 

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

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

5. рдмрдирд╛рд╡рдЯ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг


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

рдЯреЗрдХреНрд╕рд░реЗрдВрдбрд░ рдЙрджрд╛рд╣рд░рдг
main.h

 #ifndef MAIN_H #define MAIN_H #include <osg/Camera> #include <osg/Texture2D> #include <osg/MatrixTransform> #include <osgDB/ReadFile> #include <osgGA/TrackballManipulator> #include <osgViewer/Viewer> #endif 

main.cpp

 #include "main.h" //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ osg::Geometry *createQuad(const osg::Vec3 &pos, float w, float h) { osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array; vertices->push_back( pos + osg::Vec3( w / 2, 0.0f, -h / 2) ); vertices->push_back( pos + osg::Vec3( w / 2, 0.0f, h / 2) ); vertices->push_back( pos + osg::Vec3(-w / 2, 0.0f, h / 2) ); vertices->push_back( pos + osg::Vec3(-w / 2, 0.0f, -h / 2) ); osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array; normals->push_back(osg::Vec3(0.0f, -1.0f, 0.0f)); osg::ref_ptr<osg::Vec2Array> texcoords = new osg::Vec2Array; texcoords->push_back( osg::Vec2(1.0f, 1.0f) ); texcoords->push_back( osg::Vec2(1.0f, 0.0f) ); texcoords->push_back( osg::Vec2(0.0f, 0.0f) ); texcoords->push_back( osg::Vec2(0.0f, 1.0f) ); osg::ref_ptr<osg::Geometry> quad = new osg::Geometry; quad->setVertexArray(vertices.get()); quad->setNormalArray(normals.get()); quad->setNormalBinding(osg::Geometry::BIND_OVERALL); quad->setTexCoordArray(0, texcoords.get()); quad->addPrimitiveSet(new osg::DrawArrays(GL_QUADS, 0, 4)); return quad.release(); } //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ int main(int argc, char *argv[]) { (void) argc; (void) argv; osg::ref_ptr<osg::Node> sub_model = osgDB::readNodeFile("../data/cessna.osg"); osg::ref_ptr<osg::MatrixTransform> transform1 = new osg::MatrixTransform; transform1->setMatrix(osg::Matrix::rotate(0.0, osg::Vec3(0.0f, 0.0f, 1.0f))); transform1->addChild(sub_model.get()); osg::ref_ptr<osg::Geode> model = new osg::Geode; model->addChild(createQuad(osg::Vec3(0.0f, 0.0f, 0.0f), 2.0f, 2.0f)); int tex_widht = 1024; int tex_height = 1024; osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D; texture->setTextureSize(tex_widht, tex_height); texture->setInternalFormat(GL_RGBA); texture->setFilter(osg::Texture2D::MIN_FILTER, osg::Texture2D::LINEAR); texture->setFilter(osg::Texture2D::MAG_FILTER, osg::Texture2D::LINEAR); model->getOrCreateStateSet()->setTextureAttributeAndModes(0, texture.get()); osg::ref_ptr<osg::Camera> camera = new osg::Camera; camera->setViewport(0, 0, tex_widht, tex_height); camera->setClearColor(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f)); camera->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); camera->setRenderOrder(osg::Camera::PRE_RENDER); camera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT); camera->attach(osg::Camera::COLOR_BUFFER, texture.get()); camera->setReferenceFrame(osg::Camera::ABSOLUTE_RF); camera->addChild(transform1.get()); osg::ref_ptr<osg::Group> root = new osg::Group; root->addChild(model.get()); root->addChild(camera.get()); osgViewer::Viewer viewer; viewer.setSceneData(root.get()); viewer.setCameraManipulator(new osgGA::TrackballManipulator); viewer.setUpViewOnSingleScreen(0); camera->setProjectionMatrixAsPerspective(30.0, static_cast<double>(tex_widht) / static_cast<double>(tex_height), 0.1, 1000.0); float dist = 100.0f; float alpha = 10.0f * 3.14f / 180.0f; osg::Vec3 eye(0.0f, -dist * cosf(alpha), dist * sinf(alpha)); osg::Vec3 center(0.0f, 0.0f, 0.0f); osg::Vec3 up(0.0f, 0.0f, -1.0f); camera->setViewMatrixAsLookAt(eye, center, up); float phi = 0.0f; float delta = -0.01f; while (!viewer.done()) { transform1->setMatrix(osg::Matrix::rotate(static_cast<double>(phi), osg::Vec3(0.0f, 0.0f, 1.0f))); viewer.frame(); phi += delta; } return 0; } 


рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрд▓рдЧ рдореБрдлреНрдд рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВ

 osg::Geometry *createQuad(const osg::Vec3 &pos, float w, float h) { osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array; vertices->push_back( pos + osg::Vec3( w / 2, 0.0f, -h / 2) ); vertices->push_back( pos + osg::Vec3( w / 2, 0.0f, h / 2) ); vertices->push_back( pos + osg::Vec3(-w / 2, 0.0f, h / 2) ); vertices->push_back( pos + osg::Vec3(-w / 2, 0.0f, -h / 2) ); osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array; normals->push_back(osg::Vec3(0.0f, -1.0f, 0.0f)); osg::ref_ptr<osg::Vec2Array> texcoords = new osg::Vec2Array; texcoords->push_back( osg::Vec2(1.0f, 1.0f) ); texcoords->push_back( osg::Vec2(1.0f, 0.0f) ); texcoords->push_back( osg::Vec2(0.0f, 0.0f) ); texcoords->push_back( osg::Vec2(0.0f, 1.0f) ); osg::ref_ptr<osg::Geometry> quad = new osg::Geometry; quad->setVertexArray(vertices.get()); quad->setNormalArray(normals.get()); quad->setNormalBinding(osg::Geometry::BIND_OVERALL); quad->setTexCoordArray(0, texcoords.get()); quad->addPrimitiveSet(new osg::DrawArrays(GL_QUADS, 0, 4)); return quad.release(); } 

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

рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╢рд░реАрд░ рдореЗрдВ, рд╕реЗрд╕рдирд╛ рдХреЗ рдореЙрдбрд▓ рдХреЛ рд▓реЛрдб рдХрд░реЗрдВ

 osg::ref_ptr<osg::Node> sub_model = osgDB::readNodeFile("../data/cessna.osg"); 

рдЗрд╕ рдореЙрдбрд▓ рдХреЛ рдЪреЗрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Z рдЕрдХреНрд╖ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд░реЛрдЯреЗрд╢рди рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдмрдирд╛рдПрдБ рдФрд░ рдЖрд░рдВрдн рдХрд░реЗрдВ

 osg::ref_ptr<osg::MatrixTransform> transform1 = new osg::MatrixTransform; transform1->setMatrix(osg::Matrix::rotate(0.0, osg::Vec3(0.0f, 0.0f, 1.0f))); transform1->addChild(sub_model.get()); 

рдЕрдм рдореБрдЦреНрдп рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбрд▓ рдмрдирд╛рдПрдВ - рдПрдХ рд╡рд░реНрдЧ рдЬрд┐рд╕ рдкрд░ рд╣рдо рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдВрдЧреЗ

 osg::ref_ptr<osg::Geode> model = new osg::Geode; model->addChild(createQuad(osg::Vec3(0.0f, 0.0f, 0.0f), 2.0f, 2.0f)); 

рдЖрд░рдЬреАрдмреАрдП рдкрд┐рдХреНрд╕реЗрд▓ рдкреНрд░рд╛рд░реВрдк рдХреЗ рд╕рд╛рде 1024x1024 рдкрд┐рдХреНрд╕реЗрд▓ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦрд╛рд▓реА рдмрдирд╛рд╡рдЯ рдмрдирд╛рдПрдВ (рдЕрд▓реНрдлрд╛ рдЪреИрдирд▓ рдХреЗ рд╕рд╛рде 32-рдмрд┐рдЯ рддреАрди-рдШрдЯрдХ рд░рдВрдЧ)

 int tex_widht = 1024; int tex_height = 1024; osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D; texture->setTextureSize(tex_widht, tex_height); texture->setInternalFormat(GL_RGBA); texture->setFilter(osg::Texture2D::MIN_FILTER, osg::Texture2D::LINEAR); texture->setFilter(osg::Texture2D::MAG_FILTER, osg::Texture2D::LINEAR); 

рдЗрд╕ рдмрдирд╛рд╡рдЯ рдХреЛ рдЪреМрдХреЛрд░ рдореЙрдбрд▓ рдкрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВред

 model->getOrCreateStateSet()->setTextureAttributeAndModes(0, texture.get()); 

рдлрд┐рд░ рдПрдХ рдХреИрдорд░рд╛ рдмрдирд╛рдПрдВ рдЬреЛ рдмрдирд╛рд╡рдЯ рдХреЛ рд╕реЗрдВрдХ рджреЗрдЧрд╛

 osg::ref_ptr<osg::Camera> camera = new osg::Camera; camera->setViewport(0, 0, tex_widht, tex_height); camera->setClearColor(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f)); camera->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

рдХреИрдорд░рд╛ рд╡реНрдпреВрдкреЛрд░реНрдЯ рдмрдирд╛рд╡рдЯ рдХреЗ рд╕рдорд╛рди рдЖрдХрд╛рд░ рдХрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрдХреНрд░реАрди рдФрд░ рд╕рдлрд╛рдИ рдорд╛рд╕реНрдХ рдХреЛ рд╕рд╛рдл рдХрд░рддреЗ рд╕рдордп рдкреГрд╖реНрдарднреВрдорд┐ рдХрд╛ рд░рдВрдЧ рд╕реЗрдЯ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ, рд░рдВрдЧ рдмрдлрд░ рдФрд░ рдЧрд╣рд░рд╛рдИ рдмрдлрд░ рджреЛрдиреЛрдВ рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВред рдЕрдЧрд▓рд╛, рдмрдирд╛рд╡рдЯ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрдорд░реЗ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ

 camera->setRenderOrder(osg::Camera::PRE_RENDER); camera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT); camera->attach(osg::Camera::COLOR_BUFFER, texture.get()); 

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

 camera->setReferenceFrame(osg::Camera::ABSOLUTE_RF); camera->addChild(transform1.get()); 

рдореБрдЦреНрдп рдореЙрдбрд▓ (рд╡рд░реНрдЧ) рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рдХреИрдорд░рд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рд╡рдЯ рдЬреЛрдбрд╝рдХрд░ рдПрдХ рд░реВрдЯ рд╕рдореВрд╣ рдиреЛрдб рдмрдирд╛рдПрдВ

 osg::ref_ptr<osg::Group> root = new osg::Group; root->addChild(model.get()); root->addChild(camera.get()); 

рдПрдХ рджрд░реНрд╢рдХ рдмрдирд╛рдПрдВ рдФрд░ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВ

 osgViewer::Viewer viewer; viewer.setSceneData(root.get()); viewer.setCameraManipulator(new osgGA::TrackballManipulator); viewer.setUpViewOnSingleScreen(0); 

рдХреИрдорд░реЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХреНрд╖реЗрдкрдг рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╕реЗрдЯ рдХрд░реЗрдВ - рдХрддрд░рди рдкрд┐рд░рд╛рдорд┐рдб рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рдкреНрд░рдХреНрд╖реЗрдкрдг

 camera->setProjectionMatrixAsPerspective(30.0, static_cast<double>(tex_widht) / static_cast<double>(tex_height), 0.1, 1000.0); 

рд╣рдордиреЗ рдПрдХ рджреГрд╢реНрдп рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдЙрдк-рд╕реЗрд╕рдирд╛ рдХреА рдЙрддреНрдкрддреНрддрд┐ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдХреИрдорд░реЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ

 float dist = 100.0f; float alpha = 10.0f * 3.14f / 180.0f; osg::Vec3 eye(0.0f, -dist * cosf(alpha), dist * sinf(alpha)); osg::Vec3 center(0.0f, 0.0f, 0.0f); osg::Vec3 up(0.0f, 0.0f, -1.0f); camera->setViewMatrixAsLookAt(eye, center, up); 

рдЕрдВрдд рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдореЗрдВ рдЬреЗрдб рдЕрдХреНрд╖ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╡рд┐рдорд╛рди рдХреЗ рд░реЛрдЯреЗрд╢рди рдХреЗ рдХреЛрдг рдХреЛ рдмрджрд▓рддреЗ рд╣реБрдП, рджреГрд╢реНрдп рдХреЛ рдЪреЗрддрди рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ

 float phi = 0.0f; float delta = -0.01f; while (!viewer.done()) { transform1->setMatrix(osg::Matrix::rotate(static_cast<double>(phi), osg::Vec3(0.0f, 0.0f, 1.0f))); viewer.frame(); phi += delta; } 

рдирддреАрдЬрддрди, рд╣рдореЗрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рддрд╕реНрд╡реАрд░ рдорд┐рд▓рддреА рд╣реИ



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

6. рд░реЗрдВрдбрд░рд┐рдВрдЧ рд░рд┐рдЬрд▓реНрдЯ рдХреЛ рдлрд╛рдЗрд▓ рдореЗрдВ рд╕реЗрд╡ рдХрд░рдирд╛


OSG рдХреИрдорд░реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдСрдЧ :: рдЗрдореЗрдЬ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлреНрд░реЗрдо рдмрдлрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЗрдореЗрдЬ рдбреЗрдЯрд╛ рдмрдлрд░ рдореЗрдВ рд╕рд╣реЗрдЬрддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рдпрд╣ рдбреЗрдЯрд╛ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рд╣реИ osg :: writeImageFile () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбрд┐рд╕реНрдХ рдкрд░

 osg::ref_ptr<osg::Image> image = new osg::Image; image->allocateImage( width, height, 1, GL_RGBA, GL_UNSIGNED_BYTE ); camera->attach( osg::Camera::COLOR_BUFFER, image.get() ); ... osgDB::writeImageFile( *image, "saved_image.bmp" ); 

рдирд┐рд╖реНрдХрд░реНрд╖


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

рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП ...

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


All Articles