2017-07-09 59 views
0

我正在使用WebGL浮點紋理來存儲矩陣。 每行有N個矩陣。WebGL - 使用任意二進制數據的紋理和浮點錯誤

在着色器中,我得到了這些矩陣,給定了每個向量的相對大小以及每個紋理行。

例如,如果我有每行10點的矩陣,和10行,着色器得到:

u_vector_size = 1/(10 * 4) 
u_row_size = 1/10 

有了這些信息,我取4個像素從紋理:

uniform sampler2D u_boneMap; 
uniform float u_vector_size; 
uniform float u_row_size; 

mat4 boneAtIndex(float column, float row) { 
    column *= u_vector_size * 4.0; 
    row *= u_row_size; 

    return mat4(texture2D(u_boneMap, vec2(column, row)), 
       texture2D(u_boneMap, vec2(column + u_vector_size, row)), 
       texture2D(u_boneMap, vec2(column + u_vector_size * 2.0, row)), 
       texture2D(u_boneMap, vec2(column + u_vector_size * 3.0, row))); 
} 

的問題?這在某些驅動程序下不起作用。

我主要在Mac上看到它,但它也發生在Windows上,在那裏獲取錯誤的數據,一切都變得瘋狂。

我假設這是由於浮點錯誤。

主要是由於結果改變的事實,無論我使用的是具有二維權力的紋理還是不是。 數據完全相同,只是每個矢量和行的大小相對於整個紋理大小的變化而言。

通常我會使用紋理緩衝區,但是這是WebGL代碼,WebGL只支持紋理。

有什麼辦法可以使這種獲取矩陣的紋理可靠和一致嗎?

+0

您是否將紋理過濾設置爲GL_NEAREST? –

+0

我做到了。我甚至可以上傳測試,如果它感興趣的人,假設可以上傳文件在SO – user2503048

+0

進一步調查後,似乎這隻發生在Hacintosh,所以我想有一個驅動程序錯誤在那裏處理NPOT紋理。我不太確定Hacintosh是如何工作的,從未安裝過Mac或有Mac。我會檢查我可以向誰報告這個錯誤。 – user2503048

回答

0

如果它對任何人感興趣,實際問題確實是浮點錯誤。由於我在像素之間的邊界上進行採樣,即使是很小的浮點錯誤都可能導致對錯誤的像素進行採樣。解決方案是在像素的中間進行採樣。

uniform sampler2D u_boneMap; 
uniform float u_vector_size; 
uniform float u_row_size; 

mat4 boneAtIndex(float column, float row) { 
    column *= u_vector_size * 4.0; 
    row *= u_row_size; 
    column += 0.5 * u_vectorSize; 
    row += 0.5 * u_rowSize; 

    return mat4(texture2D(u_boneMap, vec2(column, row)), 
       texture2D(u_boneMap, vec2(column + u_vector_size, row)), 
       texture2D(u_boneMap, vec2(column + u_vector_size * 2.0, row)), 
       texture2D(u_boneMap, vec2(column + u_vector_size * 3.0, row))); 
} 
+0

這個問題不是數值錯誤,因爲從紋理的邊界採樣並不能保證任何特定的結果,所以即使在沒有數字錯誤的世界中,您仍然會遇到特定圖形驅動程序實現的可能性。 –

+0

另請參閱https://stackoverflow.com/a/27439675/128511 – gman

+0

我不知道,謝謝。這是非常奇怪的想法,因爲我把我的紋理看作具有清晰整數索引的數據數組,一些遺忘的紋理和採樣比較複雜:) – user2503048