在OpenGL ES中將值傳入shader的方法總結

在OpenGL ES中,將值傳入Shader的方式主要有以下幾種:

1. Uniform變量

  • 用途:用于傳遞在繪制過程中不變的常量數據,如變換矩陣、顏色等。
  • 步驟
    1. 在Shader中聲明Uniform變量:
      uniform mat4 uMVPMatrix; // 例如一個模型視圖投影矩陣
      uniform vec4 uColor;     // 例如一個顏色值
      
    2. 在C/C++代碼中獲取Uniform變量的位置:
      GLint uMVPMatrixLocation = glGetUniformLocation(program, "uMVPMatrix");
      GLint uColorLocation = glGetUniformLocation(program, "uColor");
      
    3. 使用glUniform*系列函數將數據傳入Shader:
      glUniformMatrix4fv(uMVPMatrixLocation, 1, GL_FALSE, mvpMatrix);
      glUniform4f(uColorLocation, r, g, b, a);
      

2. Attribute變量

  • 用途:用于傳遞每個頂點不同的數據,如頂點位置、法線、紋理坐標等。
  • 步驟
    1. 在Shader中聲明Attribute變量:
      attribute vec4 aPosition;  // 頂點位置
      attribute vec2 aTexCoord; // 紋理坐標
      
    2. 在C/C++代碼中獲取Attribute變量的位置:
      GLint aPositionLocation = glGetAttribLocation(program, "aPosition");
      GLint aTexCoordLocation = glGetAttribLocation(program, "aTexCoord");
      
    3. 使用glVertexAttribPointer指定數據格式和位置:
      glVertexAttribPointer(aPositionLocation, 3, GL_FLOAT, GL_FALSE, stride, vertexData);
      glVertexAttribPointer(aTexCoordLocation, 2, GL_FLOAT, GL_FALSE, stride, texCoordData);
      
    4. 啟用Attribute變量:
      glEnableVertexAttribArray(aPositionLocation);
      glEnableVertexAttribArray(aTexCoordLocation);
      

3. Texture(紋理)

  • 用途:用于傳遞紋理數據,通常用于貼圖。
  • 步驟
    1. 在Shader中聲明Sampler變量:
      uniform sampler2D uTexture; // 2D紋理
      
    2. 在C/C++代碼中綁定紋理并傳入Shader:
      glActiveTexture(GL_TEXTURE0); // 激活紋理單元0
      glBindTexture(GL_TEXTURE_2D, textureId); // 綁定紋理
      GLint uTextureLocation = glGetUniformLocation(program, "uTexture");
      glUniform1i(uTextureLocation, 0); // 將紋理單元0傳入Shader
      

4. Varying變量

  • 用途:用于在Vertex Shader和Fragment Shader之間傳遞插值數據,如顏色、紋理坐標等。
  • 步驟
    1. 在Vertex Shader中聲明Varying變量并賦值:
      varying vec2 vTexCoord;
      void main() {vTexCoord = aTexCoord; // 從Attribute變量傳入gl_Position = uMVPMatrix * aPosition;
      }
      
    2. 在Fragment Shader中聲明相同的Varying變量并使用:
      varying vec2 vTexCoord;
      void main() {gl_FragColor = texture2D(uTexture, vTexCoord); // 使用插值后的紋理坐標
      }
      

5. Shader Storage Buffer Object (SSBO)

  • 用途:用于傳遞大量數據,通常用于計算Shader或復雜的數據結構。
  • 步驟
    1. 在Shader中聲明SSBO:
      layout(std430, binding = 0) buffer MyBuffer {vec4 data[];
      };
      
    2. 在C/C++代碼中創建并綁定SSBO:
      GLuint ssbo;
      glGenBuffers(1, &ssbo);
      glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
      glBufferData(GL_SHADER_STORAGE_BUFFER, size, data, GL_DYNAMIC_DRAW);
      glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, ssbo);
      

6. Uniform Buffer Object (UBO)

  • 用途:用于在多個Shader之間共享Uniform數據。
  • 步驟
    1. 在Shader中聲明UBO:
      layout(std140) uniform MyUBO {mat4 uMVPMatrix;vec4 uColor;
      };
      
    2. 在C/C++代碼中創建并綁定UBO:
      GLuint ubo;
      glGenBuffers(1, &ubo);
      glBindBuffer(GL_UNIFORM_BUFFER, ubo);
      glBufferData(GL_UNIFORM_BUFFER, size, data, GL_STATIC_DRAW);
      glBindBufferBase(GL_UNIFORM_BUFFER, 0, ubo);
      

總結

  • Uniform:用于傳遞常量數據。
  • Attribute:用于傳遞頂點數據。
  • Texture:用于傳遞紋理數據。
  • Varying:用于在Vertex和Fragment Shader之間傳遞插值數據。
  • SSBO:用于傳遞大量數據。
  • UBO:用于在多個Shader之間共享Uniform數據。

根據具體需求選擇合適的方式將數據傳入Shader。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/74159.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/74159.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/74159.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

華為總部-華為東莞松山湖基地參觀游學攻略

你有聽說過全球科技巨頭-華為嗎?今天帶你深入了解這一世界標桿工廠的秘密基地。跟隨華研標桿游學服務商一窺華為的強大實力。 在東莞松山湖,這里不僅僅是華為的終端總部,更是研發、銷售和增值業務的核心區域。我們一行人抵達后,立…

Linux小知識

1. /etc目錄 我們在配置文件中一直會調用 /etc目錄 cd /etc/xxxx.conf etc的全稱是editable configuration(其中一種說法)意為可編輯的配置;此目錄主要用來存放系統的配置文件和初始化文件的;像網絡配置 用戶信息 各種服務的配置…

晶鑫股份邁向敏捷BI之路,永洪科技助力啟程

數據驅動的時代,每一次技術的創新和突破都在為企業的發展注入新的動力。而敏捷性也不再是選擇,是企業生存與發展的必要條件。作為連續5年獲得中國敏捷BI第一名的永洪科技,通過不斷地在數據技術領域深耕細作,再次迎來了行業內的關注…

基于CAMEL 的Workforce 實現多智能體協同工作系統

文章目錄 一、workforce 簡介1.架構設計2.通信機制 二、workforce 工作流程圖示例1.用戶角色2.工作流程 三、workforce 中重要函數說明1.__init__函數2.add_single_agent_worker 函數3.add_role_playing_worker 函數4.add_workforce 函數 四、基于workforce實現多智能體協調&am…

每日一題力扣2974.最小數字游戲c++

2974. 最小數字游戲 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> numberGame(vector<int>& nums) {vector<int> arr(nums.size());sort(nums.begin(),nums.end());for(size_t i0;i<nums.size();i2){arr[i]nums[i1]…

對接馬來西亞、印度、韓國、越南等全球金融數據示例

Python對接StockTV全球金融數據API的封裝實現及使用教程&#xff1a; import requests import websockets import asyncio from typing import Dict, List, Optional, Union from datetime import datetimeclass StockTVClient:"""StockTV全球金融數據API客戶端…

Adobe After Effects 操作

Adobe After Effects &#xff08;AE&#xff09;可以實現將多個元素進行合成&#xff0c;實現特殊效果。AE的項目文件是aep&#xff0c;可以將素材、層、效果等一切信息&#xff0c;保存在這個項目文件中。 AE的原理&#xff0c;和PS的原理非常類似。 操作界面 操作界面如…

【React】基于自定義Hook提取公共邏輯

目錄 自定義Hook自定義Hook 1自定義Hook 2使用 注意事項 自定義Hook 作用&#xff1a;提取封裝一些公共的處理邏輯 玩法&#xff1a;創建一個函數&#xff0c;名字需要是 useXxx &#xff0c;后期就可以在組件中調用這個方法&#xff01; 自定義Hook 1 頁面加載的時候修改瀏…

AUTOSAR與arxml的文檔解析

如下是文檔腦圖 一、文檔概述 該文檔是 AUTOSAR 經典平臺的應用接口用戶指南&#xff0c;主要解釋 **Al Table&#xff08;應用接口表&#xff09;** 的結構、方法論及相關技術細節&#xff0c;幫助開發者理解如何通過標準化接口實現軟件組件的互操作性。 關鍵內容 目的&#…

油候插件、idea、VsCode插件推薦(自用)

開發軟件&#xff1a; 之前的文章&#xff1a; 開發必裝最實用工具軟件與網站 推薦一下我使用的開發工具 目前在用的 油候插件 AC-baidu-重定向優化百度搜狗谷歌必應搜索_favicon_雙列 讓查詢變成多列&#xff0c;而且可以流式翻頁 Github 增強 - 高速下載 github下載 TimerHo…

阿里云平臺服務器操作以及發布靜態項目

目錄&#xff1a; 1、云服務器介紹2、云服務器界面3、發布靜態項目1、啟動nginx2、ngixn訪問3、外網訪問測試4、拷貝靜態資源到nginx目錄下并重啟nginx 1、云服務器介紹 2、云服務器界面 實例詳情&#xff1a;里面主要顯示云服務的內外網地址以及一些啟動/停止的操作。監控&…

Spring Cache 實戰指南

redis中常見的問題 前言 在本文中&#xff0c;我們將探討 Redis 在緩存中的應用&#xff0c;并解決一些常見的緩存問題。為了簡化理解&#xff0c;本文中的一些配置是直接寫死的&#xff0c;實際項目中建議將這些配置寫入配置文件&#xff0c;并通過配置文件讀取。 一、為什…

區塊鏈開發技術公司:引領數字經濟的創新力量

在數字化浪潮席卷全球的今天&#xff0c;區塊鏈技術作為新興技術的代表&#xff0c;正以其獨特的去中心化、不可篡改和透明性等特點&#xff0c;深刻改變著各行各業的發展格局。區塊鏈開發技術公司&#xff0c;作為這一領域的先鋒和推動者&#xff0c;正不斷研發創新&#xff0…

EJS緩存解決多頁面相同閃動問題

基于 EJS 的模板引擎特性及其緩存機制&#xff0c;以下是關于緩存相同模塊的詳細解答&#xff1a; 一、EJS 緩存機制的核心能力 模板編譯緩存 EJS 默認會將編譯后的模板函數緩存在內存中&#xff0c;當相同模板文件被多次渲染時&#xff0c;會直接復用已編譯的模板函數&#x…

多條件排序(C# and Lua)

C# 升序排序 OrderBy 按升序對序列的元素進行排序 ThenBy 按升序對序列中的元素執行后續排序 降序排序 OrderByDescending 按降序對序列的元素排序 ThenByDescending 按降序對序列中的元素執行后續排序 public class Fruit {public int id;public string name;publi…

React19源碼系列之Hooks(useId)

useId的介紹 https://zh-hans.react.dev/reference/react/useId useId 是 React 18 引入的一個新 Hook&#xff0c;主要用于生成全局唯一的 ID。在開發中&#xff0c;我們經常需要為元素&#xff08;如表單元素、模態框等&#xff09;生成唯一 ID&#xff0c;以便在 JavaScri…

經典面試題:C/C++中static關鍵字的三大核心作用與實戰應用

一、修飾局部變量&#xff1a;改變生命周期&#xff0c;保留跨調用狀態 核心作用&#xff1a; ?延長生命周期&#xff1a;將局部變量從棧區移至靜態存儲區&#xff08;數據段或BSS段&#xff09;&#xff0c;生命周期與程序一致?保留狀態&#xff1a;變量在函數多次調用間保…

Redisson 分布式鎖原理

加鎖原理 # 如果鎖不存在 if (redis.call(exists, KEYS[1]) 0) then# hash結構,鎖名稱為key,線程唯一標識為itemKey&#xff0c;itemValue為一個計數器。支持相同客戶端線程可重入,每次加鎖計數器1.redis.call(hincrby, KEYS[1], ARGV[2], 1);# 設置過期時間redis.call(pexpi…

【數據結構】棧與隊列:基礎 + 競賽高頻算法實操(含代碼實現)

什么是棧&#xff1f;什么是隊列&#xff1f; 什么是先進后出&#xff1f;什么是先進先出&#xff1f; 了解基礎之后&#xff0c;又如何用來寫算法題&#xff1f; 帶著這些疑問&#xff0c;讓我帶領你&#xff0c;走進棧與隊列的世界 棧與隊列 棧&#xff1a; 1、棧的基本…

單元化架構在字節跳動的落地實踐

資料來源&#xff1a;火山引擎-開發者社區 什么是單元化 單元化的核心理念是將業務按照某種維度劃分成一個個單元&#xff0c; 理想情況下每個單元內部都是完成所有業務操作的自包含集合&#xff0c;能獨立處理業務流程&#xff0c;各個單元均有其中一部分數據&#xff0c;所有…