2015-12-22 55 views
1

我在IOS上使用openGLES來執行一些通用數據處理。目前我正在嘗試製作一個由整數索引訪問的浮點值的大型查找表(〜1M元素),並且我希望它是1D(儘管2D工作)。我已經瞭解到,使用紋理/採樣器可能是這樣做的方式,但我的其餘問題是:在IOS上的openGLES中製作大型查找表

  1. 採樣器或紋理,哪種效率更高?什麼是參數設置來達到最佳效果(如在glTexParameteri()中配置的那些)?
  2. 我知道我可以使用1-sample-high二維採樣器/紋理作爲1D,但出於好奇,我不知道1D採樣器/紋理是否在IOS es3上被移除?我無法找到方法glTexImage2D(),也無法找到導入ES3/gl.h的參數GL_TEXTURE_1D。

回答

2

OpenGL ES沒有1D紋理。從未做過任何以前的版本,仍然不符合最新版本(3.2)。我非常懷疑它會永遠。

至少在我看來,這不是什麼大的損失。您可以使用高度爲1的2D紋理完成任何可以完成的1D紋理。唯一的小麻煩是您必須傳入更多的採樣屬性,並且在GLSL代碼中對紋理進行採樣時需要第二個紋理座標。

對於您正在查看的尺寸,您將遇到與高度爲1的2D紋理相同的問題,您也會遇到1D紋理:您受限於最大紋理尺寸。這由您可以使用glGetIntegerv(GL_MAX_TEXTURE_SIZE, ...)查詢的值給出。相對最近的移動平臺的典型值是2K到8K。基於published docs,在最近的蘋果平臺(A7到A9)上它看起來像是4096。

沒有什麼我能想到的,這會給你一個單一的維度更大的範圍。有一個針對您的用例的EXT_texture_buffer擴展,但我沒有在iOS支持的擴展列表中看到它。

因此,您可以做的最好的方法是將數據存儲在2D紋理中,並使用div/mod算法將較大的1D索引分解爲2個紋理座標。

+0

「您可以使用2D高度爲1的紋理完成任何您可以使用1D紋理完成的任務。」當然,除了有一維數組紋理。即使您可以在2D紋理的高度軸上關閉混合,mipmap仍然不起作用。 –

+0

感謝Reto,這解釋了很多!還有一個問題,如果你不介意,在我使用全整數索引時,配置紋理以優化性能的最佳方法是什麼?據我所知,紋理被設計爲用非整數索引來獲取,它會被插值或舍入,我可以跳過。 –

+0

沒關係Reto,我嘗試了texelFetch,它工作。 –