2013-01-05 45 views
7

我想要一個不錯的漸變效果。但在一分鐘之內,它確實是斑駁的,你可以在兩個三角形之間看到似乎。我有以下着色器vert和frag。我認爲唯一能做的就是交換到預先生成的紋理。OpenGL3.2 GLSL塊插補

對於兩個三角形,數據被漂浮爲浮動[x y] [R G B],我不認爲C++源代碼值得展示。

VERT 的#Version 330

layout(location = 0) in vec2 position;  
layout(location = 1) in vec3 incolor; 

smooth out vec3 color; 

void main() 
{ 
    color = incolor; 
    gl_Position = vec4(position.x,position.y,0.0,1.0); 
} 

FRAG 的#Version 330

smooth out vec4 outputColor; 
smooth in vec3 color; 

void main() 
{ 
    outputColor = vec4(vec3(color),1.0); 
} 

RESULT blocky

尋找在單三角形示出了塊狀岬 enter image description here

+0

你可能會發現你通過將要內插的顏色粘貼到頂點和片段着色器之間的tex-coord中來獲得更高的精度。 – JasonD

+1

@JasonD:沒有「tex-coord」這樣的東西;只有用戶定義的插值。 –

+0

@Andrew:你怎麼知道這是一個插值問題,而不是你的顯示位深度,屏幕,或者你如何可視化它的問題? –

回答

6

這是線性插值的一個正確行爲quad的屬性。請記住,四邊形總是呈現爲兩個三角形。有兩種可能性:以對角線\或對角線爲/作爲共同邊緣。如何插入屬性現在變得模糊(在兩種情況下都不相同)。

我會告訴你一個與你的相似的例子。

enter image description here

三角形由\對角線隔開。

enter image description here

三角形由/對角線隔開。

在兩種情況下,頂點的顏色有:

000000 top left 
3B3B3B top right + bottom left 
FFFFFF bottom right 

一種解決方案是提供只讀屬性,其導致明確的內插顏色值(顏色)。以下情況如此。

考慮從左上角到右下角的一條直線(讓我們用一個指定的基色稱這些基頂點)。左上角的值爲0,右下角1。每個其他頂點(在這種情況下,左下角,右上角)必須與該虛線垂直投影,並將相應的值分配給該頂點。在這種情況下(一個正方形),其他兩個角的值分別爲.5。這些角的顏色必須是兩種基本顏色的混合值,其中的alpha值與剛剛計算的值相對應。

在上面的例子中,其他兩個角的顏色必須是808080而不是3B3B3B爲了使兩個圖像同樣期待:

enter image description here

在你的情況,你可以使用下面的顏色對於頂點(至少,他們似乎這樣在你的屏幕截圖):

000000 top left 
3A3A3A top right + bottom left 
595959 bottom right 

所以他們不符合上面的要求,爲3A3A3A不其他兩個之間的平均值。


稍微不同的例子說明爲什麼你也許不只是想用.5的混合阿爾法值(這將導致平均值爲其他兩個頂點)。考慮非正方形的四,這樣矩形,其使用的值.5用於兩個其它角,其對應於808080灰色:

enter image description here

正如你可以看到,該梯度的方向不正交到我稱之爲兩個「底角」之間的連接線(左上角 - 右下角)。現在讓我們看看我從上面的方法產生:

enter image description here

它看起來更像是兩個角之間的線性漸變,但在「世界空間」,而不是在「紋理空間」。你可能更喜歡兩個輸出中的一個輸出;我想告訴你不同之處。在連接線(正交投影)的值如下所示

enter image description here

對不起,我的形象不好......(他們只是近似值!);)

+0

P.S.這同樣適用於頂點座標......考慮四邊形(光柵平鋪世界中的地磚),其中一個角高1,其他0。對角線決定了瓷磚的中心位於高度0還是0.5,就像一個示例性的點。這就是爲什麼我們通常在輸入數據不明確的情況下避免使用四邊形的原因。 – leemes

+0

謝謝你的回覆。 因此,這似乎解決了問題。我現在明白我想做的事情是不可能的。因爲沒有辦法讓每個三角形都知道看起來像什麼顏色。 那麼問題的第二部分如何得到塊狀/條紋效果? – Andrew

+0

@Andrew Just在你的問題中添加了評論。看起來「抖動」,這應該給你的理論背景。你希望將浮點值映射到從0到1的255個離散步驟(在屏幕上構建圖像);然而,你不應該在它們之間的一個閾值(這是顯卡自動默認爲你自己做的),而是根據像素座標決定閾值。聽起來很複雜,但帶來不錯的結果。 – leemes