怎样开始学习OpenGL

  怎样开始学习OpenGL

怎样开始学习OpenGL
wingser 2004.12.6 wujiayi74@citiz.net

什么是OpenGL:
OpenGL(“Open Graphics Library”)是图形硬件的软件接口。OpenGL包括大约250个不同的函数,程序员可以使用这些函数设定要绘制的物体和操作,来制作交互的三维应用程序。

OpenGL 是专业图形处理,科学计算等高端应用领域的标准图形库。它的主要竞争对手是微软的Direct3D。OpenGL曾长期处于技术上的领先地位,但今年来 Direct3D也迎头赶上。目前这两种图形API在性能上可说是旗鼓相当。不过OpenGL支持众多的操作系统,而Direct3D只在Windows 平台上可用。因此OpenGL仍然广受瞩目。

怎样开始学习OpenGL:
你可以在OpenGL的官方网站http://www.OpenGL.org的Documentation中下载到官方教程和例子程序:
The OpenGL Programming Guide,这就是著名的red book(“红皮书”)

如果你英语不好,那么我推荐你阅读:
《OpenGL编程权威指南》他是red book的中文译本,它的例子也就是red book的例子。
《OpenGL超级宝典》也是一本不错的中文教程。

*Nate Robin的例子对你理解OpenGL很有帮助。 http://www.gamedev.net/reference/articles/article839.asp
*The OpenGL Reference Manual(blue book)并不是一本入门教材,不适合初学者。
*NeHe的例子并不适合初学者,尤其是没有win32基础,建议有一定基础以后再学习。 http://nehe.gamedev.net


怎样安装GLUT库:
OpenGL的例子大都需要用到OpenGL应用工具包:GLUT库,下面讲讲怎样安装它

Visual C++用户:
1。下载GLUT库:http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip
2。将压缩包内的glut.h放到.../Microsoft Visual Studio/VC98/Include/GL目录下
   将glut32.lib放到.../Microsoft Visual Studio/VC98/Lib目录下
   将glut32.dll放到X:/windows/systom32目录下(win98用户放到X:/windows/systom目录下)
3。建立一个控制台工程Win32 Console Application,加入hello.c并运行:


#include  < GL / glut.h >

void  display( void )
{
   glClear (GL_COLOR_BUFFER_BIT);
/* clear all pixels  */
   glColor3f (
1.01.01.0);
   glBegin(GL_POLYGON);
/* draw white polygon with corners at(0.25, 0.25, 0.0) and (0.75, 0.75, 0.0)*/
      glVertex3f (
0.250.250.0);
      glVertex3f (
0.750.250.0);
      glVertex3f (
0.750.750.0);
      glVertex3f (
0.250.750.0);
   glEnd();
   glFlush ();
/* start processing buffered OpenGL routines  */
}


void  init ( void
{
   glClearColor (
0.00.00.00.0);/* select clearing color  */
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   glOrtho(
0.01.00.01.0-1.01.0);/* initialize viewing values  */
}


int  main( int  argc,  char **  argv)
{
   glutInit(
&argc, argv);
   glutInitDisplayMode (GLUT_SINGLE 
| GLUT_RGB);/*Declare initial display mode(single buffer and RGBA).*/
   glutInitWindowSize (
250250); /*Declare initial window size.*/
   glutInitWindowPosition (
100100);/*Declare initial window position.*/
   glutCreateWindow (
"hello");/*Open window with "hello"in its title bar.*/  
   init ();
/*Call initialization routines.*/
   glutDisplayFunc(display); 
/*Register callback function to display graphics.*/
   glutMainLoop();
/*Enter main loop and process events.*/
   
return 0;   /* ANSI C requires main to return int. */
}



DEVCPP用户:
1。下载GLUT库:http://www.cs.uofs.edu/~mpc3/cmps370/glut-MingW-DEV-C++.zip
2。将压缩包内的glut.h放到.../Dev-Cpp/include/GL目录下
   将libglut.a和glut32.def放到.../Dev-Cpp/lib目录下
   将glut32.dll放到X:/windows/systom32目录下(win98用户放到X:/windows/systom目录下)
3。建立一个控制台工程Console Application,修改工程属性中的参数中的连接器,加入库或者对象中加入:
.../Dev-Cpp/lib/libglu32.a
.../Dev-Cpp/lib/libglut32.a
.../Dev-Cpp/lib/libopengl32.a

4。加入hello.c并运行:

#include  < GL / glut.h >

void  display( void )
{
   glClear (GL_COLOR_BUFFER_BIT);
/* clear all pixels  */
   glColor3f (
1.01.01.0);
   glBegin(GL_POLYGON);
/* draw white polygon with corners at(0.25, 0.25, 0.0) and (0.75, 0.75, 0.0)*/
      glVertex3f (
0.250.250.0);
      glVertex3f (
0.750.250.0);
      glVertex3f (
0.750.750.0);
      glVertex3f (
0.250.750.0);
   glEnd();
   glFlush ();
/* start processing buffered OpenGL routines  */
}


void  init ( void
{
   glClearColor (
0.00.00.00.0);/* select clearing color  */
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   glOrtho(
0.01.00.01.0-1.01.0);/* initialize viewing values  */
}

int  main( int  argc,  char **  argv)
{
   glutInit(
&argc, argv);
   glutInitDisplayMode (GLUT_SINGLE 
| GLUT_RGB);/*Declare initial display mode(single buffer and RGBA).*/
   glutInitWindowSize (
250250); /*Declare initial window size.*/
   glutInitWindowPosition (
100100);/*Declare initial window position.*/
   glutCreateWindow (
"hello");/*Open window with "hello"in its title bar.*/  
   init ();
/*Call initialization routines.*/
   glutDisplayFunc(display); 
/*Register callback function to display graphics.*/
   glutMainLoop();
/*Enter main loop and process events.*/
   
return 0;   /* ANSI C requires main to return int. */
}





for JAVAer:
如果你是JAVA程序员,我向你推荐JOGL,JOGL项目是目前流行的OpenGL的JAVA绑定,它的官方主页是 https://jogl.dev.java.net
当前的JOGL支持OpenGL 1.5,和绝大多数的扩展,当然如果你是OpenGL高手,你会知道,只要显卡驱动支持,我们一样可以调用JOGL没有提供的OpenGL扩展函数。
好吧,假定你有一个JAVA的编译环境,你的JAVA SDK版本在1.42以上,(你可以netbeans.org下载到免费的netbeans编译器)

安装步骤:
1。在https://jogl.dev.java.net的Precompiled binaries and documentation的Release Builds 2004的1.1b07 - November 19目录
   下载jogl.jar和jogl-natives-win32.jar(不是windows用户的话,下载jogl-natives-myos.jar)
2。将jogl.jar安装到CLASSPATH
3。运行下面程序,得到java.library.path
public class try {
   public static void main(String[] args)
   {
System.out.println(System.getProperty("java.library.path"));
}  
}
4。解压缩jogl-natives-win32.jar,将jogl.dll和joglcg.dll放到任意的java.library.path目录中
5。运行看下面的程序,它能跑就说明安装好了
public class zaishishi {
    public static void main(String[] args)
    {
        System.loadLibrary("jogl" );
    }
}
6。运行我们的例子hello.java

import  net.java.games.jogl. *
 
import  java.awt. *
import  java.awt.event. * ;
 
public   class  hello 

    
public static void main( String[] args ) 
    

        
try 
        

            Frame Frame 
= new Frame("hello"); /*Open window with "hello"in its title bar.*/ 
            Frame.setSize(
250,250); /*Declare initial window size.*/
 
            GLCapabilities glCaps 
= new GLCapabilities(); 
 
            GLCanvas canvas 
= GLDrawableFactory.getFactory().createGLCanvas( glCaps ); 
            canvas.addGLEventListener(
new Renderer()); 
            Frame.add( canvas ); 
 
            
final Animator animator = new Animator( canvas); 
            Frame.addWindowListener(
new WindowAdapter() 
                
public void windowClosing(WindowEvent e) 
                    animator.stop(); 
                    System.exit(
0); 
                }
 
              }
); 
        Frame.show(); 
        animator.start(); 
        }
 
        
catch( Exception e ) 
        

            e.printStackTrace(); 
        }
 
    }
 
}
 
class  Renderer  implements  GLEventListener 

    
private GL              gl; 
    
private GLDrawable      glDrawable; 
 
    
public void init(GLDrawable drawable) 
    

        
this.gl = drawable.getGL(); 
        
this.glDrawable = drawable; 
        drawable.setGL( 
new DebugGL(drawable.getGL() )); 
     gl.glClearColor (
0.0f0.0f0.0f0.0f);/* select clearing color  */
     gl.glMatrixMode(GL.GL_PROJECTION);
     gl.glLoadIdentity();
     gl.glOrtho(
0.01.00.01.0-1.01.0);/* initialize viewing values  */
    }
 
 
    
public void display(GLDrawable drawable) 
    

        gl.glClear(GL.GL_COLOR_BUFFER_BIT);
/* clear all pixels  */
        gl.glLoadIdentity(); 
        gl.glColor3f(
1.0f1.0f1.0f ); 
        gl.glBegin( GL.GL_POLYGON); 
/* draw white polygon with corners at(0.25, 0.25, 0.0) and (0.75, 0.75, 0.0)*/
        gl.glVertex3f (
0.25f0.25f0.0f);
        gl.glVertex3f (
0.75f0.25f0.0f);
        gl.glVertex3f (
0.75f0.75f0.0f);
        gl.glVertex3f (
0.25f0.75f0.0f);
        gl.glEnd(); 
 gl.glFlush();
/* start processing buffered OpenGL routines  */
    }
 
 
    
public void reshape(GLDrawable drawable, int x, int y, int width, int height) 
    

    }
 
 
    
public void displayChanged(GLDrawable drawable, boolean modeChanged, boolean deviceChanged) 
    

    }
 
 
}


注:jsr231,(opengl java binding) 已经接近完成,代码和jogl类似,其实就是jogl发展出来的。2006.9

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值