2012-09-10 43 views
9

我剛開始學習OpenGL ES 2.0,在這個過程中,我遇到了一些對我沒有意義的術語,即使有定義。像這樣的:插值什麼是OpenGL中的插值?

從書OpenGL ES 2.0的編程指南,我看到這個定義爲插值

用於產生用於從每個片段的變化的值的機制分配給基元的每個頂點的變化值被稱爲插值。

雖然我明白Linear Interpolation是從this answer,上面的定義對我來說沒有意義。

你可以換一種方式來舉例說明插值是什麼嗎?

+0

插值通常是一個基本的數學運算,如果真的是你要求的解釋,那麼你應該首先深入你的一般數學知識,然後再鑽研像3D計算機圖形那樣複雜的東西。 –

回答

10

至於「換句話說」的一般定義,你可以找到幾個網站上。至於例子,我可以嘗試解釋這個給你:

您使用插值當你有有限的數據量試圖代表無限量的數據,例如,你有2個點代表一條線:

對於插值,你總是需要一種表示的線索,在線情況下你需要2點(並且提示是「它是一條線」 ),可以說它們是向量A和B.現在解決方案是T(s) = A + s*(B-A)對於任何實數''在兩個方向上得到無窮的線。要得到A和B之間的一條線,您需要在間隔[0,1]上定義's',以便T(0)=A,而T(1)=B這是線性插值。

對於稍微複雜的插值你可以看看OpenGL中的位:

注意,在GL和你的GPU使用的算法要複雜的多,優化然後呢,我要在這裏寫的,但一般有相同的結果。

在形狀的情況下,您通常使用由3個矢量(頂點)定義的三角形,並說它是一個三角形(您在繪圖方法中表示爲「三角形」)。在向這些向量應用一些矩陣後,您將在繪製緩衝區中獲得它們的2D投影(可以在頂點着色器中發生)。現在您需要使用一些顏色,紋理或顏色插值來填充緩衝區中的所有點。首先,所有這些繪製點(實際上它們在緩衝區上的位置)都是線性內插機制的結果(您在GL中無法控制它)。第二種情況通常是線性插值:

嘗試通過設置顏色指針繪製具有不同顏色頂點的三角形。根據位置的插值(對於需要繪製的每個像素,您可以獲取片段着色器的位置插值結果),從而在整個表面上獲得一個很好的平滑顏色幽靈。你可以手工實現這樣這種顏色插值結果:

輸入:

Vector a, b, c; //original triangle positions 
Vector interpolationABC; //current fragment interpolation between a, b and c 
Color colorA, colorB, colorC; //colors for vectors a, b and c 

輸出(該片段的顏色):

Color output = (
(a - interpolationABC).length() * colorA + 
(b - interpolationABC).length() * colorB + 
(c - interpolationABC).length() * colorC) 
/(
(a - interpolationABC).length() + 
(b - interpolationABC).length() + 
(c - interpolationABC).length()); 

這種機制再次表示線性內插(非常慢的其中一個,但它應該做的伎倆,是非常可讀的)

至於非線性插值的例子,你需要一點想象力:可以說我們正在畫一個球體。爲了簡單起見,我們假設它的中心位於(0,0,0)並且它的半徑是1.球體是用N個三角形創建的,並且如果由於性能問題N不夠大(大多數情況),它是位「前衛」,我們想平滑一點。所以我們必須打開一些燈(無論如何這只是一個沒有燈的圓圈),並找出如何設置法線。一方面,您可以計算由3個點定義的曲面法線,並且每個三角形將具有唯一的法線,但會產生「迪斯科球」效果,另一方面,您知道球體的任何點P的法線是normalized(P-center)或在這種情況下,點本身。因此,每個頂點法線是頂點的位置本身(所以現在每個三角形有3個不同的法線),每個片段的法線是這些法線的插值:

如果使用與顏色相同的插值機制,您將看到長度的法線不是「恆定的」,導致缺陷,迫使你使用不同的機制(非線性)。在這種特定情況下,您可以簡單地對這些線性片段結果進行歸一化處理,並獲得所需的結果,但在這種特定情況下,您也可以從片段位置計算法線(您可以對數學上可呈現的任何形狀進行計算)。但在實踐中知道,你會得到一個奇怪的形狀,它具有光滑的部分和邊緣,並且可能有不同大小的法線來表示一些非常棒的效果,這就是爲什麼有很多機制可以在形狀上插入不同的參數。插值機制是一種機制,只需知道有限數量的數據(其中一種機制稱爲「線性插值」),就可以產生無限數量的結果。或者換句話說,你張貼了位更具體的例子:

用於從 產生每個片段的變化的值的機制分配給原始的每個頂點的變化值被稱爲 插值。

+0

謝謝馬蒂奇,這真的讓人印象深刻。對於某些部分的解釋來說,目前我仍然很難消化,我將把它作爲參考,我認爲在深入研究opengl時我會需要它。 – neevek

+1

很好的解釋,你已經得到了我過去的讚賞:)但是一個小的修正:在A和B *(包括A和B點)*之間獲得一條線的間隔是's∈[0,1]'。因爲0代表:A + 0(B-A)= A',第一個頂點;對於1它是'A + 1(B-A)= A + B -A = B',與之相反。 –

+0

@嗨天使感謝您的糾正,我不知道我是如何錯過它的。我現在修好了。 –