OpenGL著色器程式解析 著色器基礎

2021-08-11 22:13:42 字數 986 閱讀 6091

部分內容**於

現代opengl渲染管線嚴重依賴著色器來處理傳入的資料。如果不使用著色器,那麼用opengl可以做到的事情可能只有清除視窗內容了,可見著色器對於opengl的重要性。在opengl 3.0版本以前(含該版本),或者如果你用到了相容模式(compatibility prof?ile)環境,opengl還包含乙個固定功能管線(f?ixed-function pipeline),它可以在不使用著色器的情況下處理幾何與畫素資料。從3.1版本開始,固定功能管線從核心模式中去除,因此我們必須使用著色器來完成工作。

著色器類似乙個函式呼叫的方式—資料傳輸進來,經過處理,然後再傳輸出去。例如,在c語言中,這一過程可以通過全域性變數,或者函式引數來完成。glsl與之稍有差異。每個著色器看起來都像是乙個完整的c程式,它的輸入點就是乙個名為main()的函式。但與c不同的是,glsl的main()函式沒有任何引數,在某個著色階段中輸入和輸出的所有資料都是通過著色器中的特殊全域性變數來傳遞的(請不要將它們與應用程式中的全域性變數相混淆—著色器變數與你在應用程式**中宣告的變數是完全不相干的)。

opengl定義了六類儲存限定符(const/in/out/uniform/buffer/shared)。

opengl定義了in變數將資料拷貝到著色器中,以及out變數將著色器的內容拷貝出去。這些變數的值會在opengl每次執行著色器的時候更新。另一類變數是直接從opengl應用程式中接收資料的,稱作uniform變數。uniform變數不會隨著頂點或者片元的變化而變化,它對於所有的幾何體圖元的值都是一樣的,除非應用程式對它進行了更新。buffer是在應用程式中共享一大塊快取給著色器,和uniform不同的是buffer允許著色器對其進行修改。

glsl和c語言一樣使用//或/和/進行注釋,和c語言不一樣的是所有變數都必須在宣告的同時進行初始化。glsl支援任意型別的陣列,例如

float coeff[3]=float[3](2.38,3.14,42.0);
這裡就簡單講解到這裡,我們後面全部從**出發進行解析

Opengl(四) 著色器

1.opengl確保至少有16個包含4個元素的頂點屬性可用。2.不同著色器之間的資料傳輸,在傳送方中宣告乙個輸出,在接收方中宣告乙個同名輸入。3.uniform是全域性的,uniform會一直保留他的資料,直到他被重置或更新。4.設定uniform的方式 glint x glgetuniformlo...

著色器與OpenGL

現代opengl渲染管線嚴重依賴著色器來處理傳入的資料。如果不使用著色器,那麼用opengl可以做到的事情可能只有清除視窗內容了,可見著色器對於opengl的重要性。在opengl 3.0版本以前 含該版本 或者如果你用到了相容模式 compatibility prof?ile 環境,opengl還...

OpenGL日常 著色器

由屬性展開去 向量寫在後面 本文 本篇我們通過opengl的資料流動來理解著色器,通過資料流會很清楚的看到opengl著色器的工作原理。所以今天要說的內容全部跟glsl語言有關,當然這樣的一篇不可能全部講完 可能連皮毛都沒有 理解著色器是如何傳資料的才是我們的重點。話不多說,一圖以蔽之。如圖中,上部...