OpenGl编程指南第7版(红宝书)环境配制

环境

OS:win7 旗舰版SP1 64位
编译器: VS 2013 express 的cl

软件

glut. 在这个页面https://www.opengl.org/resources/libraries/glut/glut_downloads.php 搜glutdlls37beta.zip,里面有头文件和编译好的lib,dll
glew. 在这个页面http://glew.sourceforge.net/下载 Windows 32-bit and 64-bit版本

配制

%VS_HOME%代表VS的安装目录. %GLUT_HOME%代表glut所在的文件夹. %GLEW_HOME%代表glew所在的文件夹.
把%GLUT_HOME%include*.h复制到%VS_HOME%VCincludeGL. GL文件夹不存在就建一个.
把%GLUT_HOME%*.lib复制到%VS_HOME%VClib
把%GLUT_HOME%*.dll复制到C:WindowsSysWOW64
把%GLEW_HOME%includeGL*.h复制到%VS_HOME%VCincludeGL
把%GLEW_HOME%libReleaseWin32*.lib复制到%VS_HOME%VClib
把%GLEW_HOME%inReleaseWin32*.dll复制到C:WindowsSysWOW64
注意虽然系统是64位的但是GLEW要复制32位的.

运行例子

源代码在这里下载 http://pan.baidu.com/s/1c2G0XAK
不使用VS建工程的方式运行例子,只用命令cl编译,这样可以把精力集中到学习opengl上,而不是VS上.另外用命令行能更好的理解VS工作的原理.微软的cl命令不认识UTF8,所以把源代码中的hello.c另存为UTF8 BOM格式. 打开Visual Studio 2013-Visual Studio Tools-点击"VS2013 x86 本机工具命令提示"打开命令行工具,切换到hello.c所在的目录(确保hello.c已经保存为UTF8 BOM格式).执行命令:

cl hello.c

如果按照上面的配制应该没有错误,会生成hello.exe文件.如果有错误请留言.
编译完成后运行可以看到效果.

hello.exe


红宝书中有的例子如mvarray.c需要用到函数glMultiDrawElements,glMultiDrawElementsEXT要用到Opengl 1.3,1.4的特性,Windows本身只支持Opengl 1.0. 所以要使用glew. 要对mvarray.c修改成如下内容.

#include <GL/glew.h>
#include <GL/glut.h>
#include <stdlib.h>
#include <stdio.h>

#ifdef GL_VERSION_1_3

void setupPointer(void)
{
   static GLint vertices[] = {25, 25,
                       75, 75,
                       100, 125,
                       150, 75,
                       200, 175,
                       250, 150,
                       300, 125,
                       100, 200,
                       150, 250,
                       200, 225,
                       250, 300,
                       300, 250};

   glEnableClientState (GL_VERTEX_ARRAY);
   glVertexPointer (2, GL_INT, 0, vertices);
}

void init(void) 
{
   glClearColor (0.0, 0.0, 0.0, 0.0);
   glShadeModel (GL_SMOOTH);
   setupPointer ();
}

void display(void)
{
   static GLubyte oneIndices[] = {0, 1, 2, 3, 4, 5, 6};
   static GLubyte twoIndices[] = {1, 7, 8, 9, 10, 11};
   static GLsizei count[] = {7, 6};
   static GLvoid * indices[2] = {oneIndices, twoIndices};
   
   glClear (GL_COLOR_BUFFER_BIT);
   glColor3f (1.0, 1.0, 1.0);
   glMultiDrawElementsEXT (GL_LINE_STRIP, count, GL_UNSIGNED_BYTE,
                           indices, 2);
   glFlush ();
}

void reshape (int w, int h)
{
   glViewport (0, 0, (GLsizei) w, (GLsizei) h);
   glMatrixMode (GL_PROJECTION);
   glLoadIdentity ();
   gluOrtho2D (0.0, (GLdouble) w, 0.0, (GLdouble) h);
}

void keyboard(unsigned char key, int x, int y)
{
   switch (key) {
      case 27:
         exit(0);
         break;
   }
}

int main(int argc, char** argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
   glutInitWindowSize (350, 350); 
   glutInitWindowPosition (100, 100);
   glutCreateWindow (argv[0]);
   glewInit();
   init ();
   glutDisplayFunc(display); 
   glutReshapeFunc(reshape);
   glutKeyboardFunc (keyboard);
   glutMainLoop();
   return 0;
}
#else
int main(int argc, char** argv)
{
    fprintf (stderr, "This program demonstrates a feature which is not in OpenGL Version 1.0.
");
    fprintf (stderr, "If your implementation of OpenGL Version 1.0 has the right extensions,
");
    fprintf (stderr, "you may be able to modify this program to make it run.
");
    return 0;
}
#endif

其实只做了2点修改.1是在最前面加了#include <GL/glew.h>的引用.2是在glutCreateWindow下面加了glewInit(),初始化glew.另外要记得把mvarray.c的编码格式改成UTF8 BOM.
编译mvarray.c要指定库,所以编译和链接要分成2步(否则会报glMultiDrawElementsEXT找不到的链接错误).
先编译,执行如下命令:

cl /c mvarray.c

/c的意思是只编译生成.obj,不链接,再执行命令

link glew32.lib mvarray.obj

链接glew32.lib mvarray.obj生成可执行文件mvarray.exe. 再执行命令

mvarray.exe

可以看到结果.

原文地址:https://www.cnblogs.com/zhouyang209117/p/5349812.html