一、認識OpenGL相關概念
OpenGL用於做3d圖像的編程接口,用於PC端
OpenGL ES主要針對嵌入式設備使用,用於移動端3d圖形:有3個維度的圖形,屏幕上的3d效果是2d+透視呈現出來的,
三維物體:高度、寬度、深度;二維物體:高度、寬度
3d圖形的深度使用z軸表示3d術語:
- 光柵化:圖形是由像素點構成,將像素點顯示到屏幕上的過程稱爲光柵化;
- 着色:渲染圖形的時候給像素點添加顏色;
- 紋理貼圖:將紋理圖片附着到你繪製的圖像上;
- 混合:顏色混合效果;
- 2d笛卡爾座標系
- x軸與y軸垂直定義一個xy面
3d笛卡爾座標系 - x軸、y軸、z軸,z軸是垂直於xy面,表示深度
線框渲染:平面通過線條形成;
純色渲染:通過顏色形成形狀;
紋理渲染:添加紋理到形狀上;
OpenGL裏只有點、線、三角形,通過這三者來拼成各種形狀着色器:
- 圖元:組成圖像的基本單元
- OpenGL渲染管線:一系列有序的處理階段的序列,用於把我們應用中的數據轉化到OpenGL,生成一個最終圖像的過程
- GLSL:專門爲圖形開發設計的編程語言
- 着色器:
- 頂點着色器(必要)
- 細分着色器(可選)
- 幾何着色器(可選)
- 片元着色器(必選)
着色器渲染流程:
頂點數據->頂點着色器(必要,接收頂點數據,單獨處理每個頂點)->細分着色器(可選,描述物體的形狀,在管線中生成新的幾何體處理(平順)模型,生成最終狀態;對所有的圖像進行修改幾何圖元類型或放棄所有凸緣)->幾何着色器->圖元設置(圖形的形狀)->剪切(剪切視口之外的繪製)->光柵化(輸入圖元的數學描述,轉化爲與屏幕對應的位置像素片元)->片元着色器(必選,給像素點添加顏色)->效果
二、瞭解OpenGL
GPU:CPU是串行運算,時間片快速切換調度任務,處理複雜的邏輯判斷,GPU是併發運算,通過很多的計算單元執行任務
OpenGL簡介:OpenGL是跨平臺計算機圖形應用程序接口規範,用於可視化領域,是一種圖形應用程序編程接口,開發用的圖形庫
OpenGL用來做什麼
- 視頻、圖形、圖片處理
- 2D/3D遊戲引擎開發
- 科學可視化
- 醫學軟件開發
- CAD(計算機輔助技術)
- 虛擬實境(AR、VR)
- AI人工智能
CPU將數據交給GPU處理需要通過OpenGL,OpenGL的buffers緩存區域(顏色緩存區、頂點緩存區、深度緩存區)解決數據飢餓問題,CPU和GPU的數據處理能力高於內存,CPU和GPU控制的內存是分開的,不能從一塊內存複製到另一塊內存執行,因爲複製數據速度很慢,CPU和GPU都不能操作數據,也避免引起錯誤。
C語言C++代碼編譯運行在CPU,OpenGL語言是GLSL,着色器語言
OpenGL使用客戶端--服務端的形式實現,客戶端是我們編寫的代碼,服務端是計算機圖形硬件廠商所提供的OpenGL實現,OpenGL ES框架相當於Client去發起圖像處理請求,GPU相當於Server負責處理圖形操作。
三、OpenGL環境搭建與測試
-
準備資料
-
創建MacOS工程,工程名字自己起,使用Objective-C
-
在General最底部Linked Frameworks and Libraries添加兩個系統庫OpenGL.framework 和 GLUT.framework
-
添加準備好的資料include和libGLTools.a到工程中
在Bulid Settings找到Header Search Paths,拖入GLTools.h 和 glew.h
-
將libGLTools.a 直接拖到工程的==Frameworks== 文件夾裏面,在Linked Frameworks and Libraries裏將libGLTools.a刪除然後重新拖過來添加上,另外刪除文件:AppDelegate.h 、 AppDelegate.m 、ViewController.h 、 ViewController.m 、 main.m ; 創建 main.cpp文件
- 添加代碼到main.cpp
#include "GLShaderManager.h"
#include "GLTools.h"
#include <glut/glut.h>
GLBatch triangleBatch;
GLShaderManager shaderManager;
//窗口大小改變時接受新的寬度和高度,其中0,0代表窗口中視口的左下角座標,w,h代表像素
void ChangeSize(int w,int h)
{
glViewport(0,0, w, h);
}
//爲程序作一次性的設置
void SetupRC()
{
//設置背影顏色
glClearColor(0.1f,0.1f,0.1f,1.0f);
//初始化着色管理器
shaderManager.InitializeStockShaders();
//設置三角形,其中數組vVert包含所有3個頂點的x,y,笛卡爾座標對。
GLfloat vVerts[] = {
-0.5f,0.0f,0.0f,
0.5f,0.0f,0.0f,
0.0f,0.5f,0.0f,
};
//批次處理
triangleBatch.Begin(GL_TRIANGLES,3);
triangleBatch.CopyVertexData3f(vVerts);
triangleBatch.End();
}
//開始渲染
void RenderScene(void)
{
//清除一個或一組特定的緩衝區glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
//設置一組浮點數來表示紅色
GLfloat vRed[] = {1.0f,0.0f,0.0f,1.0f};
//傳遞到存儲着色器,即GLT_SHADER_IDENTITY着色器,這個着色器只是使用指定顏色以默認笛卡爾座標第在屏幕上渲染幾何圖形
shaderManager.UseStockShader(GLT_SHADER_IDENTITY,vRed);
//提交着色器
triangleBatch.Draw();
//將在後臺緩衝區進行渲染,然後在結束時交換到前臺
glutSwapBuffers();
}
int main(int argc,char* argv[])
{
//設置當前工作目錄,針對MAC OS X
gltSetWorkingDirectory(argv[0]);
//初始化GLUT庫
glutInit(&argc, argv);
/*初始化雙緩衝窗口,其中標誌GLUT_DOUBLE、GLUT_RGBA、GLUT_DEPTH、GLUT_STENCIL分別指
雙緩衝窗口、RGBA顏色模式、深度測試、模板緩衝區*/
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
//GLUT窗口大小,標題窗口
glutInitWindowSize(800,600);
glutCreateWindow("Triangle");
//註冊回調函數
glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScene);
//驅動程序的初始化中沒有出現任何問題。
GLenum err = glewInit();
if(GLEW_OK != err) {
fprintf(stderr,"glew error:%s\n",glewGetErrorString(err));
return 1;
}
//調用SetupRC
SetupRC();
glutMainLoop();
return 0;
}
- 將GLBatch.h、GLShaderManager.h、GLTools.h、GLTriangleBatch.h中報錯的頭文件引入由<>改爲"",編譯時由<>系統引入,改爲""普通引入,點擊運行窗口出現一個三角形