2014-06-23 68 views
0

在我以前的經驗中,gl_FrontFacing的支持一直不穩定。有時它只是失敗,有時會導致軟件渲染回退。所以我嘗試使用GL_VERTEX_PROGRAM_TWO_SIDE,設置不同的正面和背面二次色,並測試二次色。但是我發現至少在一張ATI顯卡上,這種方法會導致編譯着色器時發生間歇性故障。那麼,任何人都可以想出其他技術來判斷片段是否面向前方?片段着色器中有沒有gl_FrontFacing的可靠替代方案?

順便說一下,有些人似乎並不認爲gl_FrontFacing可能會失敗,所以我在opengl.org論壇和Apple的OpenGL郵件列表上進行了一些搜索。我發現有十幾個這樣提到的gl_FrontFacing以各種方式在各種卡上失敗,一些來自ATI,另一些來自NVidia。大多數這些提及是從2009年或更早。所以如果我能假設所有的用戶都使用過去5年製造的機器,那麼我可能會沒事。但我不認爲我可以這樣做。

+0

你的意思是'gl_FrontFacing',對不對?我從未見過'gl_FrontFace'。你有什麼平臺遇到問題? –

+0

@ReetoKoradi:感謝拼寫更正。雙面着色問題在Windows上,我認爲'gl_FrontFacing'問題可能在Mac上。 – JWWalker

+2

如何才能支持這個缺點?光柵化器必須知道它是填充正面還是背面多邊形,所要做的就是將該狀態傳遞給片段着色器。也許你只是沒有在着色器中正確處理'bool'數據類型?然而,主要和次要的顏色是不贊成的 - 支持這一點絕對是多餘的。考慮插入你自己的輸出變量。 –

回答

1

由於考慮空間中的位置也沿遠離相機,下面的表達式似乎是gl_FrontFacing相當好的近似:

dot (normal, position) < 0.0 

這仍然會給你周圍的邊緣輕微的文物,但不比@datenwolf解決方案嚴重得多。詳細討論見my blog post :)

更新:如果你願意使用WebGL擴展,甚至更好的測試是可能的。在那裏,你可以計算出面部正常估計,即在正面和背面的作品,因此,這可能像素完美着色器與我們的頂點結果正常測試它的點積:

#extension GL_OES_standard_derivatives : enable 
vec3 fdx = dFdx(position); 
vec3 fdy = dFdy(position); 
vec3 faceNormal = normalize(cross(fdx,fdy)); 
if (dot (normal, faceNormal) > 0.0) { 
    // gl_FrontFacing is almost certainly true 
} 
+1

我不確定你爲什麼說這是一個WebGL擴展;派生函數自1.10版本以來一直是OpenGL着色語言的一部分。但無論如何,這基本上是我最終做的。 – JWWalker

+0

來自webgl背景在這裏。完全錯過了關於opengl的問題。 – makc

1

將變換的面法線(插值頂點法線)傳遞給片段着色器並測試z分量的符號。是的,我知道這與基於繞組的前/後面測試不同,但足夠接近。

+0

它不夠接近我的目的。我嘗試了這一點,並從邊緣接近相機的三角形周圍獲得令人不快的僞影。 – JWWalker

相關問題