一、環境配置 1.創建macOS工程 2.添加OpenGL.framework和GLUT.framework兩個系統庫 3.拖入資源文件 如果libGLTools.a問價先拖入到工程其他位置,後再移到frameworks文件夾下,則鏈接錯誤 4.配置include文件夾的位置 此處是相對位置:“$( ...
一、環境配置
1.創建macOS工程
2.添加OpenGL.framework和GLUT.framework兩個系統庫
3.拖入資源文件
如果libGLTools.a問價先拖入到工程其他位置,後再移到frameworks文件夾下,則鏈接錯誤
4.配置include文件夾的位置
此處是相對位置:“$(SRCROOT)/”+“Mac環境搭建/”
5.刪除代理等文件,並創建C++ main文件
6.複製一部分demo中的代碼,編譯
報錯的引用的頭文件的引用方式,按照提示”fix”即可——尖括弧改成雙引號
二、頭文件引用
GLShaderManager.h文件引用須放在GLTools.h和GLUT/GLUT.h文件之前,否則會找不到相關頭文件
三、OpenGL坐標系認識
1.以面對屏幕為準:向右為X軸正方向,向上為Y軸正方向,從屏幕由里到外為Z軸正方向;
2.坐標系範圍(X、Y、Z軸):-1到1;
五、圖形繪製——以正弦函數圖形為例
//定義全局變數和函數聲明
//定義一個著色管理器 GLShaderManager shaderManager; //GLTools的一個簡單容器 GLBatch triangleBatch; void drawSquare(); void drawCircle(); void drawSin(); int moveSquare(int argc, char *argv[]); int playUpTriangle(int argc,char* argv[]); void changeSize(int w, int h); void specialKeys(int key, int x, int y); void renderScene(); void setUpRC(); void moveSSetUpRC();
//main函數中的準備工作
//初始化一個GLUT庫 glutInit(&argc, (char **)argv); //創建視窗並命名 glutCreateWindow("LYB_Window"); //註冊繪圖函數 glutDisplayFunc(draw); //開啟迴圈:處理視窗和操作系統的用戶輸入等操作 glutMainLoop();
glutMainLoop();開啟一個無線執行的迴圈事件,其後面的代碼命令是不會執行的
//設置顏色
//設置視窗背景顏色:red\green\blue\alpha glClearColor(0.3f, 0.2f, 0.1f, 0.0f); //清除緩存區 glClear(GL_COLOR_BUFFER_BIT); //設置圖形顏色 glColor3f(0.0f, 0.0f, 1.0f);
windows顏色取值範圍:0~255;iOS,macOS取值範圍:0~1浮點值
//繪製X、Y坐標軸
//繪圖模式:兩點連成直線 glBegin(GL_LINES); //繪製X軸 glVertex2f(-1.0f, 0.0f); glVertex2f(1.0f, 0.0f); //繪製Y軸 glVertex2f(0.0f, -1.0f); glVertex2f(0.0f, 1.0f); glEnd();
glBegin(GL_LINES)渲染開始,glEnd()渲染結束
//繪製正線曲線
//繪圖模式:繪製連續的直線 glBegin(GL_LINE_STRIP); //factor值越大,則正弦周期越長;反之,越小 const GLfloat factor = 0.1f; GLfloat x; for (x=-1.0f/factor; x<1.0f/factor; x+=0.01f) { //y=k*sinx為正弦函數,k>0,原點左側半個周期處在第二象限;k<0為第三象限 glVertex2f(x*factor, sin(x)*factor); } glEnd();
factor為0.1時的效果圖
factor為0.5時的效果圖
註:如果以下代碼未寫,則以上所有的繪製渲染代碼都將無效
//強制刷新緩存區,保證繪製命令得以執行 glFlush();
六、方向鍵控制正方形方塊移動
//main函數配置
//設置當前工作目錄——僅針對Mac OS gltSetWorkingDirectory(argv[0]); glutInit(&argc, (char **)argv); /*初始化雙緩衝視窗 GLUT_DOUBLE:雙緩衝視窗; GLUT_RGBA:RGBA顏色模式; GLUT_DEPTH:深度測試; GLUT_STENCIL:模版緩衝區 */ glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL); //設置視窗大小 glutInitWindowSize(800, 600); glutCreateWindow("MoveSquare"); //註冊重塑函數 glutReshapeFunc(changeSize); //註冊顯示函數 glutDisplayFunc(renderScene); glutSpecialFunc(specialKeys); //Open GL API可用和驅動程式初始化正常的容錯判斷 GLenum status = glewInit(); if (status != GLEW_OK) { printf("GLew Error : %s\n", glewGetErrorString(status)); return 1; } //設置渲染環境 moveSSetUpRC(); glutMainLoop();
//renderScene()函數控制渲染,specialKeys()控制移動,二者,每次按一下鍵盤中的方向鍵,就會被動態調用一次
void renderScene() { /*清楚緩存區 GL_COLOR_BUFFER_BIT:指示當前激活的用來進行顏色寫入的緩衝區 GL_DEPTH_BUFFER_BIT:指示深度緩存區 GL_STENCIL_BUFFER_BIT:指示模版緩存區 */ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT); //設置顏色 GLfloat vRed[] = {1.0,0.0, 0.0, 1.0}; //傳遞到存儲著色器併在屏幕上渲染圖形 shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed); //提交著色器 triangleBatch.Draw(); //後臺緩衝區渲染結束後提交給前臺 glutSwapBuffers(); }
void specialKeys(int key, int x, int y)//key由系統自動識別獲取 { /* 判斷:x值以正方形最左邊為基準;y值以正方形最上邊為基準; blockX、blockY值不能賦值於常量——因為vVerts四個點是動態變化的(SpecialKeys也會隨之被動態調用); */ GLfloat blockX = vVerts[0]; GLfloat blockY = vVerts[10]; GLfloat stepSize = 0.025; if (key == GLUT_KEY_UP) { blockY += stepSize; } if (key == GLUT_KEY_DOWN) { blockY -= stepSize; } if (key == GLUT_KEY_LEFT) { blockX -= stepSize; } if (key == GLUT_KEY_RIGHT) { blockX += stepSize; } //觸碰到視窗邊界處理 if (blockX < -1.0) { blockX = -1.0; } if (blockX > (1.0-blockSize*2)) { blockX = 1.0-blockSize*2; } if (blockY > 1.0) { blockY = 1.0; } if (blockY < -1.0+blockSize*2) { blockY = -1.0+blockSize*2; } //正方形四個頂點坐標動態賦值 vVerts[0] = blockX; vVerts[1] = blockY-blockSize*2; vVerts[3] = blockX+blockSize*2; vVerts[4] = blockY-blockSize*2; vVerts[6] = blockX+blockSize*2; vVerts[7] = blockY; vVerts[9] = blockX; vVerts[10] = blockY; triangleBatch.CopyVertexData3f(vVerts); glutPostRedisplay(); }
請問下:錄好的視頻demo運行效果如何上傳到博客中?不勝感激!