OpenGL的基本框架


未完待续!!


第一个三角形

// 用该程序来介绍基本一个程序的基本框架

#include <GLTools.h>            // OpenGL toolkit
#include <GLShaderManager.h>    // Shader Manager Class

//在不同系统上的头文件
#ifdef __APPLE__
#include <glut/glut.h>          // OS X version of GLUT
#else
#define FREEGLUT_STATIC
#include <GL/glut.h>            // Windows FreeGlut equivalent
#endif

GLBatch triangleBatch;
GLShaderManager shaderManager;

//////////////////////////////////////////////////////
// 改变窗口大小
// to use the window dimensions to set the viewport and the projection matrix.
void ChangeSize(int w, int h)
{
    glViewport(0, 0, w, h);
}


///////////////////////////////////////////////////////////////////////////////
// This function does any needed initialization on the rendering context. 
// This is the first opportunity to do any OpenGL related tasks.
void SetupRC()
{
    // Blue background
    glClearColor(0.0f, 0.0f, 1.0f, 1.0f);

    shaderManager.InitializeStockShaders();

    // Load up a triangle
    GLfloat vVerts[] = { -0.5f, 0.0f, 0.0f,
        0.5f, 0.0f, 0.0f,
        0.0f, 0.5f, 0.0f };

    triangleBatch.Begin(GL_TRIANGLES, 3);
    triangleBatch.CopyVertexData3f(vVerts);
    triangleBatch.End();
}



///////////////////////////////////////////////////////////////////////////////
// Called to draw scene
void RenderScene(void)
{
    // Clear the window with current clearing color
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

    GLfloat vRed[] = { 1.0f, 0.0f, 0.0f, 1.0f };
    shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed);
    triangleBatch.Draw();

    // Perform the buffer swap to display back buffer
    glutSwapBuffers();
}


///////////////////////////////////////////////////////////////////////////////
// Main entry point for GLUT based programs
int main(int argc, char* argv[])
{
    gltSetWorkingDirectory(argv[0]); //设置当前工作目录

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
    glutInitWindowSize(800, 600);
    glutCreateWindow("Triangle");
    glutReshapeFunc(ChangeSize);
    glutDisplayFunc(RenderScene);

    GLenum err = glewInit();
    if (GLEW_OK != err) {
        fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));
        return 1;
    }

    SetupRC();

    glutMainLoop();
    return 0;
}

程序基本框架:

主函数
1.

gltSetWorkingDirectory(argv[0]);

设置当前工作目录,在windows下是不必要的,
2.

glutInit(&argc, argv);

传输命令行参数并初始化glut库。
3.

gluInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_STENCIL);

告诉glut库,在窗户窗口时使用的显示模式。
4.

glutInitWindowSize(800, 600);
glutCreateWindow("Triangle");

告诉glut窗口的大小,并创建以“Triangle”为标题的窗口。
5.

glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScene);

glut内部运行一个本地消息循环,拦截适当的消息,然后调用我们为不同时间注册的回调函数。
6.

GLenum err = glewInit();
if(GLew_OK != err){
    fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));
    return 1;
    }

在主消息循环之前,初始化glew库,并且检查确定驱动程序的初始化过程中没有出现问题。
7.

SetupRC();

在这里进行OpenGL初始化比较方便,在任何OpenGL函数起作用之前必须创建一个渲染环境,而glut在第一次创建窗口时就创建了一个渲染环境了。
8.

glutMainLoop();
return 0;

主消息循环,glutMainLoop函数被调用后,在主窗口被关闭之前都不回还回。这个函数负责处理所有操作系统特定的消息、动作按键等,直到我们关闭程序。


GLUT、GLEW、GLTOOLS

  • GLUT
    代表OpenGL实用工具箱,新的glut实现freeglut已经取代了glut。
  • Glew
  • GLTOOLS
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值