怎样开始学习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
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
display(
void
)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
glClear (GL_COLOR_BUFFER_BIT);/**//* clear all pixels */
glColor3f (1.0, 1.0, 1.0);
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
glBegin(GL_POLYGON);/**//* draw white polygon with corners at(0.25, 0.25, 0.0) and (0.75, 0.75, 0.0)*/
glVertex3f (0.25, 0.25, 0.0);
glVertex3f (0.75, 0.25, 0.0);
glVertex3f (0.75, 0.75, 0.0);
glVertex3f (0.25, 0.75, 0.0);
glEnd();
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
glFlush ();/**//* start processing buffered OpenGL routines */
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
init (
void
)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
glClearColor (0.0, 0.0, 0.0, 0.0);/**//* select clearing color */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);/**//* initialize viewing values */
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
int
main(
int
argc,
char
**
argv)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
glutInit(&argc, argv);
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);/**//*Declare initial display mode(single buffer and RGBA).*/
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
glutInitWindowSize (250, 250); /**//*Declare initial window size.*/
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
glutInitWindowPosition (100, 100);/**//*Declare initial window position.*/
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
glutCreateWindow ("hello");/**//*Open window with "hello"in its title bar.*/
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
init ();/**//*Call initialization routines.*/
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
glutDisplayFunc(display); /**//*Register callback function to display graphics.*/
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
glutMainLoop();/**//*Enter main loop and process events.*/
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
return 0; /**//* ANSI C requires main to return int. */
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
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
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
display(
void
)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
glClear (GL_COLOR_BUFFER_BIT);/**//* clear all pixels */
glColor3f (1.0, 1.0, 1.0);
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
glBegin(GL_POLYGON);/**//* draw white polygon with corners at(0.25, 0.25, 0.0) and (0.75, 0.75, 0.0)*/
glVertex3f (0.25, 0.25, 0.0);
glVertex3f (0.75, 0.25, 0.0);
glVertex3f (0.75, 0.75, 0.0);
glVertex3f (0.25, 0.75, 0.0);
glEnd();
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
glFlush ();/**//* start processing buffered OpenGL routines */
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
init (
void
)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
glClearColor (0.0, 0.0, 0.0, 0.0);/**//* select clearing color */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);/**//* initialize viewing values */
}
int
main(
int
argc,
char
**
argv)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
glutInit(&argc, argv);
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);/**//*Declare initial display mode(single buffer and RGBA).*/
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
glutInitWindowSize (250, 250); /**//*Declare initial window size.*/
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
glutInitWindowPosition (100, 100);/**//*Declare initial window position.*/
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
glutCreateWindow ("hello");/**//*Open window with "hello"in its title bar.*/
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
init ();/**//*Call initialization routines.*/
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
glutDisplayFunc(display); /**//*Register callback function to display graphics.*/
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
glutMainLoop();/**//*Enter main loop and process events.*/
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
return 0; /**//* ANSI C requires main to return int. */
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
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
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
public static void main( String[] args )
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
try
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
Frame Frame = new Frame("hello"); /**//*Open window with "hello"in its title bar.*/
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
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);
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
Frame.addWindowListener(new WindowAdapter() ...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void windowClosing(WindowEvent e) ...{
animator.stop();
System.exit(0);
}
});
Frame.show();
animator.start();
}
catch( Exception e )
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
e.printStackTrace();
}
}
}
class
Renderer
implements
GLEventListener
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
private GL gl;
private GLDrawable glDrawable;
public void init(GLDrawable drawable)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
this.gl = drawable.getGL();
this.glDrawable = drawable;
drawable.setGL( new DebugGL(drawable.getGL() ));
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
gl.glClearColor (0.0f, 0.0f, 0.0f, 0.0f);/**//* select clearing color */
gl.glMatrixMode(GL.GL_PROJECTION);
gl.glLoadIdentity();
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
gl.glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);/**//* initialize viewing values */
}
public void display(GLDrawable drawable)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
gl.glClear(GL.GL_COLOR_BUFFER_BIT);/**//* clear all pixels */
gl.glLoadIdentity();
gl.glColor3f(1.0f, 1.0f, 1.0f );
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
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.25f, 0.25f, 0.0f);
gl.glVertex3f (0.75f, 0.25f, 0.0f);
gl.glVertex3f (0.75f, 0.75f, 0.0f);
gl.glVertex3f (0.25f, 0.75f, 0.0f);
gl.glEnd();
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
gl.glFlush();/**//* start processing buffered OpenGL routines */
}
public void reshape(GLDrawable drawable, int x, int y, int width, int height)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
}
public void displayChanged(GLDrawable drawable, boolean modeChanged, boolean deviceChanged)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
}
}
注:jsr231,(opengl java binding) 已经接近完成,代码和jogl类似,其实就是jogl发展出来的。2006.9