LWJGL рдкрд░ рдЧреЗрдо рд▓рд┐рдЦрдирд╛

LWJGL # 1 рдкрд░ рдПрдХ рдЧреЗрдо рдмрдирд╛рдирд╛


рдПрдХ рдЦреЗрд▓ рд▓рд┐рдЦрдирд╛ рдПрдХ рдЬрдЯрд┐рд▓ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реВрдБ рдХрд┐ LWJGL рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рд░рд▓ 3D рдЬрд╛рд╡рд╛ рдЧреЗрдо рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдЕрдкрдирд╛ рдЦреЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:


  • рдЬрд╛рд╡рд╛ рдореЗрдВ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ (рдПрдХ рдЖрд╡рд╢реНрдпрдХ рдиреНрдпреВрдирддрдо: рд╢рд░реНрддреЛрдВ, рдЫреЛрд░реЛрдВ, рддрд╛рд░реЛрдВ, рд╕рд░рдгрд┐рдпреЛрдВ, рдХрд╛рд░реНрдпреЛрдВ, рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╕рдордЭрдирд╛)
  • рд╡рд┐рдХрд╛рд╕ рдкрд░реНрдпрд╛рд╡рд░рдг (рдореИрдВ рдЧреНрд░рд╣рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛)
  • LWJGL рдкреБрд╕реНрддрдХрд╛рд▓рдп
  • OpengGL рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб 3.3 рд╕реЗ рдХрдо рдирд╣реАрдВ рд╣реИ
  • рдЦрд╛рд▓реА рд╕рдордп
  • рд╡рд┐рдЪрд╛рд░

рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ, рдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИред

рдПрдХ рдХрджрдо, рддреИрдпрд╛рд░реА


рдХреИрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдЧреНрд░рд╣рдг

3D рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА LWJGL 2.9.3 рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ, рдЗрд╕реЗ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ ред

рд╕реНрд▓рд┐рдХ-рдЙрдкрдпреЛрдЧ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ, рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЬреЛ рд▓реЛрдбрд┐рдВрдЧ рдмрдирд╛рд╡рдЯ рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред

рджреЛ рдХрджрдо, рдЬрд╛рдБрдЪ рдХрд░реЗрдВ


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореБрдЦреНрдп рдкреИрдХреЗрдЬ рдореЗрдВ рдореБрдЦреНрдп рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ, рдЗрд╕рдореЗрдВ рдирд┐рдореНрди рдХреЛрдб рдбрд╛рд▓реЗрдВ:



рдпрджрд┐ рдЗрдирдкреБрдЯ рд╡рд╛рд▓реА рд░реЗрдЦрд╛ рдХреЛ рд▓рд╛рд▓ рд░рдВрдЧ рдореЗрдВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ (рд╕реНрдХреНрд░реАрди рдкрд░ рдкреАрд▓реЗ рд░рдВрдЧ рдореЗрдВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЕрднреА рддрдХ рдХреЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред

рдЪрд░рдг рддреАрди, рдкреНрд░рджрд░реНрд╢рди


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдореБрдЦреНрдп рд╡рд░реНрдЧ рднрд░реЗрдВ:

рдХреЛрдб рд╢реБрд░реВ рдХрд░реЗрдВ
import org.lwjgl.LWJGLException; import org.lwjgl.opengl.Display; import org.lwjgl.opengl.DisplayMode; public class Main { static int width = 800, height = 600; static DisplayMode mainDisplayMode = new DisplayMode(width, height); static boolean running = true; static void update() { if (Display.wasResized()) { width = Display.getWidth(); height = Display.getHeight(); } Display.update(); Display.sync(60); if (Display.isCloseRequested()) { running = false; } } public static void main(String[] args) { try { Display.setLocation( (Display.getDesktopDisplayMode().getWidth() - mainDisplayMode.getWidth()) / 2, Display.getDesktopDisplayMode().getHeight() - mainDisplayMode.getHeight()) / 2); Display.setResizable(true); Display.setVSyncEnabled(true); Display.setDisplayMode(mainDisplayMode); Display.create(); } catch (LWJGLException ex) { System.err.println(ex.getStackTrace().toString()); Display.destroy(); System.exit(1); } while (running) { update(); } Display.destroy(); System.exit(0); } } 


рддреЛ рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ:

 Display.setLocation( (Display.getDesktopDisplayMode().getWidth() - mainDisplayMode.getWidth()) / 2, (Display.getDesktopDisplayMode().getHeight() - mainDisplayMode.getHeight()) / 2); Display.setResizable(true); Display.setVSyncEnabled(true); Display.setDisplayMode(mainDisplayMode); Display.create(); 

рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ:

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

 static void update() { if (Display.wasResized()) { width = Display.getWidth(); height = Display.getHeight(); } Display.update(); Display.sync(60); if (Display.isCloseRequested()) { running = false; } } 

рдЕрджреНрдпрддрди рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдЬрд┐рд╕реЗ рдЕрдирдВрдд рд▓реВрдк рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:

  1. рд╡рд┐рдВрдбреЛ рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓реЗрдВ
  2. рдЕрджреНрдпрддрди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ
  3. рдкреНрд░рджрд░реНрд╢рди Display.sync (60) рдореЗрдВ, рдбрд┐рд╕реНрдкреНрд▓реЗ 60 рд╣рд░реНрдЯреНрдЬ рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рд╣реИ (рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕реНрдХреНрд░реАрди рдЕрдкрдбреЗрдЯ рдХреА рдПрдХ рдЕрд▓рдЧ рдЖрд╡реГрддреНрддрд┐ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 59, 76, 120, 144, рдЖрджрд┐, рддреЛ рдЕрдкрдиреА рдЖрд╡реГрддреНрддрд┐ рд╕реЗрдЯ рдХрд░реЗрдВ)ред
  4. рд╡рд┐рдВрдбреЛ рдмрдВрдж рдЪреЗрдХ

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреНрд░реЙрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд┐рдВрдбреЛ рдХреНрд▓реЛрдЬ рдлреНрд▓реИрдЧ, Display.isCloseRequested () рд╕рд╣реА рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд░рдирд┐рдВрдЧ рдЪрд░ рдЧрд▓рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЕрдЧрд▓рд╛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЬрдмрдХрд┐ (рдЪрд▓ рд░рд╣рд╛ рд╣реИ) рд▓реВрдк рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреНрд░рдордг рд╣реЛрдЧрд╛ред .destroy (), рдЬреЛ рдкреНрд░рджрд░реНрд╢рди рдФрд░ System.exit (0) рдХреЛ рдирд╖реНрдЯ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдХреЙрд▓ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддрд╛ рд╣реИред

рдЪрд░рдг рдЪрд╛рд░, рдУрдкрдирдЬреАрдПрд▓


рдУрдкрди (рдореБрдЦреНрдп) рд▓реВрдк рд╕реЗ рдкрд╣рд▓реЗ рдУрдкрди рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:

 if (!GLContext.getCapabilities().OpenGL33) { System.err.println("    OpenGL 3.3."); System.exit(0); } 

рдпрд╣ рдХреЛрдб рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб OpenGL 3.3 рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдпрджрд┐ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ (рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ)ред

рддреЛ, рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рддреА рд╣реИ, рдЕрдЧрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдУрдкрдирдЬреАрдПрд▓ 3.3 рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рд╕рддреНрдпрд╛рдкрди рдХреЛрдб рдХреЗ рдмрд╛рдж, рд▓реВрдк рд╕реЗ рдкрд╣рд▓реЗ, рдирд┐рдореНрди рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ:

 glShadeModel(GL_SMOOTH); glEnable(GL_TEXTURE_2D); glEnable(GL_DEPTH_TEST); glClearColor(1f, 0f, 0f, 1f); 

рдпрд╣ рдХреЛрдб OpenGL рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдЧрд╛:

  1. рд╢реЗрдбреНрд╕ рдореЗрдВ рдирд░рдо рдкреНрд░рдХрд╛рд╢ рдЪрд╛рд▓реВ рдХрд░реЗрдВ
  2. рдмрдирд╛рд╡рдЯ рдЪрд╛рд▓реВ рдХрд░реЗрдВ
  3. рдЧрд╣рд░рд╛рдИ рдХреА рдЬрд╛рдВрдЪ рдЪрд╛рд▓реВ рдХрд░рддрд╛ рд╣реИ (рддрд╛рдХрд┐ рдкрд╛рд╕ рдХреА рд╡рд╕реНрддреБрдПрдВ рджреВрд░рд┐рдпреЛрдВ рдХреЛ рдУрд╡рд░рд▓реИрдк рдХрд░реЗрдВ)
  4. рд╕рдлрд╛рдИ рдХрд╛ рд░рдВрдЧ рд╕реЗрдЯ рдХрд░реЗрдВ

рдЕрдкрдбреЗрдЯ () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ (рд░рдирд┐рдВрдЧ) рд▓реВрдк рдореЗрдВ, рд▓рд╛рдЗрди рдЬреЛрдбрд╝реЗрдВ

 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

рдЬреЛ рд╣рд░ рдмрд╛рд░ рд╕реНрдХреНрд░реАрди рдЕрдкрдбреЗрдЯ рд╣реЛрдиреЗ рдкрд░ рдХрд▓рд░ рдмрдлрд░ рдФрд░ рдбреЗрдкреНрде рдмрдлрд░ рдХреЛ рдХреНрд▓рд┐рдпрд░ рдХрд░ рджреЗрдЧрд╛ред

рдЕрдВрддрд┐рдо рдХреЛрдб


рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
 import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_TEST; import static org.lwjgl.opengl.GL11.GL_SMOOTH; import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D; import static org.lwjgl.opengl.GL11.glClear; import static org.lwjgl.opengl.GL11.glClearColor; import static org.lwjgl.opengl.GL11.glEnable; import static org.lwjgl.opengl.GL11.glShadeModel; import org.lwjgl.LWJGLException; import org.lwjgl.opengl.Display; import org.lwjgl.opengl.DisplayMode; import org.lwjgl.opengl.GLContext; public class Main { static int width = 800, height = 600; static DisplayMode mainDisplayMode = new DisplayMode(width, height); static boolean running = true; static void update() { if (Display.wasResized()) { width = Display.getWidth(); height = Display.getHeight(); } Display.update(); Display.sync(60); if (Display.isCloseRequested()) { running = false; } } public static void main(String[] args) { try { Display.setLocation((Display.getDesktopDisplayMode().getWidth() - mainDisplayMode.getWidth()) / 2, (Display.getDesktopDisplayMode().getHeight() - mainDisplayMode.getHeight()) / 2); Display.setResizable(true); Display.setVSyncEnabled(true); Display.setDisplayMode(mainDisplayMode); Display.create(); } catch (LWJGLException ex) { System.err.println(ex.getStackTrace().toString()); Display.destroy(); System.exit(1); } if (!GLContext.getCapabilities().OpenGL33) { System.err.println("    OpenGL 3.3."); System.exit(0); } glShadeModel(GL_SMOOTH); glEnable(GL_TEXTURE_2D); glEnable(GL_DEPTH_TEST); glClearColor(1f, 0f, 0f, 1f); while (running) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); update(); } Display.destroy(); System.exit(0); } } 


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

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


All Articles