鍍金池/ 教程/ Java/ 第一課 Create a Window
第四十四課 GLFW
第十七課 環(huán)境光(Ambient Lighting)
第二十四課 陰影貼圖(二)
第十五課 相機控制(二)
第四十五課 屏幕空間環(huán)境光遮擋
第十六課 基本的紋理貼圖
第九課 插值
第二十八課 使用 Transform Feedback 創(chuàng)建粒子系統(tǒng)
第三十二課 頂點數(shù)組對象
第十課 索引繪制
第三十一課 基于PN算法的曲面細分
第四十六課 SSAO 與深度重構(gòu)
第十二課 透視投影
第四十一課 運動模糊
第十四課 相機控制(一)
第八課 縮放變換
第二十三課 陰影貼圖(一)
第六課 平移變換
第七課 旋轉(zhuǎn)變換
第一課 Create a Window
第十一課 矩陣連乘
第十八課 漫反射光
第四十三課 點光源的多通道陰影映射
第三十五課 延遲渲染(一)
第二十一課 聚光燈
第二十七課 廣告牌和幾何著色器
OpenGL教程翻譯 第三課 First Triangle
第二十課 點光源
第五課 Uniform Variables
第二十二課 使用Assimp加載模型
第三十三課 實例渲染
第三十七課 延遲渲染(三)
第四十二課 基于 PCF 的陰影優(yōu)化
第二十五課 天空盒
第二課 繪制一個點
第三十八課 用 Assimp 導入骨骼動畫
第三十課 曲面細分
第四十課 模板陰影體
第三十四課 GLFX —— 一個 OpenGL 效果庫
第二十九課 3D 拾取
OpenGL教程翻譯 第四課 Shaders
第十九課 鏡面反射
第三十九課 邊緣檢測
第十三課 相機空間
第三十六課 延遲渲染(二)
第二十六課 法線紋理

第一課 Create a Window

Background

OpenGL 標準沒有指定任何用于建立和使用窗口的 API。在x系統(tǒng)中提供 OpenGL 的接口為 GLX。Windows 提供 WGL 而 MacOS 提供 CGL。為了建立一個能夠顯示圖像的窗口,我們直接使用這些接口,這樣就不用關(guān)心在不同操作系統(tǒng)中的具體實現(xiàn)細節(jié)。我們這里使用的庫叫 ‘OpenGL utility library’ 簡稱 GLUT。它為窗口的管理、事件處理、IO 控制和一些其他的設(shè)備管理提供了一個簡單的 API。此外,GLUT 是跨平臺的,這使移植更方便。SDL 和GLFW 可代替 GLUT。

Source walkthrough

glutInit(&argc,argv);

這個函數(shù)是為了初始化 GLUT。里面的參數(shù)可以直接從命令行中得到,同時可以包含其他有用的選項比如 '-sync' 和 '-gldebug',這樣可以自動的檢查GL的錯誤并獨立的顯示它們。

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);

現(xiàn)在我們學習設(shè)置一些 GLUT 的參數(shù),GLUT_DOUBLE 設(shè)置雙緩沖(double buffering,即當一個 buffer 顯示的時候,另一個 buffer 用來繪制)和 color buffer,后者是大多數(shù)渲染結(jié)束的地方(比如屏幕)。后面章節(jié)中我們經(jīng)常用到這兩個和其他的參數(shù)。

glutInitWindowSize(1024, 768);    
glutInitWindowPosition(100, 100);  
glutCreateWindow("Tutorial 01");

這些函數(shù)設(shè)置了窗口的參數(shù)(包括窗口大小、窗口位置以及窗口標題)并創(chuàng)建窗口。

glutDisplayFunc(RenderSceneCB);

因為我們工作在一個窗口系統(tǒng)中,可以通過事件回調(diào)函數(shù)與運行中的項目進行交互。GLUT 可以和基本的窗口系統(tǒng)進行交互,并且提供給我們一些回調(diào)函數(shù)。在這里我們僅僅使用了一個主回調(diào)函數(shù),這個主回調(diào)函數(shù)完成了一幀中的所有渲染工作。這個函數(shù)被 GLUT 內(nèi)部循環(huán)不斷的調(diào)用。

glClearColor(0.0f,0.0f, 0.0f, 0.0f);

在 OpenGL 中,這是我們第一次遇到 ‘state’ 這個概念。提出 ‘state’ 的原因是:渲染是一個復(fù)雜的任務(wù),不能夠像對待一個接受參數(shù)的函數(shù)命令(設(shè)計良好的函數(shù)不會有太多參數(shù))一樣對待它。你需要去指定 shaders、buffers 和各種可以影響渲染過程的屬性。此外,你會經(jīng)常需要讓幾個渲染操作有同樣的設(shè)置(比如,如果你從未禁用深度測試的功能,那就不用在每次渲染調(diào)用的時候去設(shè)置它)。這就是為什么 “大部分渲染操作的配置是通過設(shè)置 OpenGL 狀態(tài)機內(nèi)的屬性和參數(shù)值來完成,而渲染命令僅能使用跟繪制的頂點的個數(shù)和初始偏移量有關(guān)的個別參數(shù)” 的原因。在調(diào)用一個狀態(tài)改變函數(shù)之后(改變 OpenGL 的狀態(tài)),這個狀態(tài)將保持不變直到用不同的參數(shù)值再次調(diào)用此函數(shù)。上面這個函數(shù)是用來設(shè)置清除幀緩存(后面介紹)時要用到的顏色。顏色有四個通道(RGBA),而且它被指定為 0.0 – 1.0 之間標準化的值。

glutMainLoop();

這個函數(shù)調(diào)用將控制傳遞給 GLUT,并且開啟了它自己內(nèi)部的循環(huán)。在這個循環(huán)中,它監(jiān)聽來自窗口系統(tǒng)的事件并通過我們設(shè)置的回調(diào)函數(shù)傳遞給 GLUT。在本例子中,GLUT只調(diào)用我們定義用來顯示窗口的回調(diào)函數(shù)(RenderSceneCB),以使我們能渲染幀。

glClear(GL_COLOR_BUFFER_BIT);
glutSwapBuffers();

第一個函數(shù)的功能僅僅就是清除幀緩存(使用我們在上面指定過的顏色)。第二個函數(shù)調(diào)用是為了告訴 GLUT 在 backbuffer 和 frontbuffer 之間進行交換。在通過幀回調(diào)函數(shù)的下一個循環(huán)中,我們將場景渲染到當前的 frontbuffer 中,而 backbuffer 將被顯示。

Operation Resuls

http://wiki.jikexueyuan.com/project/modern-opengl-tutorial/images/picture01.png" alt="" />