最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

在文件里寫著色器代碼

2023-08-19 19:16 作者:西村啪啪二  | 我要投稿


我們開始著手寫著色器的代碼,首先定義一個創(chuàng)建著色器的函數(shù),把它標記為靜態(tài),因為我們不希望它滲入到別的C++文件里,在這個函數(shù)里寫下我們要給OpenGL提供的源代碼,這個函數(shù)需要的參數(shù)就是我們要寫的著色器,我們需要把著色器以字符串的模式寫好然后傳遞進來。

這里定義一個CompileShader()函數(shù)將字符串形式的著色器代碼進行編譯,并對錯誤進行處理。

通過使用glAttachShader將著色器附加到程序,使用glCompileShader編譯著色器,以及使用glLinkProgram鏈接程序,在程序中創(chuàng)建一個或多個可執(zhí)行文件。當調用glUseProgram時,這些可執(zhí)行文件成為當前狀態(tài)的一部分。最后可以通過調用glDeleteProgram來刪除程序。當程序不再是任何上下文的當前呈現(xiàn)狀態(tài)的一部分時,與程序相關聯(lián)的內存將被刪除。

glCreateProgram

我們一般把著色器附加到這個程序上。它還提供了一種方法來檢查將用于創(chuàng)建程序的著色器的兼容性(例如,檢查頂點著色器和片段著色器之間的兼容性),當著色器不再需要作為程序的一部分時,可以分離著色器。

和緩沖區(qū)和紋理對象一樣,程序的命名空間可以在一組上下文中共享,只要上下文的服務器端共享相同的地址空間即可。如果程序的命名空間是跨上下文共享的,則任何附加的對象以及與這些附加的對象相關聯(lián)的數(shù)據(jù)也會共享。?

當從不同的執(zhí)行線程訪問對象時,應用程序負責提供跨API調用的同步。

如果創(chuàng)建程序對象時出錯,該函數(shù)返回0。

glCreateShader

shader對象用于維護定義著色器的源代碼字符串。

像緩沖區(qū)和紋理對象一樣,著色器對象的名稱空間可以跨一組上下文共享,只要上下文的服務器端共享相同的地址空間。如果名稱空間跨上下文共享,則任何附加的對象以及與這些附加的對象相關聯(lián)的數(shù)據(jù)也會共享。?

當從不同的執(zhí)行線程訪問對象時,應用程序負責提供跨API調用的同步。

GL_COMPUTE_SHADER僅在GL版本為4.3或更高版本時可用。

如果創(chuàng)建shader對象時出錯,此函數(shù)返回0。

如果shaderType不是可接受的值,則生成GL_INVALID_ENUM。

glShaderSource

先前存儲在著色器對象中的源代碼被完全替換。數(shù)組中的字符串數(shù)量由count指定。如果length為NULL,則假定每個字符串都以NULL結尾。如果length是NULL以外的值,則它指向一個數(shù)組,該數(shù)組包含string的每個對應元素的字符串長度。length數(shù)組中的每個元素可以包含相應字符串的長度(空字符不作為字符串長度的一部分計算)或一個小于0的值,以指示字符串以空字符結束。此時不會掃描或分析源代碼字符串;它們只是被復制到指定的著色器對象中。

當調用glShaderSource時,OpenGL復制著色器源代碼字符串,因此應用程序可以在函數(shù)返回后立即釋放其源代碼字符串副本。

glCompileShader

該函數(shù)將編譯我們傳遞給他的字符串形式的著色器源代碼,已存儲在Shader指定的shader對象中的源代碼字符串。 編譯狀態(tài)將存儲為著色器對象狀態(tài)的一部分。如果著色器編譯無誤并可供使用,該值將設置為GL_TRUE,否則設置為GL_FALSE??梢酝ㄟ^使用參數(shù)Shader和GL_COMPILE_STATUS調用glGetShader來查詢。 由于OpenGL著色語言規(guī)范中規(guī)定的許多原因,著色器的編譯可能會失敗。無論編譯是否成功,都可以通過調用glGetShaderInfoLog從shader對象的信息日志中獲取有關編譯的信息。

glGetShaderiv

第二個參數(shù):

  • ?GL_SHADER_TYPE:返回著色器類型,如果指定的著色器是頂點著色器對象,則params返回GL_VERTEX_SHADER,如果是幾何著色器對象,則返回GL_GEOMETRY_SHADER如果是片段著色器對象,則返回GL_FRAGMENT_SHADER。

  • GL_DELETE_STATUS:判斷著色器是否被刪除,是,params返回GL_TRUE,否則返回GL_FALSE。

  • GL_COMPILE_STATUS:判斷編譯狀態(tài),如果著色器最后一次編譯成功,params返回GL_TRUE,否則返回GL_FALSE。

  • GL_INFO_LOG_LENGTH:params返回著色器信息日志中的字符數(shù),包括空終止字符(即存儲信息日志所需的字符緩沖區(qū)的大小)。如果著色器沒有信息日志,則返回值0。

  • GL_SHADER_SOURCE_LENGTH:params返回著色器源碼字符串的長度,包括空終止字符。(即存儲著色器源碼所需的字符緩沖區(qū)的大小)。如果不存在源代碼,則返回0。

錯誤:

GL_INVALID_ENUM: pname不是一個可接受的值(只允許上面這些參數(shù))。

GL_INVALID_VALUE: 著色器不是由OpenGL生成的值。

GL_INVALID_OPERATION:shader不是一個著色器對象

_malloca

?_malloca?返回一個void?*,該指針能用于存儲任何類型的對象,并且只有強制類型轉換后才可以正常取值,可以通過等于0或者NULL來初始化。

void*類型的指針可以理解為一個過渡型的指針狀態(tài),必須要賦予類型(強制類型轉換)才能正常使用,void*可以轉化成其他類型,但其他類型不能轉化成void*。任何類型的指針都可以直接賦值給void *型指針,無需進行強制類型轉換,相當于void *包含了其他類型的指針。

glGetShaderInfoLog


將shader的信息日志儲存在InfoLog中,最多可達maxLength個字符,實際返回length字符數(shù)(不包括空終止字符)。如果不需要返回字符串的長度,可以把length設置為NULL。這里的maxLength和length一般通過調用glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length);獲得。

著色器對象的信息日志是OpenGL實現(xiàn)者傳達編譯過程信息的主要機制。

錯誤:

如果?shader?參數(shù)不是 OpenGL 生成的,那么生成?GL_INVALID_VALUE?錯誤。

如果?shader?參數(shù)不是一個 shader 對象,那么省?GL_INVALID_OPERATION?錯誤。

如果?maxLength?小于0,那么生成?GL_INVALID_VALUE?錯誤。

glDeleteShader

該函數(shù)釋放內存并使shader對象的名稱無效。此命令有效地撤消了調用glCreateShader的效果。 如果要刪除的著色器對象被附加到程序對象,則它將被標記為刪除,但如果在任何渲染的上下文中附加了某個著色器,這個著色器必須先分離,才能被刪除,若要確定某個著色器對象是否已標記為刪除,可以使用glGetShader(shader, GL_DELETE_STATUS, *params)。

錯誤:

如果著色器不是由OpenGL生成的值,則生成GL_INVALID_VALUE。

glAttachShader

允許在程序上附加多個相同類型的著色器,也允許將一個著色器附加到多個程序。調用glDetachShader可以將著色器從附加的程序分離。

如果程序或著色器不是由OpenGL生成的值,則生成GL_INVALID_VALUE。?

如果程序不是指定的程序對象,則生成GL_INVALID_OPERATION。?

如果著色器不是指定的著色器對象,則生成GL_INVALID_OPERATION。?

如果著色器已經附加到程序,則生成GL_INVALID_OPERATION。

glDetachShader

如果著色器已通過調用glDeleteShader被標記為刪除,且未附加到任何其他程序對象,那么在它被分離后就會被刪除。

錯誤:

如果程序或著色器的值不是由OpenGL生成的,則生成GL_INVALID_VALUE。

?如果程序不是程序對象,則生成GL_INVALID_OPERATION。?

如果shader不是shader對象,則生成GL_INVALID_OPERATION。?

如果著色器未附加到程序,將生成GL_INVALID_OPERATION。


glLinkProgram

根據(jù)附加到程序的著色器類型,比如GL_VERTEX_SHADER、GL_GEOMETRY_SHADER和GL_FRAGMENT_SHADER類型的著色器,它們會被用于創(chuàng)建可執(zhí)行文件。

可以通過調用帶參數(shù)program和GL_LINK_STATUS的glGetProgram()函數(shù)來查詢鏈接操作的狀態(tài),如果程序被正確鏈接并且可以使用,則該值將被設置為GL_TRUE,否則將被設置為GL_FALSE。

成功鏈接之后,屬于程序的uniform變量將被初始化為0,并分配一個位置,該位置可以通過調用glGetUniformLocation來查詢,所有未綁定到頂點屬性索引的屬性變量此時都將綁定一個索引。

glValidateProgram

檢查程序中包含的可執(zhí)行文件是否可以在當前OpenGL狀態(tài)下執(zhí)行。驗證過程產生的信息將存儲在程序的信息日志中。驗證信息可以由空字符串組成,或者它可以是包含關于當前程序對象如何與當前OpenGL狀態(tài)的其余部分交互的信息的字符串。這為OpenGL實現(xiàn)者提供了一種方式來傳達關于為什么當前程序是低效的、次優(yōu)的、無法執(zhí)行的等等的更多信息。

驗證操作的狀態(tài)將作為程序對象狀態(tài)的一部分存儲。如果驗證成功,該值將被設置為GL_TRUE,否則將被設置為GL_FALSE??梢酝ㄟ^調用帶參數(shù)Program和GL_VALIDATE_STATUS的glGetProgram來查詢。如果驗證成功,程序在給定的當前狀態(tài)下執(zhí)行。否則,程序不會執(zhí)行。?

該功能通常僅在應用程序開發(fā)期間有用。信息日志中存儲的信息字符串完全依賴于實現(xiàn);因此,程序在不同的OpenGL實現(xiàn)下會產生不同的信息字符串。


我們分別以字符串形式寫下頂點著色器和片段著色器,著色器是使用一種叫GLSL的語言寫的,這里的vec4表示包含4個float分量的向量,position是變量名,著色器只通過輸入和輸出來進行數(shù)據(jù)的交流和傳遞,所以GLSL定義了in和out關鍵字來專門實現(xiàn)這個目的,GLSL還提供一個額外的layout標識,這可以讓頂點著色器從頂點數(shù)據(jù)中直接接收輸入,我們使用location這一元數(shù)據(jù)指定輸入變量,它和CPU上的頂點屬性相匹配。

我們可以做一些操作,創(chuàng)建新的文件夾res->shaders,創(chuàng)建一個命名為Basic.shader的文件,將字符串中的代碼移到這里

然后寫一個函數(shù)ParseShader()將兩個著色器存到string數(shù)組ss中并返回,注意這里函數(shù)返回多個值的方法

最后,我們通過指定路徑拿到寫好的字符串源碼,然后創(chuàng)建著色器,用glUseProgram來啟動著色器,在程序結束前記得調用glDeleteProgram來刪除我們的程序以釋放內存。

此時點擊本地Windows調試器,將會看到我們著色器開始工作,在窗口中顯示一個紅色的三角形,并且在輸出窗口可以看到我們的調試代碼,輸出了著色器的字符串源碼

glUseProgram

如果程序對象包含一個或多個已成功編譯和鏈接的GL_VERTEX_SHADER類型的著色器對象,則該程序對象將包含在頂點處理器上運行的可執(zhí)行文件。

如果程序對象包含一個或多個GL_GEOMETRY_SHADER類型的著色器對象,并且這些著色器對象已被成功編譯和鏈接,則該程序對象將包含在幾何處理器上運行的可執(zhí)行文件。

如果程序對象包含一個或多個GL_FRAGMENT_SHADER類型的著色器對象,并且這些著色器對象已被成功編譯和鏈接,則該程序對象將包含可在片段處理器上運行的可執(zhí)行文件。

當程序對象正在使用時,應用程序可以自由地修改、編譯、附加、分離或刪除附加的著色器對象。這些操作都不會影響作為當前狀態(tài)一部分的可執(zhí)行文件。重新鏈接當前正在使用的程序對象時,如果鏈接成功,就會將該程序對象安裝為當前渲染狀態(tài)的一部分(參見glLinkProgram);如果失敗,其鏈接狀態(tài)將被設置為GL_FALSE,但可執(zhí)行文件和相關狀態(tài)會保留為當前狀態(tài)的一部分,直到后續(xù)調用glUseProgram時才將其移除,移除后,在重新鏈接成功之前,它不會成為當前狀態(tài)的一部分。

如果program為零,則表示當前渲染狀態(tài)引用無效的program對象,并且著色器執(zhí)行的結果是未定義的。但是,這不是錯誤。?

如果程序不包含GL_FRAGMENT_SHADER類型的著色器對象,可執(zhí)行文件會安裝在頂點處理器上,或者在幾何處理器上,但片段著色器執(zhí)行的結果將是未定義的。

錯誤:

如果program既不是0也不是OpenGL生成的值,則生成GL_INVALID_VALUE。?

如果程序不是程序對象,則生成GL_INVALID_OPERATION。?

如果程序不能成為當前狀態(tài)的一部分,則生成GL_INVALID_OPERATION。?

如果轉換反饋模式激活,則生成GL_INVALID_OPERATION。

在文件里寫著色器代碼的評論 (共 條)

分享到微博請遵守國家法律
长海县| 温宿县| 台山市| 神农架林区| 瓦房店市| 江达县| 杭州市| 泾阳县| 湟中县| 中方县| 阜城县| 独山县| 济宁市| 克什克腾旗| 大厂| 鱼台县| 高要市| 嘉义县| 开平市| 新野县| 广元市| 八宿县| 万宁市| 鹤岗市| 明溪县| 松滋市| 阳山县| 疏勒县| 方正县| 封丘县| 乐平市| 缙云县| 海丰县| 通州区| 卓尼县| 龙岩市| 洛阳市| 吉水县| 井冈山市| 疏附县| 平山县|