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

智能推荐

Mysql的用户授权和撤销权限_mysql8 取消用户访问 information_schema , performance_sch-程序员宅基地

用户授权与权限撤销三用户授权: 在数据库服务器上添加新的连接用户名,默认只有数据库管理员root 用户在数据服务器本机登陆有授权权限,默认情况下管理员只能从数据库本机连接服务,在没有其他用户能够连接数据库服务器。 授权的命令格式:grant 权限列表 on 数据库名 to 用户名 @“客户端地址” identified by “密码” [with grant option]..._mysql8 取消用户访问 information_schema , performance_schema 权限

一步步走通Notepad运行JAVA-程序员宅基地

一步步解决从JAVA下载、环境配置到notepad如何运行java

Mplayer-arm交叉编译_tinyalsa mplayer-程序员宅基地

下载源码http://www.mplayerhq.hu/MPlayer/releases/编译libmad也可以不用libmad可以在configure时使用–disable-madtar -xzvf libmad-0.15.1b.tar.gz -C .解压到当前目录下,使用以下命令configure./configure --enable-fpm=arm --host=arm-linux-gcc --disable-shared --disable-debugging --prefix=YOU_tinyalsa mplayer

Linux系统下常用压缩和解压方法_openstack压缩包解压_hebao0的博客-程序员宅基地

将tar压缩文件解压到指定的目录下的命令是:tar -xvf 压缩文件 -C /指定目录例:#tar -xvf openstack_test.tar -C /tmp_openstack压缩包解压

java8中lambda的用法(map转list,list转map)_map 转list lamda-程序员宅基地

注意List 使用前需要做非空处理1.以某个属性分组Map<String,List<User>> map= userList.stream().collect(Collectors.groupingBy(User::getName));2.获取集合中的某个属性转为集合pictureList.stream().map(Picture::getSrc).collect(Collectors.toList());3.根据集合中的某个属性进行升序重排roomList.stre_map 转list lamda

linux如何删除veth网卡,linux – 如何识别孤立的veth接口以及如何删除它们?-程序员宅基地

当我通过docker run启动任何容器时,我们得到一个新的veth interface.删除容器后,应删除与容器链接的veth接口.但是,有时它会失败(然后容器启动出错):root@hostname /home # ifconfig | grep veth | wc -l53root@hostname /home # docker run -d -P axibase/atsd -name ax...

随便推点

开源的 OpenHarmony 是每个人的 OpenHarmony_技术社区 openharmony_HarmonyOS技术社区的博客-程序员宅基地

开放原子开源基金会于2020 年 9 月接受华为捐赠的智能终端操作系统基础能力相关代码,随后进行开源,并根据命名规则为该开源项目命名为 OpenAtom OpenHarmony(简称“OpenHarmony”)。2020 年 12 月,博泰、华为、京东、润和、亿咖通、中科院软件所、中软国际等七家单位(按各单位简称首字母排序)在开放原子开源基金会的组织下成立了 OpenHarmony 项目群工作委员会,开始对 OpenHarmony 项目进行开源社区治理。各家单位对 OpenHarmony 开源项目._技术社区 openharmony

【Linux常用命令】管理用户(useradd、userdel、passwd)_useradd -g users-程序员宅基地

Linux下创建用户:useradd tooker   #创建用户tookerpasswd tooker    #给用户tooker设置密码,如果没有设置密码该用户不能用useradd -g users tooker1 #先创建用户组users,然后在users组下创建一个用户tooker1Linux下删除用户:userdel tooker1   #删除用户tooker1userdel -r tooker1 #删除tooker1,同事删除他的工作目录groupdel ..._useradd -g users

第四周 项目1-建立单链表-程序员宅基地

/* *Copyright (c) 2017,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称: *作 者:陈军正 *完成日期:2017年9月26日 *版 本 号:v1.0 * *问题描述:定义单链表存储结构,用头插法和尾插法建立单链表,并显示建立好以后的结果。*/ #include #include typedef int El

第2章 什么是Activiti7_activiti7和6区别-程序员宅基地

目录第2章 什么是Activiti72.1Activiti 介绍2.1.1 BPM2.1.2 BPM 软件2.1.3 BPMN2.2Activit 如何使用2.2.1部署Activit2.2.2流程定义2.2.3流程定义部署2.2.4启动一个流程实例(ProcessInstance)2.2.5用户查询待办任务(Task)2.2.6用户办理任务2.2.7流程结束第2章 什么是Activiti72.1Activiti 介绍Alfresco 软件在 _activiti7和6区别

elasticsearch 设置 mapping 时的 store 属性-程序员宅基地

总结:es在存储数据的时候发吧json对象存储到"_source"字段里,如果index 属性设置了 analyzed 会做一个倒排表方便查询。可以理解_source 就是数据库里的一条记录(可以选着不存),index就是存索引信息的(可以选着不索引)。转自:https://www.jeeboot.com/archives/1499.html使用 elasticsearch 时碰上

【JDK源码】两万字暴淦ConcurrentHashMap-程序员宅基地

文章目录开篇问题简介各种锁简介源码分析成员属性构造方法添加元素初始化桶数组判断是否需要扩容协助扩容(迁移元素)迁移元素删除元素获取元素获取元素个数总结开篇问题(1)ConcurrentHashMap与HashMap的数据结构是否一样?(2)HashMap在多线程环境下何时会出现并发安全问题?(3)ConcurrentHashMap是怎么解决并发安全问题的?(4)ConcurrentHashMap使用了哪些锁?(5)ConcurrentHashMap的扩容是怎么进行的?(6)Concurrent

推荐文章

热门文章

相关标签