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:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微个日光日

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值