OpenGL shader 中關於頂點座標值的思考

2022-03-16 12:46:23 字數 1397 閱讀 1208

今天工作中需要做乙個事情:

在shader內部做一些空間距離上的計算,而且需要對所有的點進行計算,符合條件的顯示,不符合條件的點不顯示。

思路很簡單,在vertex shader內知道頂點座標,進行計算,算好以後判斷是否需要顯示,例如設定alpha值,那麼再將alpha值傳給fragment shader,在裡面設定alpha的值就好了。

基本**如下

// vertex shader

#version 300 es

in vec4 vposition;

in vec2 vtexcoord;

out float alpha;

void main()

}// fragment shader

#version 300 es

in float alpha;

void main()

看起來天衣無縫,邏輯合理,實際執行出現問題。由於我繪製的是乙個球形,然後希望部分球面不顯示,僅顯示部分球面,基本功能確實實現了,但是顯示與隱藏的邊緣特別的粗糙,有特別大的鋸齒。仔細思考一下,繪製球形是從上到下繪製三角形帶得到的,出現的鋸齒很有可能就是三角形的邊。也就是說在計算的時候,很有可能是取了上傳的頂點資料來進行計算,而沒有對每乙個點進行計算,所以只能判斷若干頂點,而不是每乙個點。

回顧一下 opengl 渲染管線的知識,在光柵化階段,如何根據三個點畫出三角形?如何獲得每個點的紋理座標?

通過光柵化將頂點按照拓撲結構渲染到螢幕上。例如,如果我們要繪製乙個三角形那就意味著要找出位於三角形內部的所有點。對於這樣每乙個點,在光柵化過程中都會呼叫片元處理器對其進行處理。在片元處理器中我們可以通過對紋理進行取樣或者使用其他技術來確定畫素的顏色。

光柵器在三角形的三個頂點之間執行插值(比如說掃瞄線演算法或者其他技術),並且通過執行片元著色器來「訪問」三角形內的每乙個畫素點。片元著色器會返回此片元的顏色值,光柵器會將這個顏色值更新到顏色緩衝區內並最終顯示出來(在通過一些其他測試例如深度測試之後),而從頂點著色器中傳出的其他任何變數都不會經歷上述步驟。如果片元著色器沒有明確的表示要使用那個變數(對於同乙個頂點著色器,我們可以有多個片元著色器與之對應),那麼乙個驅動優化程式將對 vs 進行優化,並丟棄 vs 中的任何只影響該變數的指令(這個特定的程式指的是由乙個 vs 和 fs 組合成的 shader 程式)。然而如果 fs 確實用到這個變數,那麼光柵器在光柵化過程會對這個變數進行插值。這通常意味著緊挨著的兩個畫素之間的值會有一點差異(儘管三角形離相機越遠,這種現象會越來越不明顯)。

**

結論:在vertex shader內對頂點做計算是錯誤的,一定要在fragment shader內,利用opengl插值的功能,拿到每乙個點的座標值,再進行計算。

OpenGL Shader 多種形狀SDF混合實現

了解過如何繪製形狀方法,在此之前也只介紹單個形狀繪製,沒有使用多個形狀綜合繪製。這裡繼續介紹繪製多種形狀綜合繪製的方法,一種能夠方便結合多個形狀繪製的方法形式。mix函式之前有所了解作為混合功能對於後續形狀渲染場景中有重要作用。mix函式是在兩個值之間線性插值。在之前使用最廣泛的應用場景就是兩個紋理...

python中關於Opencv中關於矩形的函式總結

最近處理影象,以前用的都是matlab,現在入手python比較慢,這幾天看到了很多命名和功能相似的函式,作個記錄總結一下 只是為了能夠看下函式知道它是做什麼的,因此不會對其用法說得面面俱到。看到乙個文章講得清晰詳實,分享一下 功能 計算輪廓內的面積 示例 輸入為乙個點集 contours 0 為前...

js中關於時間

1 獲取當前時間 var mydate new date mydate.getyear 獲取當前年份 2位 mydate.getfullyear 獲取完整的年份 4位,1970 mydate.getmonth 獲取當前月份 0 11,0代表1月 mydate.getdate 獲取當前日 1 31 m...