OpenGL的基本框架-程序员宅基地

技术标签: OpneGL  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
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/longge0508/article/details/51896522

智能推荐

华为eNSP--基本指令操作_undo in en-程序员宅基地

-------命令指令解释查看指令display ip int briefdisplay ip routing-table配置路由器–开局sys进入系统操作模式undo in ensys T-R1为路由器设置名字为T-R1..._undo in en

设计模式09_观察者模式-程序员宅基地

1、定义 观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。(摘自Head First中文版51页)2、说明 在通常情况下,软件系统会包含各种对象,就像大海孕育着形色各异的动植物一样。在浩瀚的海洋中,各种动植物彼此依赖和约束,形成一个个生物链。某一种生物的行为状态变化可能会造成其它生物作出相应行动。同样,在

NutUI :成功申报中国科协开源评选-程序员宅基地

恭喜NutUI :成功申报中国科协开源评选中国科协首届2021“科创中国”开源创新榜评选正在进行中,全程免费参与,对于申报成功的开源产品/社区/机构,主承办方会组织各种形式的宣传报道。NutUI :提供高效便捷开发方式的开源移动端组件库NutUI :成功申报中国科协开源评选开源项目介绍京东开源项目 NutUI 是一套京东风格的轻量级移动端组件库。基于JD APP 10.0设计规范。支持Vue2、Vue3\多端小程序,是开发和服务于移动端的企业级产品。产品特点京东风格(京东APP0规.

magnetX,资源搜索神器!老司机快上车!_ipx资源怎么找-程序员宅基地

magnetX 中文版是一款非常好用的资源搜索神器,界面干净简洁并且不会有弹窗。而且可以通过关键字搜索,或者网址过滤这两种方式快速找到你想要的资源,并且还能配合WebTorrent在线播放,还可以配合下载工具进行一键下载资源,可以查看文件的大小来达到不会误下载葫芦娃的效果!magnetX是什么?问:搜索网站老是弹少儿不宜的广告,同事看到多不好啊怎么办?答:magnetX。问:我有一个神奇车牌,但是到处都找不到下载地址怎么办?答:magnetX。问:别人分享的作品,原始链接下不了怎么办_ipx资源怎么找

手机能打开的表白代码_数据分析移动化:打开手机就能做分析-程序员宅基地

为什么别人打开手机就能做数据分析,点两点就能切换不同分析角度?还能为什么,明显是用了BI数据可视化工具。BI数据可视化工具做的分析报表不仅能在电脑端快速做分析,更适用于大屏、移动端(如手机),能通过触屏点击的方式来随时切换字段与维度组合。就以奥威BI系列的OurwayBI数据可视化工具为例,支持任意终端、屏幕自适应,用户在平台上做好的数据可视化报表可随时随地在任意终端上秒开。分析报表一键送达总结来..._电脑代码表白怎么在手机上显示

Qt 学习之路 2(50):自定义可编辑模型-程序员宅基地

上一章我们了解了如何自定义只读模型。顾名思义,只读模型只能够用于展示只读数据,用户不能对其进行修改。如果允许用户修改数据,则应该提供可编辑的模型。可编辑模型与只读模型非常相似,至少在展示数据方面几乎是完全一样的,所不同的是可编辑模型需要提供用户编辑数据后,应当如何将数据保存到实际存储值中。我们还是利用上一章的CurrencyModel,在此基础上进行修改。相同的代码这里不再赘述,我

随便推点

基于NodeJs+vue+elementUi+mysql8.0的网购系统 毕业设计 课程设计-程序员宅基地

引言随着Internet技术的发展,人们的日常生活已经离不开网络,未来社会人们的生活和工作将越来越依赖于数字技术的发展,越来越数字化、网络化、电子化、虚拟化。电子商务也随着网络的发展日益和人们的生活贴近,Internet的发展历程以及目前的应用状况和发展趋势,可以充分地相信网络技术将极大地改变我们的生活和工作方式,甚至社会的价值观也会发生某种变化。网上购物是以信息技术为基础的电子商务活动...

标志寄存器(六个状态标志位)_标志寄存器中6个状态标志位-程序员宅基地

1、进位标志CF(Carry Flag)如果运算结果的最高位产生了一个进位或错位,那么,其值为1,否则其值为02、奇偶标志(Parity Flag)由于反应运算结果中(转化为二进制),"1"的奇偶性,也就是个数。"1"的个数为偶数,PF为1。个数为奇数,PF为0.3、辅助进位标志AF(Auxiliary Carry Flag)在发生下列情况时,AF的值为1,否则其值为0(1)、在字操作时,发生低字节向高字节进位或错位时;(2)、在字节操作时,发生低4位向高4位进位或错位时;4、零标志ZF(._标志寄存器中6个状态标志位

JDBC数据库链接:Communications link failure失败_communications link failure的原因-程序员宅基地

初次链接JDBC遇到:Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure。数据库链接失败的原因有以下:URL错误;用户名错误;密码错误。String url = "jdbc:mysql://localhost:3306/jdbcStudy?useUnicode=true&characterEncoding=utf8&_communications link failure的原因

上海HPE面经_hpe 面试-程序员宅基地

1.自我介绍 我叫***,就读于***大学,现在在读大三,学的专业是通信工程,但是大一c语言课设结束后,开始对编程感兴趣,随后加入了院实验室,跟大家一起学习,毕竟有一个好的学习氛围,学的才能更快,更多一点。之后又自学了java,数据结构和一些基础的算法。2.做过哪些项目?一个是jsp+servlet,另外一个是课堂派。3.具体说一下企业人事管理系统那个项目你负责的模块?我主要负责登陆和注册,登陆..._hpe 面试

java网站模版 Bootstrap HTML5 企业源码 项目源码-程序员宅基地

获取【下载地址】 QQ: 313596790 【免费支持更新】A 代码生成器(开发利器);全部是源码 增删改查的处理类,service层,mybatis的xml,SQL( mysql 和oracle)脚本, jsp页面 都生成 就不用写搬砖的代码了,生成的放到项目里,可以直接运行B 阿里巴巴数据库连接池druid; 数据库连接池 阿里巴巴的 dr

App实战:夜间模式实现方法一_android recyclerview黑夜切换-程序员宅基地

App实战:夜间模式实现方法一大致上有三种实现方法:通过更换主题,不需要重新创建Activity。/** * Set the base theme for this context. Note that this should be called * before any views are instantiated in the Context (for examp..._android recyclerview黑夜切换

推荐文章

热门文章

相关标签