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"intCurrentWidth = 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:
轉載于:https://www.cnblogs.com/mengfanrong/p/4246309.html
總結
以上是生活随笔為你收集整理的opengl微开发之1-从零開始的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据加密算法的简介与应用
- 下一篇: HDU2067 小兔的棋盘