Mac端 Open GL初探

来源:https://www.cnblogs.com/lybSkill/archive/2018/11/07/9923589.html
-Advertisement-
Play Games

一、環境配置 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運行效果如何上傳到博客中?不勝感激!

 

github


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 歡迎大家前往 "騰訊雲+社區" ,獲取更多騰訊海量技術實踐乾貨哦~ 本文由 "騰訊雲資料庫 TencentDB" 發表於 "雲+社區專欄" 王甲坤,騰訊高級工程師、騰訊雲關係型 "資料庫MySQL" 負責人,擁有多年客戶端、資料庫研發經驗。在IOS客戶端、 "MySQL" 、 "PostgreSQL ...
  • 語句: 翻譯成中文就是: 刪除,“table1”中,id 不在此範圍的所有記錄。此範圍是,篩選出,以field1分組的,所有組別中id的最小的一個。 更直接點就是,以field1分組,選出分組中id最小的一條記錄,然後剩下的全部刪除。 理解不正確的話,請指點一二。 ...
  • http://putpan.com/fs/by4i9b7ebnbs3hbu6/ 需要IT編程經典書籍資源大合集百度網盤鏈接的加qq 2057904338,另本人願意有償帶小白學python,幫助你答疑解惑,幫助你解決問題,指導你找工作,帶你入行。相信我有人帶著你的話可以少走彎路,成功入行拿高薪。北京 ...
  • 判斷字元串是否為正整數,0開始的的數字不算。 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE FUNCTION [dbo].[svf_IsPositiveInteger] ( @string NVARCHAR(MAX) ) RETURN ...
  • 手機上的資源畢竟有限,為了獲取更豐富的信息,就得到遼闊的互聯網大海上衝浪。對於App自身,也要經常與伺服器交互,以便獲取最新的數據顯示到界面上。這個客戶端與服務端之間的信息交互,基本使用HTTP協議進行通信,即App訪問伺服器的HTTP介面來傳輸數據。HTTP介面調用在Java代碼中可不是一個輕鬆的 ...
  • import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics... ...
  • 歡迎大家前往 "騰訊雲+社區" ,獲取更多騰訊海量技術實踐乾貨哦~ 本文由 "brzhang" 發表於 "雲+社區專欄" 做APP開發的過程中,有很多時候,我們需要實現類似於下麵這種沉浸式的體驗。 沉浸式體驗 一開始接觸的時候,似乎大家都會覺這種體驗實現起來,會比較困難。難點在於: 1. 頭部的背景 ...
  • 使用UIButton的enabled或userInteractionEnabled 使用UIButton的enabled屬性, 在點擊後, 禁止UIButton的交互, 直到完成指定任務之後再將其enabled即可. [btn addTarget:self action:@selector(next ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...