openGL之紋理 :第二課

#include "glew.h"
#include "glfw3.h"
#include "SOIL2.h"//如何解析輸入的數據流 0,1,2 分三部分
GLchar * vertextSrc = " #version 330 core \n \layout (location = 0) in vec3 position; \layout (location = 1) in vec3 color; \layout (location = 2) in vec2 texcoord;\out vec3 outcolor; \out vec2 outtexcoord; \void main(){gl_Position = vec4(position, 1.0f);outcolor = color;outtexcoord = texcoord;}";// texture 是紋理接口 返回紋理顏色, texture(參數1=采樣器, 參數2=紋理坐標)
// sampler2D 紋理采樣器
GLchar * fragmentSrc = "#version 330 core \n \in vec3 outcolor;\in vec2 outtexcoord;\out vec4 color; \uniform sampler2D ourTexture;\void main(){ \color = texture(ourTexture, outtexcoord) *vec4(outcolor,1.0f) ; \}";
//int main()
{glfwInit();GLFWwindow* window = glfwCreateWindow(500,600,"Texture", NULL,NULL);glfwMakeContextCurrent(window);glewInit();GLfloat arrays[] = {0.5f,  0.5f, 0.0f,  1.0f, 0.0f, 0.0f,      1.0f, 1.0f,0.5f, -0.5f, 0.0f,  0.0f, 1.0f, 0.0f,	   1.0f, 0.0f,-0.5f, -0.5f, 0.0f,  0.0f, 0.0f, 1.0f,	   0.0f, 0.0f,-0.5f,  0.5f, 0.0f,  1.0f, 0.0f, 0.0f,	   0.0f, 1.0f};GLuint  earrays[] = {0,1,3,1,2,3};//創建數組緩沖對象GLuint VAO, VBO, EBO;glGenVertexArrays(1, &VAO);glGenBuffers(1, &VBO);glGenBuffers(1, &EBO);glBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER,VBO);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);//GPU 開辟開辟緩存存放數據glBufferData(GL_ARRAY_BUFFER, sizeof(arrays), arrays, GL_STATIC_DRAW);glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(earrays), earrays, GL_STATIC_DRAW);//如何解析數據到頂點著色器,  8 個數據作為一個步長glVertexAttribPointer(0, 3,GL_FLOAT,false, 8* sizeof(GLfloat),(GLvoid*)0); //第一個輸入變量的解析規則 layout(location=0)glVertexAttribPointer(1, 3, GL_FLOAT, false, 8 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat))); // layout(location = 1)glVertexAttribPointer(2, 2, GL_FLOAT, false, 8 * sizeof(GLfloat), (GLvoid*)(6 * sizeof(GLfloat))); // ...glEnableVertexAttribArray(0);glEnableVertexAttribArray(1);glEnableVertexAttribArray(2);//glDeleteBuffers(VBO);//glDeleteBuffers(EBO);glBindVertexArray(0);//創建著色器程序GLuint Vertexshader, fragmentShader, programShader;Vertexshader = glCreateShader(GL_VERTEX_SHADER);fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);programShader = glCreateProgram();GLint succeed;char info[512];glShaderSource(Vertexshader,1,&vertextSrc,(GLint*)0);glCompileShader(Vertexshader);glGetShaderiv(Vertexshader, GL_COMPILE_STATUS, &succeed);if (!succeed){glGetShaderInfoLog(Vertexshader, 512, NULL, info);}glShaderSource(fragmentShader, 1, &fragmentSrc, (GLint*)0);glCompileShader(fragmentShader);glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &succeed);if (!succeed){glGetShaderInfoLog(fragmentShader, 512, NULL, info);}glAttachShader(programShader,Vertexshader);glAttachShader(programShader, fragmentShader);glLinkProgram(programShader);glDeleteShader(Vertexshader);glDeleteShader(fragmentShader);//創建紋理對象GLuint texture;glGenTextures(1, &texture);glBindTexture(GL_TEXTURE_2D, texture);//綁定應用該紋理對象//設置該紋理的紋理環繞方式和紋理過濾方式glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);//x 軸紋理渲染方式,重復渲染glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT); // y軸紋理渲染方式//紋理過濾:紋理像素映射到紋理坐標上的過程中做的紋理像素處理, 定義一個點(點所在的像素顏色區域,返回顏色值的規則)// GL_NEAREST: 鄰近過濾 ,返回所在點的當前固定顏色值,整體看起來顏色分明,像素點一樣// GL_LINEAR: 線性過濾, 返回所在點的(單位面積內的綜合顏色值),整體看起來比較模糊,線性過度染色glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST);//縮小過濾方式glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR);int width, height;unsigned char* image = SOIL_load_image("E:/container.jpg", &width, &height, 0, SOIL_LOAD_RGB);//利用圖片和紋理對象生成圖片紋理glTexImage2D(GL_TEXTURE_2D,0, GL_RGB, width, height, 0,GL_RGB, GL_UNSIGNED_BYTE, image);//設置漸遠紋理glGenerateMipmap(GL_TEXTURE_2D);//銷毀圖片資源和取消綁定該紋理對象SOIL_free_image_data(image);glBindTexture(GL_TEXTURE_2D, 0);while (!glfwWindowShouldClose(window)){glfwPollEvents();glClearColor(1.0f, 0.0f, 1.0f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);glBindTexture(GL_TEXTURE_2D, texture);glUseProgram(programShader);glBindVertexArray(VAO);glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_INT,0);glBindVertexArray(0);glfwSwapBuffers(window);}glfwTerminate();return 0;
}

在這里插入圖片描述

注意點

1.檢驗著色器編譯有沒有通過,vec3轉vec4有沒有正確
2.創建EBO(元素緩存對象)時的綁定數據和加載數據的枚舉為 E_ELEMENT_ARRAY_BUFFER
3.使能頂點數組的指定屬性
glEnableVertexAttribArray(0);
使能第一個屬性:位置
glEnableVertexAttribArray(1);
使能第二個屬性:顏色
glEnableVertexAttribArray(2);
使能第三個屬性:紋理坐標

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

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

相關文章

【精選】??通道熱點加持的LW-ResNet:小麥病害智能診斷與防治系統

1.研究背景與意義 小麥是世界上最重要的糧食作物之一,但由于病害的侵襲,小麥產量和質量受到了嚴重的威脅。因此,開發一種高效準確的小麥病害識別分類防治系統對于保障糧食安全和農業可持續發展具有重要意義。 傳統的小麥病害識別分類方法主…

Feign

目錄 RestTemplate方式調用存在的問題: 定義和使用Feign客戶端 自定義Feign的配置 性能優化 Feign的最佳實踐 Feign的使用步驟: 1、引入依賴 2、添加EnableFeignClients注解 3、編寫FeignClient接口 4、使用FeignClient中定義的方法代替RestTemplate Feign的…

什么是遷移學習

1 遷移學習概述 遷移學習(Transfer Learning)是機器學習中的一種方法,它允許模型將從一個任務中學到的知識應用到另一個相關的任務中。這種方法在數據稀缺的情況下尤為有用,因為它減少了對大量標記數據的需求。遷移學習已成為深度…

Node使用Nvm安裝雙版本切換(node兩個版本同時用怎么辦?不同的項目Node版本要求不一樣怎么辦?)

先把node.js卸載 開始—>添加刪除程序—>node npm -v node -v //檢查是否還存在,卸載成功就行了NVM下載 github下載 百度網盤下載 打開安裝包以管理員身份安裝,要是記得這個路徑并且必須全是英文 使用nvm安裝兩個使用的node版本 cmd以管理員…

計算機組成原理2

1.浮點數 2.IEEE 754 3.存儲器的性能指標 4.存儲器的層次化結構 主存類似手機運行內存8g ,輔存類似手機內存128g.... 輔存必須先通過主存才能被cpu接收,就例如微信打開那個月亮小人界面兩三秒就是主存在讀取輔存的程序然后被cpu接收運行。 5.主存儲…

Greenplum的數據庫年齡檢查處理

概述 Greenplum是基于Postgresql數據庫的分布式數據庫,而PG數據庫在事務及多版本并發控制的實現方式上很特別,采用的是遞增事務id的方法,事務id大的事務,認為比較新,反之事務id小,認為比較舊。 事務id的上…

經典的回溯算法題leetcode組合問題整理及思路代碼詳解

目錄 組合問題 leetcode77題.組合 leetcode216題.組合總和III leetcode40題.組合總和II leetcode39題.組合總和 倘若各位不太清楚回溯算法可以去看我上一篇文章。 回溯算法詳解-CSDN博客 組合問題 一般組合和排列類的問題我們都會轉化成一個樹形問題,更便于…

26. 刪除有序數組中的重復項(remove-duplicates-from-sorted-array)

26. 刪除有序數組中的重復項(remove-duplicates-from-sorted-array) 給你一個 非嚴格遞增排列 的數組 nums ,請你** 原地** 刪除重復出現的元素,使每個元素 只出現一次 ,返回刪除后數組的新長度。元素的 相對順序 應該保持 一致 。然后返回 …

批量創建表空間數據文件(DM8:達夢數據庫)

DM8:達夢數據庫 - - 批量創建表空間數據文件 環境介紹1 批量創建表空間SQL2 達夢數據庫學習使用列表 環境介紹 在某些場景(分區表子表)需要批量創建表空間,給不同的表使用,以下代碼是批量創建表空間的SQL語句; 1 批量創建表空間SQL --創建 24個數據表空間,每個表空間有3個數…

強化學習小筆記 —— 如何選擇合適的更新步長

在強化學習中,動作價值函數的更新可以使用增量法,如下所示: Q k 1 k ∑ i 1 k r i 1 k ( r k ∑ i 1 k ? 1 r i ) 1 k ( r k ( k ? 1 ) Q k ? 1 ) 1 k ( r k k Q k ? 1 ? Q k ? 1 ) Q k ? 1 1 k [ r k ? Q k ? 1 ] \beg…

Linux寶塔面板搭建Discuz論壇, 并內網穿透實現公網訪問

Linux寶塔面板搭建Discuz論壇, 并內網穿透實現公網訪問 文章目錄 Linux寶塔面板搭建Discuz論壇, 并內網穿透實現公網訪問前言1.安裝基礎環境2.一鍵部署Discuz3.安裝cpolar工具4.配置域名訪問Discuz5.固定域名公網地址6.配置Discuz論壇 📷 江池…

低代碼平臺推薦:五大低代碼廠商誰的模式更“合適”

隨著數字化時代的到來,低代碼開發平臺作為提高數字生產力的工具正受到越來越多企業的關注,市面上的低代碼產品和廠商更是“亂花漸欲迷人眼”。 各家產品不僅功能各有不同,甚至商機都有區別的情況,如何做好產品選型已然成了采購企…

C語言——指針(一)

📝前言 這篇文章主要帶大家初步認識一下指針,供大家理解參考。 主要歸納與講解: 1,指針與指針變量 2,指針的基本使用(如何定義,初始化,引用) 🎬個人簡介&…

計算方法 期末總結

思維導圖 緒論 算法的性質: 有窮性、確切性、有輸入輸出、可行性 算法的描述方法: 自然語言、偽代碼、流程圖、N-S流程圖 算法設計思想: 化大為小的縮減技術:二分法化難為易的校正技術:開方法化粗為精的松弛技術&a…

無需公網IP,使用內網穿透實現公網訪問本地OpenWRT管理界面

文章目錄 1.openWRT安裝cpolar2.配置遠程訪問地址3.固定公網地址 簡單幾步實現在公網環境下遠程訪問openWRT web 管理界面,使用cpolar內網穿透創建安全隧道映射openWRT web 界面面板443端口,無需公網IP,無需設置路由器。 1.openWRT安裝cpola…

SpringBoot使用ObjectMapper之Long和BigDemical類型的屬性字符串處理,防止前端丟失數值精度

SpringBoot使用ObjectMapper之Long和BigDemical類型的屬性字符串處理,防止前端丟失數值精度! 方式一:注解 使用注解 JsonFormat(shape JsonFormat.Shape.STRING),如下: import com.fasterxml.jackson.annotation.JsonFormat; …

在arm 64 環境下使用halcon算法

背景: halcon,機器視覺領域神一樣得存在,在windows上,應用得特別多, 但是arm環境下使用得很少。那如何在arm下使用halcon呢。按照官方說明,arm下只提供了運行時環境,并且需要使用價值一萬多人民…

設計高手的秘密武器:5款讓平面作品更出彩的軟件

平面設計是一種迷人而多樣化的藝術形式,它結合了顏色、形狀、排版和創造力,通過圖像和文本傳達信息。市場上有各種各樣的平面設計軟件,選擇合適的設計軟件是成為優秀設計師的重要一步。為了降低軟件成本,大多數設計師會優先使用免…

編譯原理之LL(1)語法分析實驗(附完整C/C++代碼與測試)

一、實驗內容與要求 先從鍵盤讀入要分析的文法,由程序自動構造FIRST、FOLLOW 集以及SELECT集合,判斷是否為LL (1)文法。 分析文法為G[E]: (0)E→ TE’ (1)E’→ TE’ (2&#xff…

軟件開發王者搭配:80%低代碼+20%高代碼

數字化領域從來不缺新概念,前兩年市場大談云原生、技術中臺、業務中臺等概念,企業更多聚焦在業務與IT架構的升級。而這兩年,隨著低代碼、生成式AI的盛行,大家則開始挖掘數字化應用的低成本建設模式。 在過去,開發一套系…