(八)EBO和glDrawElements

EBO

EBO(Element Buffer Object):元素緩沖對象,用于存儲頂點繪制順序索引號的GPU顯存區域

	unsigned int indices[] = {0, 1, 2,2, 1, 3};//EBO創建和綁定GLuint ebo = 0;glGenBuffers(1, &ebo);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);//VAO創建和綁定GLuint vao = 0;glGenVertexArrays(1, &vao);glBindVertexArray(vao);//加入ebo到當前的vaoglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);

綁定vao之后,GL狀態機就認為后續操作針對的是當前這個vao,在當前vao狀態下綁定任何vbo或者ebo,都會被記錄到當前vao當中。

glDrawElements

#include <glad/glad.h>//glad必須在glfw頭文件之前包含
#include <GLFW/glfw3.h>
#include <iostream>void frameBufferSizeCallbakc(GLFWwindow* window, int width, int height)
{glViewport(0, 0, width, height);
}
void glfwKeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
}GLuint program = 0;
GLuint vao = 0;
void prepareVAO()
{//1 準備positionsfloat positions[] = {-0.5f, -0.5f, 0.0f,0.5f, -0.5f, 0.0f,0.0f,  0.5f, 0.0f,0.5f,  0.5f, 0.0f,};unsigned int indices[] = {0, 1, 2,2, 1, 3};//2 VBO創建GLuint vbo = 0;glGenBuffers(1, &vbo);glBindBuffer(GL_ARRAY_BUFFER, vbo);glBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW);//3 EBO創建GLuint ebo = 0;glGenBuffers(1, &ebo);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);//4 VAO創建vao = 0;glGenVertexArrays(1, &vao);glBindVertexArray(vao);//5 綁定vbo ebo 加入屬性描述信息//5.1 加入位置屬性描述信息glBindBuffer(GL_ARRAY_BUFFER, vbo);glEnableVertexAttribArray(0);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);//5.2 加入ebo到當前的vaoglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);glBindVertexArray(0);
}
void prepareShader() {//1 完成vs與fs的源代碼,并且裝入字符串const char* vertexShaderSource ="#version 330 core\n""layout (location = 0) in vec3 aPos;\n""void main()\n""{\n""   gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n""}\0";const char* fragmentShaderSource ="#version 330 core\n""out vec4 FragColor;\n""void main()\n""{\n""   FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n""}\n\0";//2 創建Shader程序(vs、fs)GLuint vertex, fragment;vertex = glCreateShader(GL_VERTEX_SHADER);fragment = glCreateShader(GL_FRAGMENT_SHADER);//3 為shader程序輸入shader代碼glShaderSource(vertex, 1, &vertexShaderSource, NULL);glShaderSource(fragment, 1, &fragmentShaderSource, NULL);int success = 0;char infoLog[1024];//4 執行shader代碼編譯 glCompileShader(vertex);//檢查vertex編譯結果glGetShaderiv(vertex, GL_COMPILE_STATUS, &success);if (!success) {glGetShaderInfoLog(vertex, 1024, NULL, infoLog);std::cout << "Error: SHADER COMPILE ERROR --VERTEX" << "\n" << infoLog << std::endl;}glCompileShader(fragment);//檢查fragment編譯結果glGetShaderiv(fragment, GL_COMPILE_STATUS, &success);if (!success) {glGetShaderInfoLog(fragment, 1024, NULL, infoLog);std::cout << "Error: SHADER COMPILE ERROR --FRAGMENT" << "\n" << infoLog << std::endl;}//5 創建一個Program殼子program = glCreateProgram();//6 將vs與fs編譯好的結果放到program這個殼子里glAttachShader(program, vertex);glAttachShader(program, fragment);//7 執行program的鏈接操作,形成最終可執行shader程序glLinkProgram(program);//檢查鏈接錯誤glGetProgramiv(program, GL_LINK_STATUS, &success);if (!success) {glGetProgramInfoLog(program, 1024, NULL, infoLog);std::cout << "Error: SHADER LINK ERROR " << "\n" << infoLog << std::endl;}//清理glDeleteShader(vertex);glDeleteShader(fragment);
}void render()
{//執行opengl畫布清理操作glClear(GL_COLOR_BUFFER_BIT);//1.綁定當前的programglUseProgram(program);//2 綁定當前的vaoglBindVertexArray(vao);//3 發出繪制指令//glDrawArrays(GL_TRIANGLE_STRIP, 0, 6);glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, (void*)(3 * sizeof(int)));
}
int main()
{//初始化glfw環境glfwInit();//設置opengl主版本號glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//設置opengl次版本號glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//設置opengl啟用核心模式glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//創建窗體對象GLFWwindow* window = glfwCreateWindow(800, 600, "lenarnOpenGL", nullptr, nullptr);//設置當前窗體對象為opengl的繪制舞臺glfwMakeContextCurrent(window);//窗體大小回調glfwSetFramebufferSizeCallback(window, frameBufferSizeCallbakc);//鍵盤相應回調glfwSetKeyCallback(window, glfwKeyCallback);//使用glad加載所有當前版本opengl的函數if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){std::cout << "初始化glad失敗" << std::endl;return -1;};//設置opengl視口大小和清理顏色glViewport(0, 0, 800, 600);glClearColor(0.2f, 0.3f, 0.3f, 1.0f);//著色器prepareShader();//vaoprepareVAO();//執行窗體循環while (!glfwWindowShouldClose(window)){//接受并分發窗體消息//檢查消息隊列是否有需要處理的鼠標、鍵盤等消息//如果有的話就將消息批量處理,清空隊列glfwPollEvents();//渲染操作render();//切換雙緩存glfwSwapBuffers(window);}//推出程序前做相關清理glfwTerminate();return 0;
}
glDrawElements(GLenum mode, GLsizei count, GLenum type, const void *indices);

mode:繪制模式GL_TRIANGLES,GL_LINES
count:繪制索引數組中的幾個點
type:索引的數據類型
indices:
如果使用了ebo,通常填寫0;
如果使用了ebo,其不填寫0,則表示索引內偏移
如果不使用ebo,可以直接傳入索引數組

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

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

相關文章

【MindSpore學習打卡】應用實踐-計算機視覺-ShuffleNet圖像分類:從理論到實踐

在當今的深度學習領域&#xff0c;卷積神經網絡&#xff08;CNN&#xff09;已經成為圖像分類任務的主流方法。然而&#xff0c;隨著網絡深度和復雜度的增加&#xff0c;計算資源的消耗也顯著增加&#xff0c;特別是在移動設備和嵌入式系統中&#xff0c;這種資源限制尤為突出。…

25計算機考研,這些學校雙非閉眼入,性價比超高!

計算機考研&#xff0c;好的雙非院校也很多&#xff01; 對于一些二本準備考研的同學來說&#xff0c;沒必要一直盯著985/211這些院校&#xff0c;競爭激烈不說&#xff0c;容易當陪跑&#xff0c;下面這些就是不錯的雙非院校&#xff1a; 燕山大學南京郵電大學南京信息工程大…

WPS-Word文檔表格分頁

一、問題描述 這種情況不好描述 就是像這種表格內容&#xff0c;但是會有離奇的分頁的情況。這種情況以前的錯誤解決辦法就是不斷地調整表格的內容以及間隔顯得很亂&#xff0c;于是今天去查了解決辦法&#xff0c;現在學會了記錄一下避免以后忘記了。 二、解決辦法 首先記…

《昇思25天學習打卡營第5天 | mindspore 網絡構建 Cell 常見用法》

1. 背景&#xff1a; 使用 mindspore 學習神經網絡&#xff0c;打卡第五天&#xff1b; 2. 訓練的內容&#xff1a; 使用 mindspore 的 nn.Cell 構建常見的網絡使用方法&#xff1b; 3. 常見的用法小節&#xff1a; 支持一系列常用的 nn 的操作 3.1 nn.Cell 網絡構建&…

【FFmpeg】關鍵結構體的初始化和釋放(AVFormatContext、AVIOContext等)

目錄 1.AVFormatContext1.1 初始化&#xff08;avformat_alloc_context&#xff09;1.2 釋放&#xff08;avformat_free_context&#xff09; 2.AVIOContext2.1 初始化&#xff08;avio_alloc_context&#xff09;2.2 釋放&#xff08;avio_context_free&#xff09; 3. AVStre…

8.SQL注入-基于insert,update利用案例

SQL注入-基于insert/update利用案例 sql語句正常插入表中的數據 insert into member(username,pw,sex,phonenum,address,email) values(xiaoqiang,1111,1,2,3,4); select * from member;例如插入小強數據&#xff0c;如圖所示&#xff1a; 采用or這個運算符&#xff0c;構造…

實測有效:Win11右鍵默認顯示更多

Win11最大的變化之一莫過于右鍵菜單發生了變化&#xff0c;最大的問題是什么&#xff0c;是右鍵菜單很多時候需要點兩次&#xff0c;實在是反人類 第一步 復制以下命令直接運行&#xff1a; reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905ba…

python_zabbix

zabbix官網地址&#xff1a;19. API19. APIhttps://www.zabbix.com/documentation/4.2/zh/manual/api 每個版本可以有些差異&#xff0c;選擇目前的版本在查看對于的api接口#token接口代碼 import requests apiurl "http://zabbix地址/api_jsonrpc.php" data {&quo…

web的學習和開發

這個使同步和異步的區別 今天主要就是學了一些前端&#xff0c;搞了一些前端的頁面&#xff0c;之后準備學一下后端。 我寫的這個項目使百度貼吧&#xff0c;還沒有寫er圖。 先看一下主界面是什么樣子的。 這個是主界面&#xff0c;將來后面的主要功能點基本上全部是放在這個上…

推動能源綠色低碳發展,風機巡檢進入國產超高清+AI時代

全球綠色低碳能源數字轉型發展正在進入一個重要窗口期。風電作為一種清潔能源&#xff0c;在碳中和過程中扮演重要角色&#xff0c;但風電場運維卻是一件十足的“苦差事”。 傳統的風機葉片人工巡檢方式主要依靠巡檢人員利用高倍望遠鏡檢查、高空繞行下降目測檢查(蜘蛛人)、葉…

STM32——Modbus協議

一、Modbus協議簡介&#xff1a; 1.modbus介紹&#xff1a; Modbus是一種串行通信協議&#xff0c;是Modicon公司&#xff08;現在的施耐德電氣 Schneider Electric&#xff09;于1979年為使用可編程邏輯控制器&#xff08;PLC&#xff09;通信而發表。Modbus已經成為工業領域…

PythonConda系列(親測有效):【解決方案】Collecting package metadata (current_repodata.json): failed

【解決方案】Collecting package metadata (current_repodata.json&#xff09;: failed 問題描述解決方案小結參考文獻 問題描述 在cmd下運行&#xff1a;conda install pylint -y&#xff0c;報錯如下&#xff1a; C:\Users\apr> conda install --name apr pylint -y Co…

PDF壓縮工具選哪個?6款免費PDF壓縮工具分享

PDF文件已經成為一種常見的文檔格式。然而&#xff0c;PDF文件的體積有時可能非常龐大&#xff0c;尤其是在包含大量圖像或復雜格式的情況下。選擇一個高效的PDF壓縮工具就顯得尤為重要。小編今天給大家整理了2024年6款市面上反響不錯的PDF壓縮文件工具。輕松幫助你找到最適合自…

漆包線行業生產管理革新:萬界星空科技MES系統解決方案

一、引言 在科技日新月異的今天&#xff0c;萬界星空科技憑借其在智能制造領域的深厚積累&#xff0c;為漆包線行業量身打造了一套先進的生產管理執行系統&#xff08;MES&#xff09;解決方案。隨著市場競爭的加劇&#xff0c;漆包線作為電氣設備的核心材料&#xff0c;其生產…

React+TS前臺項目實戰(二十四)-- 繪制組件Qrcode封裝

文章目錄 前言Qrcode組件1. 功能分析2. 代碼詳細注釋3. 使用方式4. 效果展示(pc端 / 移動端) 總結 前言 今天要封裝的Qrcode 組件&#xff0c;是通過傳入的信息&#xff0c;繪制在二維碼上&#xff0c;可用于很多場景&#xff0c;如區塊鏈項目中的區塊顯示交易地址時就可以用到…

無人值守停車場管理系統具備哪些功能?無人值守收費停車場系統多少錢

隨著城市化進程的加快&#xff0c;停車難已成為制約城市發展的一個突出問題。在傳統停車場管理中&#xff0c;人工收費、車輛登記等環節不僅效率低下&#xff0c;而且容易出錯。無人值守停車系統的出現&#xff0c;無人值守停車場系統以其高效、智能的特點&#xff0c;通過集成…

Meta 3D Gen:文生 3D 模型

是由 Meta 公布的一個利用 Meta AssetGen&#xff08;模型生成&#xff09;和 TextureGen&#xff08;貼圖材質生成&#xff09;的組合 AI 系統&#xff0c;可以在分分鐘內生成高質量 3D 模型和高分辨率貼圖紋理。 視頻演示的效果非常好&#xff0c;目前只有論文&#xff0c;期…

telegram mini app和game實現登錄功能

接上一篇文章&#xff0c;我們在創建好telegram機器人后&#xff0c;開始開發小游戲或者mini App&#xff0c;那就避免不了登錄功能。 公開鏈接 bot設置教程:https://lengmo714.top/6e79860b.html 參考教程參考教程,telegram已經給我們提供非常多的api&#xff0c;我們在獲取用…

package.json配置詳解

package.json文件 執行 npm init 命令&#xff0c;會在當前目錄生成一個 package.json 文件 這個文檔是你需要知道的關于你的 package.json 文件中需要什么的所有信息。它必須是實際的 JSON&#xff0c;而不僅僅是一個 JavaScript 對象文字。 //package.json {//如果你打算發…

使用vue動態給同一個a標簽添加內容 并給a標簽設置hover,懸浮文字變色,結果鼠標懸浮有的字上面不變色

如果Vue的虛擬DOM更新機制導致樣式更新不及時&#xff0c;你可以嘗試以下幾種方法來解決這個問題&#xff1a; 確保使用響應式數據&#xff1a; 確保你使用的數據是響應式的&#xff0c;并且任何對這些數據的更改都會觸發視圖的更新。在Vue中&#xff0c;你應該使用data對象中的…