OpenGL 编程/基础/结构
根据您计划使用的应用程序,您可能需要在开始之前设置一个新的 C++ 项目。 这方面的说明因程序而异,因此如果您不确定如何操作,请查看程序的手册。
许多 OpenGL 应用程序利用了一个跨平台(Windows、Mac 和 Linux 兼容)工具包,称为 GLUT,它与 OpenGL 一起使用。 GLUT 用于绘制窗口并处理鼠标和键盘事件,这是 OpenGL 本身无法做到的。 GLUT 有替代品,但 GLUT 是最简单的跨平台运行的 GUI 工具包,因此我们假设您已安装 GLUT。
GLUT 有许多缺点,这与它的缺乏灵活性有关。 由于 GLUT 必须在三个截然不同的操作系统上以相同的方式工作,因此您没有任何平台特定的功能。 GLUT 本身无法利用操作系统提供的窗口小部件(按钮、下拉菜单)。 您的应用程序将无法更改窗口级菜单(虽然上下文菜单可以自定义)。 如果这些限制对您的项目是无法接受的,那么您将不得不使用 GLUT 的替代方案。 这些将在本维基教科书的后面部分讨论。 现在,先用 GLUT 吧。
打开(或创建)您的 main.cpp 文件。 您应该熟悉此文件的基本格式
#include <iostream> int main(int argc, char *argv[]) { return 0; }
我们需要在这里添加一些包含项,这样我们才能在我们的应用程序中使用 OpenGL。 根据您安装 OpenGL 的方式和位置,您可能需要稍微调整一下这些路径。
#include <GL/gl.h> #include <GL/glut.h> #include <GL/glu.h>
这包括基本的 OpenGL 命令、GLUT 和一个稍后有用的实用工具包 GLU。 请注意,如果您的操作系统区分大小写(例如 Linux),则在编译之前必须将 GL 大写。
如果使用 Visual Studio,请确保在任何 OpenGL 头文件之前包含 windows.h。
现在我们有了库,我们可以开始设计我们的界面,在我们的 int main() 函数中创建我们的窗口
#ifdef WIN32 //if using windows then do windows specific stuff. #define WIN32_LEAN_AND_MEAN //remove MFC overhead from windows.h which can cause slowness #define WIN32_EXTRA_LEAN #include <windows.h> #endif #include <GL/gl.h> #include <GL/glut.h> #include <GL/glu.h> void display() { /* empty function required as of glut 3.0 */ } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); glutInitWindowSize(800,600); glutCreateWindow("Hello World"); glutDisplayFunc(display); glutMainLoop(); return 0; }
我们首先调用 glutInit(),它启动 GLUT 以供我们使用。 接下来,我们设置一个显示模式。 现在,只需使用我们在这里提供的 glutInitDisplayMode 设置。 您可能稍后会调整这些设置。 然后我们告诉 GLUT 我们希望窗口有多大; 800 x 600 现在可以了。 最后,我们使用 glutCreateWindow() 实际创建窗口,将窗口标题作为参数传递,并将程序的控制权交给 GLUT,通过 glutMainLoop()。 当您使用 GLUT 时,永远不要忘记调用 glutMainLoop()!
您可能已经注意到到目前为止的一些事情:每个函数都以 glut- 为前缀。 当我们开始实际使用 OpenGL 本身时,每个函数都将以一个简单的 gl- 为前缀。 这是为了组织。
尝试编译此应用程序。 希望您应该得到一个标题为“Hello World”的 800x600 窗口。 如果没有,请参考本维基教科书的安装部分,并考虑重新安装。
大多数简单的 OpenGL 应用程序仅包含三个元素
- 一个设置函数,它在您开始实际绘制之前配置所有内容。
- 一个显示函数,它进行实际的绘制,以及
- int main(),我们已经在上面配置了大部分内容。 int main 只调用设置函数,并告诉 GLUT 在需要时使用显示函数。
一些 OpenGL 代码可能看起来像这样
#ifndef WIN32 //if using windows then do windows specific stuff. #define WIN32_LEAN_AND_MEAN //remove MFC overhead from windows.h which can cause slowness #define WIN32_EXTRA_LEAN #include <windows.h> #endif #include <GL/gl.h> #include <GL/glut.h> #include <GL/glu.h> void setup() { /* empty function nothing to setup yet */ } void display() { /* empty function required as of glut 3.0 */ } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); glutInitWindowSize(800,600); glutCreateWindow("Hello World"); setup(); glutDisplayFunc(display); glutMainLoop(); return 0; }
这段代码本身并没有绘制任何东西,因为 display() 是空的。