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 red
  • glClearColor(0.0f, 1.0f, 0.0f, 0.0f); for green
  • glClearColor(0.0f, 0.0f, 1.0f, 0.0f); for blue
  • glClearColor(1.0f, 0.0f, 1.0f, 0.0f); for purple
  • glClearColor(0.0f, 0.0f, 0.5f, 0.0f); for dark blue

最后的參数是透明度。

主循环:
       glutMainLoop 仅仅要窗体处于活动状态,就会不断运行这个函数,知道窗体退出。
       
重置渲染尺寸:
        ResizeFunction 其CurrentWith和CurrentHeight窗体尺寸
         glViewpoirt  參数为X-coordinate,Y-coordinate,width,height即渲染的规格尺寸


渲染:
   RenderFunction 绘制对象
   glclear 即第一次往后端缓存中填充的颜色,之后在上面绘制其它对象
   glutSwapBuffer 交换前后端显示缓存数据

调用玩glutSwapBuffers之后:


加入GLEW:

转载于:https://www.cnblogs.com/mengfanrong/p/4246309.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459686.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git客户端(Windows系统)的使用(Putty)(转)

本文环境&#xff1a; 操作系统&#xff1a;Windows XP SP3 Git客户端&#xff1a;TortoiseGit-1.8.14.0-32bit 一、安装Git客户端 全部安装均采用默认&#xff01; 1. 安装支撑软件 msysgit: http://msysgit.github.io/ 当前最新版本为v1.9.5。 2. 安装TortoiseGit 首先&#…

oracle只舍不入,Oracle常识基础(一)

一.Oracle数据类型1.字符数据类型.> char:可以存储字母数字值&#xff0c;长度在1到2000个字节。.> varchar2:存储可变长度的char类型字符串,大小在1到4000个字节范围内。.> long:存储可变长度的字符数据,最多存储2GB。long类型的使用限制&#xff1a;*********…

软件测试的误区

随着软件测试对提高软件质量重要性的不断提高&#xff0c;软件测试也不断受到重视。但是&#xff0c;国内软件测试过程的不规范&#xff0c;重视开发和轻视测试的现象依旧存在。因此&#xff0c;对于软件测试的重要性、测试方法和测试过程等方面都存在很多不恰当的认识&#xf…

Kubernetes用户指南(二)--部署组合型的应用、连接应用到网络中

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/qq1010885678/article/details/49026825 一、部署组合型的应用1、使用配置文件启动replicas集合k8s通过Replication Controller来创建和管理各个不同的重复容器集合&#xff…

oracle指令df,​ oracle 常用命令大汇总

oracle常用命令大汇总第一章&#xff1a;日志管理1、forcing log switchessql> alter system switch logfile;2、forcing checkpointssql> alter system checkpoint;3、adding online redo log groupssql> alter database add logfile [group 4]sql> (/disk3/log4a…

时刻获取浏览器宽度

$(function(){$(window).resize(Nchwid);function Nchwid() {var widdocument.documentElement.clientWidth;console.log(wid); }}) 转载于:https://www.cnblogs.com/nc-blog/p/4250132.html

oracle 函数

运算符: 算数运算符: - * / 连接运算符 || e.g select a||b||c from dual; 比较运算符 >, , >, <, <, !, like, between and, is null, in 任何值与null进行运算 都为null ascii(a); 根据字符 返回编码值 chr(编…

oracle中defined,Oracle:专栏定义(Oracle: column ambigously defined)

Oracle&#xff1a;专栏定义(Oracle: column ambigously defined)我收到以下错误。 据我所知&#xff0c;所有列都是由表名定义的&#xff0c;所以我不明白为什么我从Oracle数据库中得到这个错误。OCIError: ORA-00918: column ambiguously defined: SELECT * FROM (SELECT raw…

两道二分coming~

第一道&#xff1a;poj 1905Expanding Rods 题意&#xff1a;两道墙&#xff08;距离L&#xff09;之间架一根棒子&#xff0c;棒子受热会变长&#xff0c;弯曲&#xff0c;长度变化满足公式&#xff08; s(1n*C)*L&#xff09;&#xff0c;求的是弯曲的高度h。 首先来看这个图…

include静态加载布局ViewStub动态加载布局

layout"layout/" 文件名.xml/> 他可以加载任何的layout如果是如果想加载一个控件&#xff0c;要把这个控件写在layout。xml文件里 ViewStub android:id"id/vsb" android:layout_width"match_parent" android:layout_height&qu…

oracle 返回表的函数,oracle 返回表函数

--首先创建一个类型create or replace type t_test as object( empno number(4), ename varchar2(20), job varchar2(20), sal number(7,2) ) ; ---创建一个对象&#xff0c;引用上面的类型t_test create or replace type t_test_table as table of t_t…

十天学Linux内核之第七天---电源开和关时都发生了什么

十天学Linux内核之第七天---电源开和关时都发生了什么 原文:十天学Linux内核之第七天---电源开和关时都发生了什么说实话感觉自己快写不下去了&#xff0c;其一是有些勉强跟不上来&#xff0c;其二是感觉自己越写越差&#xff0c;刚开始可能是新鲜感以及很多读者的鼓励&#xf…

dede php 里加nofollow,织梦导航栏目如何加nofollow

很多用织梦程序做网站的朋友会发现&#xff0c;dedecms后台并没有直接加nofollow的选项。那如果想要给联系我们、关于我们等导航栏目加上nofollow该怎么解决呢&#xff1f;笔者在网上也找了一些资料&#xff0c;有通过修改数据库增加参数的方法&#xff0c;但没有成功。今天笔者…

黄仕沛经方医案医话精选(上) 王晓军 整理

1:出奇兵而不奇&#xff5e; 顽 固 性 呃 逆 案苏某&#xff0c;男&#xff0c;55岁&#xff0c;藉贯潮州&#xff0c;香港商人。二年前&#xff0c;工作压力较大&#xff0c;后而呃逆发作&#xff0c;易中、西医十数&#xff0c;用镇静、解痉等&#xff0c;甚至抗抑郁药…

ubuntu 重启命令,ubuntu 重启网卡方法

ubuntu 重启命令 重启命令&#xff1a;1、reboot2、shutdown -r now 立刻重启(root用户使用)3、shutdown -r 10 过10分钟自动重启(root用户使用)4、shutdown -r 20:35 在时间为20:35时候重启(root用户使用)如果是通过shutdown命令设置重启的话&#xff0c;可以用shutdown -c命令…

【Cocos2d-Js实战教学(1)横版摇杆八方向移动】

本教程主要通过搭建一个横版摇杆八方向移动的实例&#xff0c;让大家如何用Cocos2dx-Js来做一款游戏&#xff0c;从基础了解Cocos2dx-Js的基本实现原理&#xff0c;从创建工程&#xff0c;到各个知识点的梳理。 教程分为上下两讲&#xff1a; 上讲有2个小节&#xff1a; 1&…

oracle 试图访问已经在使用的事物处理临时表,解决ORA-14450:试图访问已经在使用的事务处理临时表-Oracle...

解决ORA-14450:试图访问已经在使用的事务处理临时表解决方法–1、查找sessionIDselect SID,SERIAL# from V$session where SID in (select sid from v$enqueue_lock t where t.type’TO’)SID SERIAL#————————-103 257113 181124 89126 632–2、kill sessionselect ‘…

项目进度管理和项目成本管理的重点梳理

一、项目进度管理作业&#xff1a;1、活动资源估算的方法、技术和工具&#xff1a;专家判断, 多方案分析, 出版的估算数据, 项目管理软件, 自下而上估算. 2、活动历时估算的方法、技术和工具&#xff1a;专家判断, 类比估算, 参数估算, 三点估算, 后备分析. 3、制订进度计划的方…

在单文档中显示我的第一个对话框

在单文档中显示我的第一个对话框 (2010-04-19 21:19:50) 转载▼标签&#xff1a; it 今天编写了在单文档中创建对话框以及调用对话框的代码&#xff0c;收获很多&#xff1b; 1&#xff1a;OnInitDialog函数的加载问题尤其是在VS上的加载&#xff1b;&#xff08;这一点花了…

matlab穆尔,基于matlab(矩阵实验室)的倒立摆控制系统仿真(34页)-原创力文档

基于MA&#xff34;&#xff2c;&#xff21;B的倒立摆控制系统仿真摘  要自动控制原理(包括经典部分和现代部分)是电气信息工程学院学生的一门必修专业基础课&#xff0c;课程中的一些概念相对比较抽象&#xff0c;如系统的稳定性、可控性、收敛速度和抗干扰能力等。倒立摆系…