OpenGL ES天空盒子效果

来源:https://www.cnblogs.com/lybSkill/archive/2018/12/20/10150777.html
-Advertisement-
Play Games

一、理解 利用GLKBaseEffect,自定義頂點著色器和片元著色器,結合天空盒子,展示效果 二、技術代碼 CCSkyBoxEffect:天空盒子效果類; CCSkyboxShader.vsh:頂點著色器; CCSkyboxShader.fsh:片元著色器; //立方體場景貼圖紋理處理及頂點數據處 ...


一、理解

利用GLKBaseEffect,自定義頂點著色器和片元著色器,結合天空盒子,展示效果

二、技術代碼

CCSkyBoxEffect:天空盒子效果類;

CCSkyboxShader.vsh:頂點著色器;

CCSkyboxShader.fsh:片元著色器;

 

//立方體場景貼圖紋理處理及頂點數據處理

- (id)init
{
    self = [super init];
    if (self) {
        _textureCubeMap = [[GLKEffectPropertyTexture alloc] init];
        //是否使用原始紋理
        _textureCubeMap.enabled = YES;
        //採樣紋理的opengl名稱
        _textureCubeMap.name = 0;
        //設置紋理類型:立方體貼圖
        _textureCubeMap.target = GLKTextureTargetCubeMap;
        /*紋理用於計算其輸出片段顏色的模式
         GLKTextureEnvModeReplace, 輸出顏色由從紋理獲取的顏色.忽略輸入的顏色
         GLKTextureEnvModeModulate, 輸出顏色是通過將紋理顏色與輸入顏色來計算所得
         GLKTextureEnvModeDecal,輸出顏色是通過使用紋理的alpha組件來混合紋理顏色和輸入顏色來計算的。
         */
        _textureCubeMap.envMode = GLKTextureEnvModeReplace;
        
        _transform = [[GLKEffectPropertyTransform alloc] init];
        self.center = GLKVector3Make(0, 0, 0);
        self.xSize = 1.0;
        self.ySize = 1.0;
        self.zSize = 1.0;
        
        //立方體的8個頂點
        const float vertices[CCSkyboxNumCoords] = {
            -0.5, -0.5,  0.5,
            0.5, -0.5,  0.5,
            -0.5,  0.5,  0.5,
            0.5,  0.5,  0.5,
            -0.5, -0.5, -0.5,
            0.5, -0.5, -0.5,
            -0.5,  0.5, -0.5,
            0.5,  0.5, -0.5
        };
        //創建緩存對象,並返回標誌符
        glGenBuffers(1, &vertexBufferID);
        //綁定緩存對象到指定緩存區:頂點
        glBindBuffer(GL_ARRAY_BUFFER, vertexBufferID);
        //將數據拷貝到緩存對象中
        glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
        
        //繪製立方體的三角形帶索引
        const GLubyte indices[CCSkyboxNumVertexIndices] = {
            1, 2, 3, 7, 1, 5, 4, 7, 6, 2, 4, 0, 1, 2
        };
        //開闢索引緩存並複製索引數據到緩存區
        glGenBuffers(1, &indexBufferID);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferID);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
    }
    return self;
}

 

//坐標實時調整

- (void)setMatrixs
{
    const GLfloat aspectRatio = (GLfloat)(self.view.bounds.size.width)/(GLfloat)(self.view.bounds.size.height);
    
    self.baseEffect.transform.projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(85.0), aspectRatio, 0.1, 20.0);
    
    //獲取世界坐標繫到矩陣中
    self.baseEffect.transform.modelviewMatrix = GLKMatrix4MakeLookAt(self.eyePosition.x, self.eyePosition.y, self.eyePosition.z, self.lookAtPosition.x, self.lookAtPosition.y, self.lookAtPosition.z, self.upVector.x, self.upVector.y, self.upVector.z);
    
    //增加飛機旋轉角度
    self.angle += 0.01;
    //調整腦袋位置
    self.eyePosition = GLKVector3Make(-5.0*sinf(self.angle), -5.0, -5.0*cosf(self.angle));
    //調整物體位置
    self.lookAtPosition = GLKVector3Make(0.0, 1.5+-5.0*sinf(0.3*self.angle), 0.0);
}

 

三、效果圖

 

 

GitHub


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

-Advertisement-
Play Games
更多相關文章
  • 本文由雲+社區發表 本文作者:孫旭,騰訊資料庫開發工程師,9年資料庫內核開發經驗;熟悉資料庫查詢處理,併發控制,日誌以及存儲系統;熟悉PostgreSQL(Greenplum,PGXC等)、Teradata等資料庫內核實現機制。 CynosDB 是騰訊資料庫研發團隊推出的自研資料庫,有Postgre ...
  • 關於oracle database link,使用database link相關的查詢語句是否會開啟事務呢?我們知道,在資料庫中一個簡單的SELECT查詢語句不會產生事務(select for update會產生事務)。如下測試所示: 我們首先準備測試環境,創建了一個database link: L... ...
  • http://www.cnblogs.com/yijiaming/p/9684601.html 方法一: 1、需要安裝pymssql pip install pymssql 2、使用方法: 方法二: 1、安裝必要的組件: pip install django-sqlserver django-pyt ...
  • 公眾號:SAP Technical 本文作者:matinal 原文出處:http://www.cnblogs.com/SAPmatinal/ 原文鏈接:【HANA系列】SAP HANA XS使用Data Services查詢CDS實體【一】 前言部分 使用SAP HANA XS數據服務(XSDS)庫 ...
  • 今天不瘦給大家分享一下redis第二個基本數據類型:列表。如果大家瞭解基本數據結構,相信大家對列表不會陌生,比如在C語言中我們可以使用數組實現一個列表,也可以使用鏈表實現一個列表(列錶鏈表傻傻分不清楚,列表是一種抽象數據類型,鏈表為一種實現方式)。 言歸正傳,那redis是怎麼實現列表的呢?答案是: ...
  • 本文簡述在Android開發中Intent的常見應用,僅供學習分享使用。 ...
  • 介紹 幾乎在所有平臺上都有很多進程運行背景,它們被稱為服務。可能在Android平臺中有一些服務可以執行長時間運行的操作,這些操作在處理時不需要用戶交互。 在本文中,藉助預定義的Android警報服務,我們將創建一個應用程式,在所需的時間間隔內將電話模式更改為振動模式。除此之外,我們將編寫自己的Se ...
  • 一、獲取UiDevice設備信息 二、獲取Bundle的相關信息 NSLocal獲取本地化數據: ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...