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();
рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ:
- рдкреНрд░рджрд░реНрд╢рди рд╕реНрдерд┐рддрд┐ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ (рд╕реНрдХреНрд░реАрди рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ)
- рдЗрд╕реЗ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА
- рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд╕рд┐рдВрдХ рд╕рдХреНрд╖рдо
- DisplayMode рд╕реЗрдЯ рдХрд░реЗрдВ рдЬреЛ рд╕реНрдХреНрд░реАрди рдЖрдХрд╛рд░ рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ
- рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдореЗрдВ, рдбрд┐рд╕реНрдкреНрд▓реЗ рд╕реНрдХреНрд░реАрди рдкрд░ рдмрдирд╛рдИ рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред
static void update() { if (Display.wasResized()) { width = Display.getWidth(); height = Display.getHeight(); } Display.update(); Display.sync(60); if (Display.isCloseRequested()) { running = false; } }
рдЕрджреНрдпрддрди рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдЬрд┐рд╕реЗ рдЕрдирдВрдд рд▓реВрдк рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:
- рд╡рд┐рдВрдбреЛ рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓реЗрдВ
- рдЕрджреНрдпрддрди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ
- рдкреНрд░рджрд░реНрд╢рди Display.sync (60) рдореЗрдВ, рдбрд┐рд╕реНрдкреНрд▓реЗ 60 рд╣рд░реНрдЯреНрдЬ рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рд╣реИ (рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕реНрдХреНрд░реАрди рдЕрдкрдбреЗрдЯ рдХреА рдПрдХ рдЕрд▓рдЧ рдЖрд╡реГрддреНрддрд┐ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 59, 76, 120, 144, рдЖрджрд┐, рддреЛ рдЕрдкрдиреА рдЖрд╡реГрддреНрддрд┐ рд╕реЗрдЯ рдХрд░реЗрдВ)ред
- рд╡рд┐рдВрдбреЛ рдмрдВрдж рдЪреЗрдХ
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреНрд░реЙрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд┐рдВрдбреЛ рдХреНрд▓реЛрдЬ рдлреНрд▓реИрдЧ, 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 рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдЧрд╛:
- рд╢реЗрдбреНрд╕ рдореЗрдВ рдирд░рдо рдкреНрд░рдХрд╛рд╢ рдЪрд╛рд▓реВ рдХрд░реЗрдВ
- рдмрдирд╛рд╡рдЯ рдЪрд╛рд▓реВ рдХрд░реЗрдВ
- рдЧрд╣рд░рд╛рдИ рдХреА рдЬрд╛рдВрдЪ рдЪрд╛рд▓реВ рдХрд░рддрд╛ рд╣реИ (рддрд╛рдХрд┐ рдкрд╛рд╕ рдХреА рд╡рд╕реНрддреБрдПрдВ рджреВрд░рд┐рдпреЛрдВ рдХреЛ рдУрд╡рд░рд▓реИрдк рдХрд░реЗрдВ)
- рд╕рдлрд╛рдИ рдХрд╛ рд░рдВрдЧ рд╕реЗрдЯ рдХрд░реЗрдВ
рдЕрдкрдбреЗрдЯ () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ (рд░рдирд┐рдВрдЧ) рд▓реВрдк рдореЗрдВ, рд▓рд╛рдЗрди рдЬреЛрдбрд╝реЗрдВ
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% рд╕реЗ рдЕрдзрд┐рдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдЙрддреНрддрд░ рд╣реИрдВ, рддреЛ рдореИрдВ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд▓рд┐рдЦрдирд╛ рдЬрд╛рд░реА рд░рдЦреВрдВрдЧрд╛ред