Ultramodern OpenGLред рднрд╛рдЧ 1



рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░ред рдУрдкрдирдЬреАрд▓ рд╡рд┐рд╖рдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЬрд╛рдирдиреЗ рд╡рд╛рд▓реЗ рд╣рд░ рдХреЛрдИ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд▓реЗрдЦ рдФрд░ рдкрд╛рдареНрдпрдХреНрд░рдо рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрдИ рдЖрдзреБрдирд┐рдХ рдПрдкреАрдЖрдИ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдЖрдорддреМрд░ рдкрд░ glBegin рдФрд░ glEnd рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рд╕рдВрд╕реНрдХрд░рдг 4 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдирдП рдПрдкреАрдЖрдИ рдХреА рдХреБрдЫ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред рд▓реЗрдЦ рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ

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

рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ OpenGL рдХреЗ рдЕрдиреБрдХреВрд▓рди рдФрд░ рдбреНрд░реЙ рдХреЙрд▓реНрд╕ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦреВрдВрдЧрд╛ред

рдЪрд▓реЛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдУ!

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ - рдЖрдзреБрдирд┐рдХ рдУрдкрдирдЬреАрдПрд▓ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдХреНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ - рдУрдкрдирдЬреАрдПрд▓ рдкрд░ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЖрдзреБрдирд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг

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


рдбреАрдПрд╕рдП (рдбрд╛рдпрд░реЗрдХреНрдЯ рд╕реНрдЯреЗрдЯ рдПрдХреНрд╕реЗрд╕)


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

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ, OpenGL рдХрдИ рд░реЗрдбрд┐рдпреЛ рдмрдЯрди рдХреЗ рд╕рд╛рде рдПрдХ рдПрдкреАрдЖрдИ рд╣реИ - glActiveTexture , glBindTexture , рдЖрджрд┐ред

рдпрд╣рд╛рдБ рд╕реЗ рд╣рдореЗрдВ рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ :

  • рдЪрдпрдирдХрд░реНрддрд╛ рдФрд░ рд╡рд░реНрддрдорд╛рди рд░рд╛рдЬреНрдп рд░рд╛рдЬреНрдп рдореЗрдВ рдЧрд╣рд░рд╛ рдмрджрд▓рд╛рд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  • рдмрдирд╛рд╡рдЯ рдХреЗ рд▓рд┐рдП рдлрд╝рд┐рд▓реНрдЯрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд░рд┐рдп рдЗрдХрд╛рдИ рдХреЛ рдмрд╛рдБрдзрдирд╛ / рдмрджрд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
  • рд░рд╛рдЬреНрдп рдкреНрд░рдмрдВрдзрди рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЖрд╡реЗрджрди рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдмрдврд╝рддреА рд╣реИ
  • рдЕрдЬреНрдЮрд╛рдд рд░рд╛рдЬреНрдп рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ
  • рд░рд╛рдЬреНрдп рдХреЛ рдмрдЪрд╛рдиреЗ / рдмрд╣рд╛рд▓ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ

рдЦреНрд░реЛрдиреЛрд╕ рд╕рдореВрд╣ рдиреЗ рд╣рдореЗрдВ рдХреНрдпрд╛ рдкреЗрд╢рдХрд╢ рдХреА рдФрд░ рдбреАрдПрд╕рдП рдХреИрд╕реЗ рдорджрдж рдХрд░рддрд╛ рд╣реИ?

  • рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рд╕реАрдзреЗ рдСрдмреНрдЬреЗрдХреНрдЯ / рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ
  • рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдмрдирд╛рд╡рдЯ рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдмрдирд╛рд╡рдЯ рдлрд╝рд┐рд▓реНрдЯрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдирд╣реАрдВред
  • рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЗрдХрд╛рдИ рдХреЛ рдПрдХ рдмрдирд╛рд╡рдЯ рдмрд╛рдВрдзрддрд╛ рд╣реИ, рд╕рдХреНрд░рд┐рдп рдХреЛ рдирд╣реАрдВ
  • рдмрд╣реБрдд рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдЬреЛрдбрд╝рддрд╛ рд╣реИ
  • OpenGL 1.x рддрдХ рдЪреАрдЬреЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИ
  • рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдЬреЛрдбрд╝рддрд╛ рд╣реИред

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдПрдХ рдбреАрдПрд╕рдП рдЧреИрд░-рдкреНрд░рддрд┐рдкрд╛рджрди рдФрд░ рд░рд╛рдЬреНрдп-рдмрджрд▓рддреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╢реВрдиреНрдп рддрдХ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ ... рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдЯреАрдХ рдирд╣реАрдВ рд╣реИред

рдЕрдм рдореИрдВ рдХреБрдЫ рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛, рдореИрдВрдиреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛, рдореИрдВ рд╡рд┐рдХрд┐ рдкрд░ рд▓рд┐рдВрдХ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред

  • glCreateTextures glGenTextures + glBindTexture (рдЖрд░рдВрднреАрдХрд░рдг) рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ ред
    рдпрд╣ рдерд╛:
    glGenTextures(1, &name); glBindTexture(GL_TEXTURE_2D, name); 
    рдпрд╣ рдмрди рдЧрдпрд╛:
     glCreateTextures(GL_TEXTURE_2D, 1, &name); 
  • glTextureParameterX glTexParameterX рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ
     glGenTextures(1, &name); glBindTexture(GL_TEXTURE_2D, name); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, width, height); glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels); 
    рдЕрдм рд╣рдо рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦреЗрдВрдЧреЗ:
     glCreateTextures(GL_TEXTURE_2D, 1, &name); glTextureParameteri(name, GL_TEXTURE_WRAP_S, GL_CLAMP); glTextureParameteri(name, GL_TEXTURE_WRAP_T, GL_CLAMP); glTextureParameteri(name, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTextureParameteri(name, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTextureStorage2D(name, 1, GL_RGBA8, width, height); glTextureSubImage2D(name, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels); 
  • glBindTextureUnit glActiveTexture + glBindTexture рдХреЛ рдмрджрд▓реЗрдВ
    рдпрд╣рд╛рдБ рд╣рдордиреЗ рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛:
     glActiveTexture(GL_TEXTURE0 + 3); glBindTexture(GL_TEXTURE_2D, name); 
    рдЕрдм:
     glBindTextureUnit(3, name); 

рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдиреЗ glTextureImage рдХреЛ рднреА рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдпрд╛, рдЕрдм рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

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

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

рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдиреЗ рдлреНрд░реЗрдо рдмрдлрд░ рдХреЛ рднреА рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдпрд╛:


рдпреЗ рд╕рднреА рдмрджрд▓реА рд╣реБрдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВред рдЕрдЧрд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рдмрдлрд╝рд░реНрд╕ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рд╣реИрдВ:


рдпрд╣рд╛рдБ DSA рд╕рдорд░реНрдерди рдореЗрдВ рдЕрдм рдХреНрдпрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ:

  • рд╡рд░реНрдЯреЗрдХреНрд╕ рдРрд░реЗ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕
  • рдлрд╝реНрд░реЗрдордмрдлрд╝рд░ рдСрдмреНрдЬреЗрдХреНрдЯ
  • рдкреНрд░реЛрдЧреНрд░рд╛рдо рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕
  • рдмрдлрд░ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕
  • рдореИрдЯреНрд░рд┐рдХреНрд╕ рдвреЗрд░
  • рдмрд╣реБрдд рд╕рд╛рд░реА рдкреБрд░рд╛рдиреА рдмрд╛рддреЗрдВ

рдбрд┐рдмрдЧ


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



рд╣рдореЗрдВ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рджреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: glEnable & glDebugMessageCallback , рдХрд╣реАрдВ рднреА рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред

 glEnable(GL_DEBUG_OUTPUT); glDebugMessageCallback(message_callback, nullptr); 

рдЕрдм рд╣рдо рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВрдЧреЗ:

 void callback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, GLchar const* message, void const* user_param) { auto source_str = [source]() -> std::string { switch (source) { case GL_DEBUG_SOURCE_API: return "API"; case GL_DEBUG_SOURCE_WINDOW_SYSTEM: return "WINDOW SYSTEM"; case GL_DEBUG_SOURCE_SHADER_COMPILER: return "SHADER COMPILER"; case GL_DEBUG_SOURCE_THIRD_PARTY: return "THIRD PARTY"; case GL_DEBUG_SOURCE_APPLICATION: return "APPLICATION"; case GL_DEBUG_SOURCE_OTHER: return "OTHER"; default: return "UNKNOWN"; } }(); auto type_str = [type]() { switch (type) { case GL_DEBUG_TYPE_ERROR: return "ERROR"; case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: return "DEPRECATED_BEHAVIOR"; case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: return "UNDEFINED_BEHAVIOR"; case GL_DEBUG_TYPE_PORTABILITY: return "PORTABILITY"; case GL_DEBUG_TYPE_PERFORMANCE: return "PERFORMANCE"; case GL_DEBUG_TYPE_MARKER: return "MARKER"; case GL_DEBUG_TYPE_OTHER: return "OTHER"; default: return "UNKNOWN"; } }(); auto severity_str = [severity]() { switch (severity) { case GL_DEBUG_SEVERITY_NOTIFICATION: return "NOTIFICATION"; case GL_DEBUG_SEVERITY_LOW: return "LOW"; case GL_DEBUG_SEVERITY_MEDIUM: return "MEDIUM"; case GL_DEBUG_SEVERITY_HIGH: return "HIGH"; default: return "UNKNOWN"; } }(); std::cout << source_str << ", " << type_str << ", " << severity_str << ", " << id << ": " << message << std::endl; } 

рд╣рдо glDebugMessageControl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛ рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдлрд╝рд┐рд▓реНрдЯрд░ рд╕реНрд░реЛрдд / рдкреНрд░рдХрд╛рд░ / рдорд╣рддреНрд╡ рдпрд╛ рдЙрдирдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рджреНрд╡рд╛рд░рд╛ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рджрд╛рдпрд░реЗ рдореЗрдВ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░реЗрдВ:

 glPushDebugGroup( GL_DEBUG_SOURCE_APPLICATION, DEPTH_FILL_ID, 11, тАЬDepth FillтАЭ); //  Render_Depth_Only_Pass(); //  glPopDebugGroup(); //  

рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рдХреНрд░рдо рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХреЗрдВ, рд╕рд╛рде рд╣реА рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд╕рдордп рд╕реНрдЯреИрдХ рдкрд░ рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕реНрдерд╛рди рднреА рдвреВрдВрдв рд╕рдХреЗрдВред рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓рддрд╛ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); 

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

SSO (рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢реЗрдбрд░ рдСрдмреНрдЬреЗрдХреНрдЯ)


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


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

 GLuint pipe = GL_NONE; // Create shaders GLuint fprog = glCreateShaderProgramv( GL_FRAGMENT_SHADER, 1, &text); GLuint vprog = glCreateShaderProgramv( GL_VERTEX_SHADER, 1, &text); // Bind pipeline glGenProgramPipelines( 1, &pipe); glBindProgramPipelines( pipe); // Bind shaders glUseProgramStages( pipe, GL_FRAGMENT_SHADER_BIT, fprog); glUseProgramStages( pipe, GL_VERTEX_SHADER_BIT, vprog); 

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ glCreateProgramPipelines рдПрдХ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдЬреЗрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИ, glCreateShaderProgramv , рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реНрд░реЛрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╢реЗрдбрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЬреЗрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИ, рд▓рд┐рдВрдХ рдХрд░рддрд╛ рд╣реИ рдФрд░ glUreatProgramStages рдкрд╛рдЗрдк рд▓рд╛рдЗрди рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реНрдЯреЗрдкреНрд╕ рдХреЛ рдЕрдЯреИрдЪ рдХрд░рддрд╛ рд╣реИред glBindProgramPipeline - рдПрдХ рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рдПрдХ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред

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

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

рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдмреНрд▓реЙрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдПрдХ рд╡рд┐рдХреА рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рд╡рд░реНрдЯреЗрдХреНрд╕:

 out gl_PerVertex { vec4 gl_Position; float gl_PointSize; float gl_ClipDistance[]; }; 

рдЯреЗрд╕реВрд▓реЗрд╢рди рдирд┐рдпрдВрддреНрд░рдг:
 out gl_PerVertex { vec4 gl_Position; float gl_PointSize; float gl_ClipDistance[]; } gl_out[]; 

рдЯреЗрд╕реЗрд▓реЗрд╢рди рдореВрд▓реНрдпрд╛рдВрдХрди:
 out gl_PerVertex { vec4 gl_Position; float gl_PointSize; float gl_ClipDistance[]; }; 

рдЬреНрдпрд╛рдорд┐рддрд┐:
 out gl_PerVertex { vec4 gl_Position; float gl_PointSize; float gl_ClipDistance[]; }; 

рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдореЙрдбреНрдпреВрд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ рдПрдХ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рд╡рд░реНрдЯреЗрдХреНрд╕ рд╢реЗрдбрд░ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реНрдерд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:

 #version 450 out gl_PerVertex { vec4 gl_Position; }; layout (location = 0) in vec3 position; layout (location = 1) in vec3 color; layout (location = 0) out v_out { vec3 color; } v_out; void main() { v_out.color = color; gl_Position = vec4(position, 1.0); } 

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


All Articles