閱讀984 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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:

最後更新:2017-04-03 08:26:28

  上一篇:go Swift學習之一:常量與變量
  下一篇:go 如何在os x或ubuntu下安裝最新的ruby