opengl微开发之1-从零開始
對OpenGL有一點了解之后,如今開始真正編寫代碼。
今天的內(nèi)容:
? ? ? ? 使用FreeGLUT創(chuàng)建OpenGL的上下文環(huán)境
? ? ? ? 初始化GLEW
? ? ? ? 創(chuàng)建一個OpenGL的的模板范例
第一步:
? ? ? ? ?一個OpenGL的上下文能夠同意我們傳遞命令究竟層硬件,所以須要一個上下文環(huán)境。首先須要配置一個功能窗體,創(chuàng)建一個名為chapter1.c的文件,在你的編輯器或者集成開發(fā)環(huán)境中打開它,插入例如以下代碼:
#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(); }編譯執(zhí)行之,將會得到例如以下窗體:
解釋:
WINDOW_TITLE_PREFIX ?定義窗體名字
CurrentWidth、CurrentHeight ?窗體的尺寸
WindowHandle ? FreeGLUT創(chuàng)建的窗體處理句柄
初始化:
聲明函數(shù)原形并定義main應(yīng)用程序入口函數(shù),在Initialize函數(shù)中調(diào)用InitWindow函數(shù)。InitWindow調(diào)用幾個FreeGLUT函數(shù)創(chuàng)建一個窗體,以glutInit函數(shù)開始,其作用是初始化FreeGLUT類庫。其參數(shù)是main傳入的兩個參數(shù),你也能夠不使用不論什么參數(shù)。
上下文類型和窗體選項:
? ? ? ? glutInitContextVersion
? ? ? ? glutInitContextFlags
? ? ? ? glutInitContextFrofile
? ? ? ? glutSetOption 其參數(shù)GLUT_ACTION_ON_WINDOW_CLOSE是確保glutMainLoop函數(shù)在main結(jié)束時將其清除。
? ? ? ? glutInitWindowSize 初始化窗體的尺寸
顯示模式:
? ? ? ? glutInitDisplayMode ?定義OpenGL上下文類型,設(shè)備應(yīng)該怎樣渲染場景,選擇有:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? GLUT_DEPATH ?啟動Depth buffer,也叫Z-buffer,依據(jù)它來決定像素屏幕上的渲染順序
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?GLUT_DOUBLE ?啟動 double-buffer,也就是開啟前后端顯示緩存,主要是降低圖片的閃爍
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?GLUT_RGBA ? ? ? ?定義色彩的混合模式,即RGBA混合模式
創(chuàng)建窗體:
glutCreateWindow 創(chuàng)建我們的上下文環(huán)境并返回新創(chuàng)建的窗體處理句柄。其參數(shù)WINDOW_TITLE_PREFIX即窗體的名稱
函數(shù)回調(diào):
glutReshapeFunction 處理窗體尺寸
glutDisplayFunction ?渲染場景
調(diào)試輸出:
glGetString 獲取OPengl的版本號
fprintf ?c函數(shù),打印字符
例如以下:
屏幕刷新顏色:
? ? ? glClearColor ?其參數(shù)相應(yīng)的是FreeGLUT的GLUT_RGBA設(shè)置模式,值范圍0~1.0f相應(yīng)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
最后的參數(shù)是透明度。
主循環(huán): ? ? ? ?glutMainLoop 僅僅要窗體處于活動狀態(tài),就會不斷運行這個函數(shù),知道窗體退出。 ? ? ? ? 重置渲染尺寸: ? ? ? ? ResizeFunction 其CurrentWith和CurrentHeight窗體尺寸 ? ? ? ? ?glViewpoirt ?參數(shù)為X-coordinate,Y-coordinate,width,height即渲染的規(guī)格尺寸
渲染: ? ?RenderFunction 繪制對象 ? ?glclear 即第一次往后端緩存中填充的顏色,之后在上面繪制其它對象 ? ?glutSwapBuffer?交換前后端顯示緩存數(shù)據(jù)
調(diào)用玩glutSwapBuffers之后:
加入GLEW:
轉(zhuǎn)載于:https://www.cnblogs.com/mengfanrong/p/4246309.html
總結(jié)
以上是生活随笔為你收集整理的opengl微开发之1-从零開始的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据加密算法的简介与应用
- 下一篇: HDU2067 小兔的棋盘