码迷,mamicode.com
首页 > 其他好文 > 详细

opengl微开发之1-从零开始

时间:2014-06-08 04:03:48      阅读:255      评论:0      收藏:0      [点我收藏+]

标签:opengl   编辑器   缓存   buffer   hardware   

对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();
}

编译运行之,将会得到如下窗口:

bubuko.com,布布扣


解释:

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函数,打印字符

如下:

bubuko.com,布布扣


屏幕刷新颜色:

      glClearColor  其参数对应的是FreeGLUT的GLUT_RGBA设置模式,值范围0~1.0f对应1~100%色彩强度。

      下面是RGBA的混合直观效果图:

bubuko.com,布布扣

   例子:

         

  • 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即渲染的规格尺寸
bubuko.com,布布扣

渲染:
   RenderFunction 绘制对象
   glclear 即第一次往后端缓存中填充的颜色,之后在上面绘制其他对象
   glutSwapBuffer 交换前后端显示缓存数据
bubuko.com,布布扣
调用玩glutSwapBuffers之后:
bubuko.com,布布扣

添加GLEW:

opengl微开发之1-从零开始,布布扣,bubuko.com

opengl微开发之1-从零开始

标签:opengl   编辑器   缓存   buffer   hardware   

原文地址:http://blog.csdn.net/xiebaochun/article/details/29171103

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!