opengl微开发之1-从零开始

简介: <p>对OpenGL有一点了解之后,现在开始真正编写代码。</p> <p>今天的内容:</p> <p>        使用FreeGLUT创建OpenGL的上下文环境</p> <p>        初始化GLEW</p> <p>        创建一个OpenGL的的模板范例</p> <p><br></p> <p>第一步:</p> <p>         一个OpenGL的上

对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:

相关文章
|
7月前
|
Java Android开发
Android开发之使用OpenGL实现翻书动画
本文讲述了如何使用OpenGL实现更平滑、逼真的电子书翻页动画,以解决传统贝塞尔曲线方法存在的卡顿和阴影问题。作者分享了一个改造后的外国代码示例,提供了从前往后和从后往前的翻页效果动图。文章附带了`GlTurnActivity`的Java代码片段,展示如何加载和显示书籍图片。完整工程代码可在作者的GitHub找到:https://github.com/aqi00/note/tree/master/ExmOpenGL。
168 1
Android开发之使用OpenGL实现翻书动画
|
7月前
|
Android开发 开发者
Android开发之OpenGL的画笔工具GL10
这篇文章简述了OpenGL通过GL10进行三维图形绘制,强调颜色取值范围为0.0到1.0,背景和画笔颜色设置方法;介绍了三维坐标系及与之相关的旋转、平移和缩放操作;最后探讨了坐标矩阵变换,包括设置绘图区域、调整镜头参数和改变观测方位。示例代码展示了如何使用这些方法创建简单的三维立方体。
88 1
Android开发之OpenGL的画笔工具GL10
|
7月前
|
前端开发 API vr&ar
Android开发之OpenGL绘制三维图形的流程
即将连载的系列文章将探索Android上的OpenGL开发,这是一种用于创建3D图形和动画的技术。OpenGL是跨平台的图形库,Android已集成其API。文章以2D绘图为例,解释了OpenGL的3个核心元素:GLSurfaceView(对应View)、GLSurfaceView.Renderer(类似Canvas)和GL10(类似Paint)。通过将这些结合,Android能实现3D图形渲染。文章介绍了Renderer接口的三个方法,分别对应2D绘图的构造、测量布局和绘制过程。示例代码展示了如何在布局中添加GLSurfaceView并注册渲染器。
219 1
Android开发之OpenGL绘制三维图形的流程
|
7月前
|
XML Java Android开发
Android App开发中OpenGL三维投影的讲解及实现(附源码和演示 简单易懂)
Android App开发中OpenGL三维投影的讲解及实现(附源码和演示 简单易懂)
118 1
|
算法 Ubuntu Linux
红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中...
红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中...
从0开发游戏引擎之使用OpenGL绘制三维球体
绘制球体的难点主要在于 要在遍历循环中 根据经纬度反复的使用Cos、Sin函数算出球面上的XYZ三个顶点坐标,一直反复计算,最终三角面多的形成了一个球的形状。
|
缓存 BI API
从0开发游戏引擎之纹理管理器实现 纹理数据绑定OpenGL滤波方式选择线性滤波
从0开发游戏引擎之纹理管理器实现 纹理数据绑定OpenGL滤波方式选择线性滤波
|
监控 API Android开发
音视频开发进阶指南(第四章)-OpenGL-ES显示图片
安卓平台 本节使用OpenGL ES显示PNG图片,基于JNI开发,使用EGL作为OpenGL ES和显示设备之前的桥梁。另外PNG图片的数据读取使用libpng。
232 0
|
存储 缓存 异构计算
NDK OpenGL ES 3.0 开发(二十二):PBO
OpenGL PBO(Pixel Buffer Object),被称为像素缓冲区对象,主要被用于异步像素传输操作。PBO 仅用于执行像素传输,不连接到纹理,且与 FBO (帧缓冲区对象)无关。
619 0
NDK OpenGL ES 3.0 开发(二十二):PBO
|
计算机视觉 索引
NDK OpenGL ES 3.0 开发(二十一):3D 模型加载和渲染
3D 模型的设计一般是由许多小模型拼接组合成一个完整的大模型,一个小模型作为一个独立的渲染单元,我们称这些小模型为网格(Mesh)。
375 0
NDK OpenGL ES 3.0 开发(二十一):3D 模型加载和渲染