這是基於以下問題:Best way to detect NaN's in OpenGL shaders
標準GLSL定義了用於檢測的isnan()和isinf()函數。 OpenGL ES 2.0着色語言沒有。然而,我怎樣才能處理NaN和Infs呢?如何在OpenGL ES 2.0着色器中處理NaN或inf
3
A
回答
5
您可以通過一個僅用於NaN的是真實的條件檢查楠:
bool isNan(float val)
{
return (val <= 0.0 || 0.0 <= val) ? false : true;
}
isinf
是有點難度。沒有任何機制可以將浮點數轉換爲整型表示並使用這些位進行播放。所以你必須將它與一個適當的大數進行比較。
2
WebGL的問題相同。 Nicol Bolas的答案適用於大多數GPU,但不適用於某些nVidias。這個版本的作品適合所有的GPU我有機會嘗試:
bool isNan(float val)
{
return (val < 0.0 || 0.0 < val || val == 0.0) ? false : true;
// important: some nVidias failed to cope with version below.
// Probably wrong optimization.
/*return (val <= 0.0 || 0.0 <= val) ? false : true;*/
}
0
未經檢驗的,所以不知道這會工作(由於優化),但它應該工作,無論是天道酬勤和-Inf。
bool isinf(float val) {
return (val != 0.0 && val * 2.0 == val) ? true : false;
}
相關問題
- 1. Opengl Es 2.0着色器管理器
- 2. OpenGL ES 2.0中的着色器Android
- 3. 用於圖像處理的OpenGL ES 2.0着色器示例?
- 4. OpenGL ES 2.0着色器最佳實踐
- 5. 從OpenGL ES 2.0着色器返回值
- 6. iOS OpenGL ES 2.0着色器的限制
- 7. PowerVR SGX535着色器性能(OpenGL ES 2.0)
- 8. OpenGL ES 2.0修改着色器變量
- 9. OpenGL ES 2.0點光源着色器
- 10. OpenGL ES 2.0等離子着色器
- 11. FAUX HDR opengl ES 2.0着色器算法
- 12. opengl es 2.0加速着色器效果
- 13. opengl es 2.0 - 優化片段着色器
- 14. 如何在OpenGL ES 2.0中獲得「發光」着色器效果?
- 15. 使用OpenGL ES 2.0着色器的平滑紋理線條
- 16. OpenGL ES 2.0 SL從片段着色器寫入紋理
- 17. 的OpenGL ES着色器多紋理
- 18. OpenGL ES 2.0中片段着色器的非均勻顏色值
- 19. OpenGL ES 1.x着色器
- 20. Android中的着色器在OpenGL ES中
- 21. OpenGL ES 2.0着色器,如何調用時間變量?
- 22. 通過glUniform OpenGL ES 2.0在着色器中移動對象
- 23. 在着色器中實現淡出的OpenGL-ES 2.0問題
- 24. OpenGL ES 2.0 - 在頂點着色器中找不到屬性
- 25. 在OpenGL ES 2.0頂點着色器中生成頂點
- 26. OpenGL ES 2.0和GLKit:從GLKBaseEffect着色器到OpenGl
- 27. 將顏色應用於Fragment着色器中的OpenGL ES 2.0 Point Sprite紋理?
- 28. OpenGL ES 2.0 - 如何僅使用着色器繪製紋理的一部分?
- 29. OpenGL ES和OpenGL兼容着色器
- 30. inf或Inf? nan或NaN?
謝謝!爲什麼這不是官方的規格?有沒有平臺,這不工作? – rsp1984 2012-08-05 11:14:54
@RafaelSpring可能有。衆所周知,大多數GPU硬件都採用快捷鍵w.r.t.浮動導致__non -__符合IEEE 754的浮點數。因此,我懷疑你的所需行爲是有保證的。正如尼科爾所建議的那樣,您最好的選擇可能是對正常運營期間您預期的最低和最高價值有一個好的想法,並檢查您的價值是否在該範圍內。否則,它可能是'Inf'或'NaN'。 – 2012-12-13 01:18:26
@SchighSchagh如果編譯器和/或GPU不符合IEEE-754標準,即使涉及NaN,即使比較運算符的結果也可能無法得到保證。我遇到過一種情況,如果一個參數是NaN,那麼一個寬鬆的編譯器會生成'<'的代碼,該代碼總是計算爲真。最安全的方法是防止NaN從頭生成。 – Sean 2014-05-14 17:56:35