opengl微开发之1-从零開始
对OpenGL有一点了解之后,如今開始真正编写代码。
今天的内容:
使用FreeGLUT创建OpenGL的上下文环境
初始化GLEW
创建一个OpenGL的的模板范例
第一步:
一个OpenGL的上下文能够同意我们传递命令究竟层硬件,所以须要一个上下文环境。首先须要配置一个功能窗体,创建一个名为chapter1.c的文件,在你的编辑器或者集成开发环境中打开它,插入例如以下代码:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <GL/glew.h>
#include <GL/freeglut.h>
#define WINDOW_TITLE_PREFIX "Chapter 1"intCurrentWidth = 800,CurrentHeight = 600,WindowHandle = 0;void Initialize(int, char*[]);
void InitWindow(int, char*[]);
void ResizeFunction(int, int);
void RenderFunction(void);int main(int argc, char* argv[])
{Initialize(argc, argv);glutMainLoop();exit(EXIT_SUCCESS);
}void Initialize(int argc, char* argv[])
{InitWindow(argc, argv);fprintf(stdout,"INFO: OpenGL Version: %s\n",glGetString(GL_VERSION));glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
}void InitWindow(int argc, char* argv[])
{glutInit(&argc, argv);glutInitContextVersion(4, 0);glutInitContextFlags(GLUT_FORWARD_COMPATIBLE);glutInitContextProfile(GLUT_CORE_PROFILE);glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE,GLUT_ACTION_GLUTMAINLOOP_RETURNS);glutInitWindowSize(CurrentWidth, CurrentHeight);glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);WindowHandle = glutCreateWindow(WINDOW_TITLE_PREFIX);if(WindowHandle < 1) {fprintf(stderr,"ERROR: Could not create a new rendering window.\n");exit(EXIT_FAILURE);}glutReshapeFunc(ResizeFunction);glutDisplayFunc(RenderFunction);
}void ResizeFunction(int Width, int Height)
{CurrentWidth = Width;CurrentHeight = Height;glViewport(0, 0, CurrentWidth, CurrentHeight);
}void RenderFunction(void)
{glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glutSwapBuffers();glutPostRedisplay();
}
编译执行之,将会得到例如以下窗体:
解释:
WINDOW_TITLE_PREFIX 定义窗体名字
CurrentWidth、CurrentHeight 窗体的尺寸
WindowHandle FreeGLUT创建的窗体处理句柄
初始化:
声明函数原形并定义main应用程序入口函数,在Initialize函数中调用InitWindow函数。InitWindow调用几个FreeGLUT函数创建一个窗体,以glutInit函数開始,其作用是初始化FreeGLUT类库。其參数是main传入的两个參数,你也能够不使用不论什么參数。
上下文类型和窗体选项:
glutInitContextVersion
glutInitContextFlags
glutInitContextFrofile
glutSetOption 其參数GLUT_ACTION_ON_WINDOW_CLOSE是确保glutMainLoop函数在main结束时将其清除。
glutInitWindowSize 初始化窗体的尺寸
显示模式:
glutInitDisplayMode 定义OpenGL上下文类型,设备应该怎样渲染场景,选择有:
GLUT_DEPATH 启动Depth buffer,也叫Z-buffer,依据它来决定像素屏幕上的渲染顺序
GLUT_DOUBLE 启动 double-buffer,也就是开启前后端显示缓存,主要是降低图片的闪烁
GLUT_RGBA 定义色彩的混合模式,即RGBA混合模式
创建窗体:
glutCreateWindow 创建我们的上下文环境并返回新创建的窗体处理句柄。其參数WINDOW_TITLE_PREFIX即窗体的名称
函数回调:
glutReshapeFunction 处理窗体尺寸
glutDisplayFunction 渲染场景
调试输出:
glGetString 获取OPengl的版本号
fprintf c函数,打印字符
例如以下:
屏幕刷新颜色:
glClearColor 其參数相应的是FreeGLUT的GLUT_RGBA设置模式,值范围0~1.0f相应1~100%色彩强度。
以下是RGBA的混合直观效果图:
样例:
glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
for redglClearColor(0.0f, 1.0f, 0.0f, 0.0f);
for greenglClearColor(0.0f, 0.0f, 1.0f, 0.0f);
for blueglClearColor(1.0f, 0.0f, 1.0f, 0.0f);
for purpleglClearColor(0.0f, 0.0f, 0.5f, 0.0f);
for dark blue
转载于:https://www.cnblogs.com/mengfanrong/p/4246309.html
opengl微开发之1-从零開始相关推荐
- # 从零開始搭建Hadoop2.7.1的分布式集群
Hadoop 2.7.1 (2015-7-6更新),Hadoop的环境配置不是特别的复杂,可是确实有非常多细节须要注意.不然会造成很多配置错误的情况.尽量保证一次配置正确防止重复改动. 网上教程有非常 ...
- 從零開始學 ReactJS:最完整的 React 生態系入門教程
转自:https://github.com/kdchang/reactjs101 從零開始學 ReactJS(ReactJS 101)是一本希望讓初學者一看就懂的 ReactJS 中文入門教學書,由淺 ...
- [Golang] 从零開始写Socket Server(3): 对长、短连接的处理策略(模拟心跳)
通过前两章,我们成功是写出了一套凑合能用的Server和Client,并在二者之间实现了通过协议交流.这么一来,一个简易的socket通讯框架已经初具雏形了,那么我们接下来做的.就是想办法让这个框架更 ...
- 从零開始学androidlt;SeekBar滑动组件.二十二.gt;
拖动条能够由用户自己进行手工的调节,比如:当用户须要调整播放器音量或者是电影的播放进度时都会使用到拖动条,SeekBar类的定义结构例如以下所看到的: java.lang.Object ↳ an ...
- Spring 从零開始-05
最终能到Spring的AOP编程了,AOP的概念特别的多.所以须要你在開始之前有点了解,然后通过代码慢慢学习! - 切面(Aspect):一个关注点的模块化,这个关注点实现可能另外横切多个对象.事务管 ...
- unity3d从零開始(五):了解摄像机
1.简单介绍 Unity的摄像机是用来将游戏世界呈现给玩家的,游戏场景中至少有一台摄像机.也能够有多台. 2.类型 Unity中支持两种类型的摄像机,各自是Perspective(透视)以及Ortho ...
- 从零開始学习制作H5应用——V5.0:懊悔机制,整理文件夹,压缩,模板化
经过前面四个版本号的迭代.我们已经制作了一个从视觉和听觉上都非常舒服的H5微场景应用,没有看过的请戳以下: V1.0--简单页面滑动切换 V2.0--多页切换.透明过渡及交互指示 V3.0--增加lo ...
- 天堂Lineage(單機版)從零開始架設教學
此篇文章 內容大部份連結 已失效, 我已另外寫一篇更快速安裝的文章. 前言: 網路遊戲天堂在數年前,被日本人分析封包的方式.模擬出Lineage server端的行為. 不像天堂II,及RO是由內部洩 ...
- 天堂Lineage(單機版)從零開始架設教學 Installing Lineage 3.52 Server - On Windows
1. [下載原始碼] Using RapidSVN 用checkout http://l1j-tw-99nets.googlecode.com/svn/trunk/L1J-TW_3.50c/ 2. ...
最新文章
- 王高利:Kvm虚拟化(1)__基础搭建
- 神经网络早期的M-P(Warren McCulloch-Walter Pitts)模型
- 关于set sql_trace=ture 的一些用法
- 洛谷 - P3254 圆桌问题(最大流+路径打印)
- coreldraw凹槽_CorelDRAW教程 打造逼真静物写生油画
- Math类的三个方法比较: floor() ceil() round()
- 调整数组顺序使奇数位于偶数前
- python queue 生产者 消费者_生产者、消费者模型---Queue类
- Django中的Object Relational Mapping(ORM)
- 读取文本作为输出字段
- 【CSS3】纯CSS代码实现模拟时钟,+js对时功能。
- 【Python】爬取xici和快代理的免费代理ip
- 2021.02.18 北师大寒假新生训练
- Android ExoPlayer播放音视频的使用指南
- ARM嵌入式系统的问题分析与总结
- 大禹电子:元宵佳节逛花灯,猜灯谜好不热闹
- Android 简单的折叠布局,上滑监听透明度
- mx150 宏碁swift3_大众化的轻薄本-宏碁蜂鸟Swift 3评测报告
- gets_s()函数
- MySQL数据库的数据更新
热门文章
- Tomcat6.0.37,tomcat6.0.37,下访问Web项目,jsp项目不需要输入项目名称和端口号的配置方法...
- 《Python Cookbook 3rd》笔记(1.18):映射名称到序列元素
- ccf json解析 java,【求助】e4a json解析 求助大佬帮忙老看下怎么取?
- 北大青鸟java y2_Struts-2 北大青鸟 Y2学年 项目案例使用 2框架开发租房网站 Java Develop 249万源代码下载- www.pudn.com...
- .sql文件如何执行_干货|一条SQL查询语句是如何执行的
- Java JUC工具类--Master-Worker
- Arrays.deepToString() 方法同时适用于基元数组和对象数组
- Python学习2 条件判断语句if,循环语句for while
- 排序与查找 详细分析
- 操纵浏览器历史记录 : popstate() 、 history.pushState() 、 window.history.pushState()