用GLUT库开始玩儿OpenGL

《OpenGL2.0精髓》第一章的sample

 

1.引用的库包括:glut.lib glu.lib opengl.lib

2.可能会报一个exit(0)重定义的错。需要在c/c++预处理器中增加定义GLUT_BUILDING_LIB

error C2381: 'exit' : redefinition; __declspec(noreturn) differs 

// OPENGL头文件
#include <GL/glut.h>
#include <GL/glu.h>
#include <GL/gl.h>

#include <string>
#include <sstream>
#include <assert.h>
#define _USE_MATH_DEFINES
#include <math.h>

//
// 关于GLUT的部分
//
// 窗口参数
const int gWinWidth = 1024;
const int gWinHeight = 768;
const char* gWinTitile = "glut beginning!";
float eye_z;  // 视点和原点位置的z差

// “退出”菜单ID
static const int QUIT_VALUE = 99;
// 显示列表ID
GLuint listID;
// VBO ID
GLuint vboID;
// 重要回调1:显示回调,GLUT调用它完成重绘。
static void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);

    // 将模型矩阵往后退4f,即向屏幕里移动4f
    glLoadIdentity();
    glTranslatef(0.f,0.f,-eye_z);

    // 绘制显示列表的内容
    glCallList(listID);

    // 交换缓存,即将后缓存中的内容刷新到帧缓存,
    // 帧缓存中的内容会被显示设备即刻显示出来。
    glutSwapBuffers();

    assert(glGetError() == GL_NO_ERROR);
}
// 重要回调2:重塑回调。
// 在窗口size发成变化时,GLUT会调用它。类同c#中窗体的sizechanged()
static void reshape(int w, int h)
{
    // 更新视口
    glViewport(0,0,w,h);

    // 更新投影矩阵和屏幕纵横比
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    eye_z = (h/2) / atanf(M_PI*50./180.);
    gluPerspective(50., (double)w/(double)h, 1., 10000.);

    // 矩阵状态置为模型变换
    glMatrixMode(GL_MODELVIEW);

    assert(glGetError() == GL_NO_ERROR);
}
// 重要回调3:GLUT菜单回调。类同c#中menuitem::clicked()
static void mainMenuCB(int value)
{
    if (value == QUIT_VALUE)
        exit(0);
}
// 一些重要的初始化
static void initGLUT(void)
{
    // 关闭抖动。
    // 抖动是色位不够的时候用较少的颜色来模拟缺少的颜色的一种方法
    glDisable(GL_DITHER);

    // 获得GL版本
    // getGetString()
    std::string ver((const char*) glGetString(GL_VERSION));
    assert(!ver.empty());
    std::istringstream verStream(ver);

    // 分解版本号,major.minor.xx, 最后的xx没有取出
    int major, minor ;
    char dummySep;
    verStream >> major >> dummySep >> minor;

    // 即OpenGL1.1以上才支持定点数组,但原先的判断方法貌似有问题
    //const bool useVertexArrays = ( (major >= 1) && (minor >= 1) );  //原先的
    const bool useVertexArrays =  ((major*10+minor) >= 11);
     1.5以上支持缓存对象
    //const bool useBufferObjects =  ((major*10+minor) >= 15);

    const GLfloat data[] = {
        -100.f, -100.f, 0.f,
        100.f, -100.f, 0.f,
        0.f, 100.f, 0.f};

    const GLfloat color[] = {
        1.f, 1.f, 0.f, 1.f,
        1.f, 0.f, 0.f, 1.f,
        0.f, 1.f, 0.f, 1.f};

    // 使用顶点数组
    if (useVertexArrays)
    {
        glEnableClientState(GL_VERTEX_ARRAY);
        glVertexPointer(3, GL_FLOAT, 0, data);
        glEnableClientState(GL_COLOR_ARRAY);
        glColorPointer(4, GL_FLOAT, 0, color);
        //glNormalPointer()
        //glTexCoordPointer()
    }

    // 创建显示列表ID
    listID = glGenLists(1);
	
    // 编译显示列表
    //(即从这里开始到glEndList为止的gl代码都会被编译成一系列指令直接存储在GPU的显存内)
    glNewList(listID, GL_COMPILE);

    if (useVertexArrays)
    {
        glDrawArrays(GL_TRIANGLES, 0, 3);
    }
    else
    {
        glBegin( GL_TRIANGLES );
        glColor4fv(&color[0]);
        glVertex3fv( &data[0] );
        glColor4fv(&color[4]);
        glVertex3fv( &data[3] );
        glColor4fv(&color[8]);
        glVertex3fv( &data[6] );
        glEnd();
    }

    // 显示列表结束
    glEndList();

    assert(glGetError() == GL_NO_ERROR);

    // 绑定显示回调和重塑回调
    // Tips: F12转到定义查看更多GLUT回调
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);

    // 创建右键菜单,参数是回调函数
    int mainMenu = glutCreateMenu(mainMenuCB);
    glutAddMenuEntry("退出", QUIT_VALUE);
    glutAttachMenu(GLUT_RIGHT_BUTTON);
}
//
// 程序入口
//

int main(int argc, char** argv)
{
    // 1.glutInit
    glutInit(&argc, argv);

    // 2.创建GLUT窗口
    glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE);
    glutInitWindowSize(gWinWidth,gWinHeight);
    glutCreateWindow(gWinTitile);

    // 3.一系列对glut的初始化工作
    initGLUT();

    // 4.开始仿真循环
    glutMainLoop();

    return 0;
}


http://www.cnblogs.com/mumuliang/archive/2011/06/20/2085227.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值