2017-02-14 128 views
0

我有一個六角形地圖,並試圖在它上面建立一場戰爭迷霧。我正在做的是建立一個頂點以十六進制爲中心的VBO。然後根據其可見性(0.0f,0.5f,1.0f)爲每個圖塊中心分配阿爾法值。 這裏是頂點着色器:網格中三角形頂點之間的插值

#ifdef GL_ES           

precision highp float; 

#endif 

attribute vec4 a_position; 
attribute float a_alpha; 

uniform mat4 u_MVPMatrix; 

varying float v_alpha; 

void main() 
{ 
    gl_Position = u_MVPMatrix * a_position; 
    v_alpha = a_alpha; 
}              

和我的片段着色器:

#ifdef GL_ES 

precision highp float; 

#endif 

varying float v_alpha; 

void main() 
{ 
    gl_FragColor = vec4(v_alpha, v_alpha, v_alpha, 1.0); 
} 

我試圖從fogmap刻出一個洞,嘗試一下,我得到這樣的: wrong interpolation

插值有什麼問題?爲什麼有一個三角形結構如此可見?

+0

這是一個線性插值的假象。也許你可以看看你是否可以改變片段着色器屬性的插值方法。這裏有一些關於它們的信息:https://www.khronos.org/opengl/wiki/Type_Qualifier_(GLSL)#Fragment_shader_outputs – Bartvbl

+4

這不是一個真正的插值artefact。這是一種感性假象。如果仔細觀察,您會發現顏色值是連續的。唯一改變的是漸變方向(這是不連續的)。這種不連續性被我們的大腦放大了。所以,的確如此。解決這個問題的唯一方法是在三角形上使用不同的插值方法。但這很大程度上取決於你需要什麼,也可能不那麼容易實現。 –

+0

好吧,我明白了。我相信沒有簡單的方法來改變var變量的插值方法。有沒有簡單的方法來實現平滑過渡(除了使用紋理來隱藏漸變)? – Hedin

回答

2

正如尼科指出的那樣,這是一種錯覺。

基本上,你所擁有的是兩個三角形之間的不連續性。共享邊具有相同的顏色值,但由於兩側的梯度不同,因此會在它們之間創建一條線的外觀。三角形邊緣的漸變變化並不平滑。

在數學上,你具有C0連續性,但不是C1連續性。

而人眼/感知非常用於平滑事物。所以當某件事情不順利的時候,我們認爲是不連續的。

對此,您無能爲力。你也許可以玩插值方案,但你可以做的最好的事情就是簡單地紋理十六進制。紋理頻繁變化的顏色將有助於掩蓋漸變不連續性。