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"

int
  CurrentWidth = 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:

opengl微开发之1-从零开始

时间: 2024-12-30 10:16:42

opengl微开发之1-从零开始的相关文章

opengl微开发之1-从零開始

对OpenGL有一点了解之后,如今開始真正编写代码. 今天的内容: 使用FreeGLUT创建OpenGL的上下文环境 初始化GLEW 创建一个OpenGL的的模板范例 第一步: 一个OpenGL的上下文能够同意我们传递命令究竟层硬件,所以须要一个上下文环境.首先须要配置一个功能窗体,创建一个名为chapter1.c的文件,在你的编辑器或者集成开发环境中打开它,插入例如以下代码: #include <stdlib.h> #include <stdio.h> #include <

android OpenGL ES开发之shader

shader是OpenGL ES中重要内容. 简介 shader程序是运行在GPU上的程序,是用GLSL语言编写的程序. 功能 使用OpenGL的着色器,可以丰富渲染效果,能实现的功能包括: (1) 更加真实的材质-金属.石头.木头等 (2) 更加真实的光照效果-区域光照.柔和阴影等 (3) 自然现象-火.烟.水.云等 (4) 高级渲染效果-全局光照.光线追踪器等 (5) 非照片级材质-绘画效果.笔写效果等 (6) 纹理内存新的一些用途-向量的存储.模糊值.多项式系数等 (7) 过程纹理-动态生

物联网的全栈开发之路

本文由嵌入式企鹅圈原创团队成员-华南师范大学物联网创新中心黄鑫执笔. 两年前我还一直专注在android系统定制领域的研究,对物联网关注比较少,尽管我个人对智能家居的概念和场景体验也比较熟悉.真正引起我注意的是有一次在车上,听到电视广播说打开蓝牙,用手机摇一摇就可以摇到红包,我就觉得这个场景很棒,然后就知道了ibeacon和微信摇一摇周边,知道了微信硬件平台和物联网的发展已经深入渗透到我们的生活了.尽管我觉得自己进入物联网不算早,但是考虑到传统电子行业都有升级到物联的需求,加上自身在嵌入式和AP

【转载】浅谈游戏开发之2D手游工具

浅谈游戏开发之2D手游工具 来源:http://www.gameres.com/459713.html 游戏程序 平台类型: iOS Android  程序设计: 其它  编程语言:   引擎/SDK: 其它  全球手游行业规模将突破250亿美元,越来越多的开发者开始进入手游研发领域,而作为一名菜鸟,很多时候,如果没有其他开发者的建议,会走很多弯.独立工作室Sheado.net公司的Chad Ata在博客中分享了他们从一开始进入手游研发到如今四年多以来积累的经验,希望可以给新入行者提供一些帮助.

ios开发之OC基础-类和对象

本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再将零散的知识点整理出来.这样的学习方法会带来更多的收获,同时要多做练习,按照思路,默写.改写代码.在这里,感谢欧阳坚老师,学习你的课程使我走上了ios的开发之路. 一定要明确一个要从事的方向,要不然就会感到迷茫.学习ios开发,并且从事ios开发这个行业,这就是我的选择.看到我的博客系列文章,其中大

IOS开发之copy的问题

copy的目的就是修改副本,修改原始对象和副本时不会产生干扰. 定义一个不可变属性A,再定义一个可变属性B.用B做添加删除等操作后再将B赋值给A时,有些人习惯用A = B:其实这样是不安全的. 假设有下面的一段代码: ? 1 2 3 4 5 6 7 8 9 10   int main() {    NSMutableString *strM = [NSMutableString [email protected]"123"];    NSString *str = strM;    N

Android 安全开发之 ZIP 文件目录遍历

1.ZIP文件目录遍历简介 因为ZIP压缩包文件中允许存在"../"的字符串,攻击者可以利用多个"../"在解压时改变ZIP包中某个文件的存放位置,覆盖掉应用原有的文件.如果被覆盖掉的文件是动态链接so.dex或者odex文件,轻则产生本地拒绝服务漏洞,影响应用的可用性,重则可能造成任意代码执行漏洞,危害用户的设备安全和信息安全.比如近段时间发现的"寄生兽"漏洞.海豚浏览器远程命令执行漏洞.三星默认输入法远程代码执行漏洞等都与ZIP文件目录遍历有

iOS开发之WKWebView简单使用和常用使用场景

iOS开发之 WKWebVeiw使用 想用UIWebVeiw做的,但是突然想起来在iOS8中出了一个新的WKWebView,算是UIWebVeiw的升级版.本着对新事物的好奇,就上网查了一下,但是找了好多个都没说的多了详细,于是就问谷歌,找文档,看看使用方法,试用了一下,果然不错,记录下来,大家分享! WKWebView的特点: 性能高,稳定性好,占用的内存比较小, 支持JS交互 支持HTML5 新特性 可以添加进度条(然并卵,不好用,还是习惯第三方的). 支持内建手势, 据说高达60fps的刷

ArcEngine开发之Command控件使用篇

转自原文 ArcEngine开发之Command控件使用篇 在ArcEngine类库中有大量的Command控件用来与地图控件进行操作和交互.比如有一系列的地图浏览控件.地图查询控件.图斑选取控件.编辑控件来与MapControl和PageLayoutControl进行交互.这些控件被包含在ESRI.ArcGIS.Controls.dll类库中,位于ESRI.ArcGIS.Controls命名空间下. 这些内置的Command控件可以单独实例化来使用,也可以被安置在一个AxToolbarCont