GPUImage源碼解讀之GLProgram

来源:https://www.cnblogs.com/tmacforever/archive/2018/05/31/9116626.html
-Advertisement-
Play Games

簡述 GLProgram是GPUImage中代表openGL ES 中的program,具有glprogram功能。其實是作者對OpenGL ES program的面向對象封裝 初始化 program shader c語言編譯流程:預編譯、編譯、彙編、鏈接 glsl的編譯過程類似c語言,主要有glC ...


簡述

GLProgram是GPUImage中代表openGL ES 中的program,具有glprogram功能。其實是作者對OpenGL ES program的面向對象封裝

初始化

- (id)initWithVertexShaderString:(NSString *)vShaderString 
            fragmentShaderString:(NSString *)fShaderString;
- (id)initWithVertexShaderString:(NSString *)vShaderString 
          fragmentShaderFilename:(NSString *)fShaderFilename;
- (id)initWithVertexShaderFilename:(NSString *)vShaderFilename 
            fragmentShaderFilename:(NSString *)fShaderFilename;

program

program = glCreateProgram();

shader

c語言編譯流程:預編譯、編譯、彙編、鏈接

glsl的編譯過程類似c語言,主要有glCompileShader、glAttachShader、glLinkProgram三步

創建shader

分別根據兩個Shader String來創建兩個Shader。但是要註意區別的是,兩個Shader的type對應的GLEnum是不一樣的。
創建並且compile shader的過程包括幾步:

  • 創建OpenGL ES Shader:VertexShader的type是GL_VERTEX_SHADER;而FragmentShader是GL_FRAGMENT_SHADER。
shader = glCreateShader(type);
  • 載入Source String:
source = (GLchar *)[shaderString UTF8String];
glShaderSource(*shader, 1, &source, NULL);
  • 編譯Shader:
glCompileShader(*shader);
  • 檢查Shader的狀態;如果創建失敗,則獲取log:
glGetShaderiv(*shader, GL_COMPILE_STATUS, &status);
if (status != GL_TRUE) {
        GLint logLength;
        glGetShaderiv(*shader, GL_INFO_LOG_LENGTH, &logLength);
        if (logLength > 0)
        {
            GLchar *log = (GLchar *)malloc(logLength);
            glGetShaderInfoLog(*shader, logLength, &logLength, log);
            if (shader == &vertShader)
            {
                self.vertexShaderLog = [NSString stringWithFormat:@"%s", log];
            }
            else
            {
                self.fragmentShaderLog = [NSString stringWithFormat:@"%s", log];
            }

            free(log);
        }
}
  • 將生成的兩個Shader Attach到Program上:
glAttachShader(program, vertShader);
        glAttachShader(program, fragShader);
  • link program並且檢查program的狀態,如果link失敗,則獲取log;如果link成功,則表示GLProgram的初始化完畢:
glLinkProgram(program);
    
    glGetProgramiv(program, GL_LINK_STATUS, &status);
    if (status == GL_FALSE)
        return NO;
    
    if (vertShader)
    {
        glDeleteShader(vertShader);
        vertShader = 0;
    }
    if (fragShader)
    {
        glDeleteShader(fragShader);
        fragShader = 0;
    }
    
    self.initialized = YES;
  • use
glUseProgram(program);

Attribute的管理

簡介

attribute變數是只能在vertex shader中使用的變數。它不能在fragment shader中聲明attribute變數,也不能被fragment shader中使用)

在application中,一般用函數glBindAttribLocation()來綁定每個attribute變數的位置,然後用函數glVertexAttribPointer()為每個attribute變數賦值。

在GPUImage中,作者通過一個attributes數組來管理attribute變數。

- (void)addAttribute:(NSString *)attributeName
{
    if (![attributes containsObject:attributeName])
    {
        [attributes addObject:attributeName];
        glBindAttribLocation(program, 
                             (GLuint)[attributes indexOfObject:attributeName],
                             [attributeName UTF8String]);
    }
}
// END:addattribute
// START:indexmethods
- (GLuint)attributeIndex:(NSString *)attributeName
{
    return (GLuint)[attributes indexOfObject:attributeName];
}

如上述函數所示,每當加入一個attribute時,會先判斷在數組中有沒有這個變數,如果沒有的話,就加到數組中,並且綁定到shader中。變數獲取的位置也就是在數組中的位置

uniform的管理

簡介

uniform變數 外部程式傳遞給shader的變數.
函數glUniform**()函數賦值的.shader 中是只讀變數,不能被 shader 修改.

在GPUImage中,作者同樣通過一個uniforms數組來管理attribute變數。(然而並沒有用到

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

-Advertisement-
Play Games
更多相關文章
  • 現在很少用SQL 寫東西,但有時真用起來半天想不起來,看來還是有必要記錄一下。。。 新建表: create table [表名] ( [自動編號欄位] int IDENTITY (1,1) PRIMARY KEY , [欄位1] nVarChar(50) default \'預設值\' null , ...
  • 常用GHOST模板 GHOST常用參數: GHOST建議: GHOST所有參數: Usage of gh-ost: -allow-master-master 當運行MM雙主模式時需要顯示設置。 -allow-nullable-unique-key 設置是否運行唯一鍵列中使用NULL值,使用ghost ...
  • select sid,event,p1raw from v$session_wait where event like 'library cache pin%';select sql_text from v$sqlarea where hash_value=(select sql_hash_valu ...
  • 安裝Oracle時總是會報程式異常終止,摸不著頭腦,作為初學者一下就亂了分寸 工具/原料 Oracle軟體包 win764位 方法/步驟 右擊Oracle安裝圖標setup.exe,選擇屬性 選擇相容性,將畫圈的地方勾選上 3 最後運行setup.exe,問題解決ok! 工具/原料 Oracle軟體 ...
  • 複製路徑 找到SqlStudio.bin 文件刪除即可 SQL Server 2016 版本: SQL Server 2014 版本: SQL Server 2012 版本: SQL Server 2008 版本: SQL Server 2005 版本,刪除mru.dat 文件: ...
  • 長期更新IT編程視頻教程,資料收集整理不易,需要一點辛苦費 有意者加QQ:2773400,非誠勿擾! 長期更新IT編程視頻教程,資料收集整理不易,需要一點辛苦費 有意者加QQ:2773400,非誠勿擾! ...
  • 1、首先看一下最終效果的截圖,看看是不是你想要的,這個年代大家都很忙,開門見山很重要! 簡要說下,點擊不同按鈕可以實現通過不同的方式發送OkHttp請求,並返回數據,這裡請求的是網頁,所以返回的都是些網頁的代碼。 2、下麵給出代碼,代碼的實現步驟要點已經在代碼行中加了註釋,不過多贅述。 MainAc ...
  • android studio更新後創建新項目時出現以下錯誤 可以用Build->Rebuild Project解決,但這個方法只是臨時的,重新打開項目還是會報錯 所以用另一種方法: 在app下的build.gradle文件中的dependences {}中添加如下代碼: 參考自https://blo ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...