jogl入门

转载自:http://ligson.iteye.com/blog/1331528

1、jogl是什么?

jogl是Java OpenGL的简称,想真正的了解它,就需要了解OpenGL,OpenGL是Open Graphics Library,它是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库,请参考http://baike.baidu.com/view/9222.htm,他其实是一个命令的的集合,300多条,算不上编程语言,他最难的在于计算机图形学的知识,而jogl是用java通过jni调用,对openGL的一个封装,所以速度上并不比c慢多少,并且加上java特有的面向对象的特性,来开发游戏比直接用c有过之而无不及!

2、jogl的安装配置;

下载地址:如果去官方下载,就直接在他的svn中checkout下来,去里面的项目找,http://jogl.dev.java.net,

为了方便我直接上传了一份;

eclipse下配置:jar包放在build-path下,dll文件,可以在项目下建立个native文件夹,把jogl.jar的NativeLibraryLocation位置选中native就行了

3、验证配置,可以用下面代码

Java代码 收藏代码
  1. publicclassValidate{
  2. publicstaticvoidmain(String[]args){
  3. try{
  4. System.loadLibrary("jogl");
  5. System.out.println("正确配置");
  6. }catch(Exceptione){
  7. System.out.println("没有正确配置:"+e.getMessage());
  8. }
  9. }
  10. }

没有正确配置的话会有下面异常

Java代码 收藏代码
  1. Exceptioninthread"main"java.lang.UnsatisfiedLinkError:nojoglinjava.library.path
  2. atjava.lang.ClassLoader.loadLibrary(ClassLoader.java:1709)
  3. atjava.lang.Runtime.loadLibrary0(Runtime.java:823)
  4. atjava.lang.System.loadLibrary(System.java:1030)
  5. atorg.ligson.jogl.test.Validate.main(Validate.java:7)

4、OpenGL开发前需要知道的

OpenGL为了兼容各种环境,没有实现窗口,但是他画图又必须在窗口下画,在C库中依赖于glut,在Java中就依赖于swing了,所以第一步应该建立一个窗口extends JFrame,

5、先看一个Hello,World!

Java代码 收藏代码
  1. packageorg.ligson.jogl.test;
  2. importjava.awt.BorderLayout;
  3. importjava.awt.event.WindowAdapter;
  4. importjava.awt.event.WindowEvent;
  5. importjavax.media.opengl.GL;
  6. importjavax.media.opengl.GLAutoDrawable;
  7. importjavax.media.opengl.GLCanvas;
  8. importjavax.media.opengl.GLCapabilities;
  9. importjavax.media.opengl.GLEventListener;
  10. importjavax.swing.JFrame;
  11. publicclassPointerextendsJFrameimplementsGLEventListener,Runnable{
  12. //gl库的handler,相当于画笔
  13. GLgl;
  14. //画布,跟html5的Canvas一样,
  15. GLCanvascanvas;
  16. //指定了一套OpenGL的功能:渲染内容必须支持,如色彩深度,以及立体是否已启用。
  17. GLCapabilitiescapabilities;
  18. Threadthread=newThread(this);
  19. publicPointer(){
  20. super("Demo4");
  21. this.setSize(500,500);
  22. this.setLocationRelativeTo(null);
  23. capabilities=newGLCapabilities();
  24. canvas=newGLCanvas(capabilities);
  25. canvas.addGLEventListener(this);
  26. this.addWindowListener(newWindowAdapter(){
  27. publicvoidwindowClosing(WindowEvente){
  28. System.exit(0);
  29. }
  30. });
  31. this.add(canvas,BorderLayout.CENTER);
  32. thread.start();
  33. }
  34. @Override
  35. publicvoidrun(){
  36. while(true){
  37. try{
  38. Thread.sleep(20);
  39. }catch(InterruptedExceptione){
  40. e.printStackTrace();
  41. }
  42. canvas.display();
  43. }
  44. }
  45. @Override
  46. publicvoiddisplay(GLAutoDrawabledrawable){
  47. gl.glClear(GL.GL_COLOR_BUFFER_BIT);
  48. gl.glColor3f(1.0f,0.0f,0.0f);
  49. gl.glPointSize(10.0f);
  50. gl.glBegin(GL.GL_POINTS);
  51. gl.glVertex3f(50.0f,50.0f,50.0f);
  52. gl.glEnd();
  53. gl.glFlush();
  54. }
  55. @Override
  56. publicvoiddisplayChanged(GLAutoDrawabledrawable,booleanarg1,
  57. booleanarg2){
  58. }
  59. @Override
  60. publicvoidinit(GLAutoDrawabledrawable){
  61. gl=drawable.getGL();
  62. gl.glClearColor(0.3f,0.3f,0.3f,1.0f);
  63. }
  64. @Override
  65. publicvoidreshape(GLAutoDrawabledrawable,intx,inty,intw,inth){
  66. if(h==0){
  67. h=1;
  68. }
  69. intwindowWidth;
  70. intwindowHeight;
  71. gl.glViewport(0,0,w,h);
  72. gl.glMatrixMode(GL.GL_PROJECTION);
  73. gl.glLoadIdentity();
  74. if(w<=h){
  75. windowWidth=250;
  76. windowHeight=250*h/w;
  77. }else{
  78. windowWidth=250*w/h;
  79. windowHeight=250;
  80. }
  81. gl.glOrtho(0-windowWidth,windowWidth,0-windowHeight,
  82. windowHeight,250.0f,-250.0f);
  83. gl.glMatrixMode(GL.GL_MODELVIEW);
  84. gl.glLoadIdentity();
  85. }
  86. publicstaticvoidmain(String[]args){
  87. Pointerdemo5=newPointer();
  88. demo5.setVisible(true);
  89. }
  90. }

6、上面的hello,world吓住你了吗?太长了吧,我刚开始跟你一样!先说上面是干嘛的?他其实就是先空间画一个10.0f像素的点(glPonitSize(10.0f));了解几个函数

Java代码 收藏代码
  1. publicvoidinit(GLAutoDrawabledrawable){

初始化时调用,给GL 赋值

Java代码 收藏代码
  1. @Override
  2. publicvoiddisplay(GLAutoDrawabledrawable){

每次显示时都会调用的,他一般在一个线程里,不停的画,因为他只显示一次,当屏幕进行刷新时就没有了,

Java代码 收藏代码
  1. @Override
  2. publicvoidreshape(GLAutoDrawabledrawable,intx,inty,intw,inth){

当窗口大小进行改变时调用,初次显示也算,

Java代码 收藏代码
  1. @Override
  2. publicvoiddisplayChanged(GLAutoDrawabledrawable,booleanarg1,
  3. booleanarg2){

显示改变时调用,,具体的不知道,我也没有用过

7、后续。。。。。。

你可能感兴趣的:(入门)