2016-11-29 40 views
0

根據GLSL ES reference,在片段着色器中支持highp是可選的。所以我在我的所有片段着色器中一直使用precision mediump float;,所以我沒有設備兼容性問題。在某些情況下,僅用10位相對精度就可以生成好看的輸出,而且我希望能夠在必要時切換到highp在iOS/Android的片段着色器中使用highp可以嗎?

安全性如何在實踐中,要求在片段着色器highp支持?我已經在各種設備上嘗試過它,並且它適用於我嘗試過的每個設備。我只瞄準Android 4.1+和iOS 8+,所以如果只有那些不支持它的硬件舊設備,那我就沒有問題。

我知道有運行時檢查等我應該做的,但首先我只是想獲得在我們談論野外設備的百分比大致的感覺。我無法在任何地方找到這些信息。如果只有75%的設備支持highp,那麼我會堅持mediump。如果有99.9%的設備支持它,我們來了highp

回答

1

有一個數據庫,在這裏你可以查找GL_OES_fragment_precision_high這表明Android設備的略低於50%的支持highp在片段着色器。你可以檢查哪些有和沒有這個擴展名。 link

但是,這可能是誤導性的,因爲GLES擴展已被撤銷,所以也許有些設備不再報告它,即使它們確實支持highp,所以您可以認爲這至少50% - 它可能是一個很高。擴展名被替換爲GetShaderPrecisionFormat,我無法找到一個好的數據庫。

隨着數據集小得多,我已經在28款設備上測試了我的遊戲,其中8款不支持片段着色器中的highp,包括運行Android 4.4的Nexus 7和三星Galaxy Note II以及運行4.3的三星Galaxy S3 (我在片段着色器中不支持highp的其他設備是相當隱晦的品牌)

我很確定所有目標iOS設備都支持片段着色器中的highp,但現在找不到任何證據回來了。

最後,當你提到「精密mediump浮動;」 IMO你應該選擇對案件逐案基礎上的精度,而不是選擇整個着色器的水平。如果你對所有東西都使用highp(特別是基於顏色的操作,很容易變得很低),你會在某些GPU上浪費很多性能。當然,你可以設置一個默認精度,然後在必要時重寫,也許這就是你正在做的事情,但是我個人並不喜歡在片段着色器中設置默認精度,然後編譯器迫使我做到明確。

編輯:此外,它允許在片段着色器中使用highp,即使對於不支持它的設備,您也只需獲取中等大小。在許多情況下,後備行爲是好的 - 高端設備可以獲得更好的精確照明等等,低端設備可能會回落到不太完美但仍然可以接受的狀態。

+0

是的,我目前使用'mediump'作爲默認值,並在任何地方明確指定'lowp'。我只是將需要它的變量碰到'highp'並保留缺省值。 – Karu

+1

關於回退行爲,規範意味着如果設備不支持它,則「highp」是一個編譯錯誤:「頂點語言要求任何使用lowp,mediump和highp的編譯和鏈接而不出錯。 lowp和mediump編譯沒有錯誤,支持highp是可選的。「 – Karu

+0

Yikes我認爲你是對的。Spec還說:「如果實現無法提供在編譯單元中存儲變量的聲明精度,則必須導致編譯或鏈接錯誤。」實際上,我在片段着色器中使用highp發佈了很多遊戲,並且從來沒有發生錯誤。似乎我可能會依賴司機的不正確行爲並逃避。 – Columbo

相關問題