2013-06-11 73 views
0

很迷惑這個功能 在GLSL的代碼的成本,我總是看到這樣的事情的Texture2D在GLSL

uniform sampler2D source; 
varying vec2 textureCordi; 

void main() 
{ 
    vec2 uv = textureCordi.xy; 
    vec3 t1 = texture2D(source, vec2(uv.x - step_w, uv.y - step_h)).rgb; //2 
    float average = (t1.r + t1.b + t1.g)/3.0; 
    //..... 
} 

在// 2,T1保存源的數據(我認爲它是數據),但它複製了多少數據? 紋理座標在0〜1之間,假設紋理是圖像 而圖像的大小是1024 * 768 t1會節省1024 * 768像素數量? 在這個命令下gpu會做什麼?

如果t1做繁重的複製工作,我可以問texture2D返回 源的引用到t1(如C++)嗎?

+1

GLSL 1.2規範:http://www.opengl.org/registry/doc/GLSLangSpec.Full.1.20.8.pdf – Grimmy

回答

1

這是每個片段的操作,並且對於每個片段,使用texture2D您可以採樣單個紋素。許多並行操作都是在整個原語的GPU上完成的,在某些方面,是的,所有的數據最終都被「存儲」在某個輸出緩衝區中,但每個main()函數僅對當前片段運行。它並不知道其他片段正在發生什麼,所以每個操作都是每片段。

爲了澄清這進一步,這應該幫助,但也可能是矯枉過正: GPGPU - http://www.mathematik.uni-dortmund.de/~goeddeke/gpgpu/tutorial.html 片段着色器流水線 - http://www.lighthouse3d.com/tutorials/glsl-tutorial/fragment-processor/

希望這有助於。

+0

根據你的回答,t1只存儲一個texel而不是一個texels數組.gpu會執行每個片段的計算,這是gpu管理數據的方式嗎? – StereoMatching

+0

它計算每個片段,texture2D使用當前數據運行,而不是平均數據,一旦計算結束,gl_FragColor會將該顏色存儲在該片段特定位置的某個輸出緩衝區中。 textuer2D將根據採樣紋理的插值方法查看一個或幾個texels。 –

4

該操作只查找一個紋理元素,對應於您傳入的紋理座標(將過濾,mipmap等考慮在內)。紋理座標是要獲取的紋理元素的標準座標。

編輯:t1保存所請求的操作(作爲具有3個分量的向量)的一個紋素的rgb值。歸一化的紋理座標是texture2D的輸入。以下線計算該一個紋理的三個通道的平均強度,而不是整個紋理的平均強度。

+0

您的意思是t1不保存像素數據,但紋理的規格化座標?如果t1不保存紋理的數據,浮動平均值如何可以=(t1.r + t1.b + t1.g)/ 3.0;得到rgb頻道的平均值? – StereoMatching

+4

@StereoMatching當然,它會保存數據,但只保存給定紋理座標所請求的單個紋理元素。 –

+0

@StereoMatching Christian Rau是正確的,編輯我的答案澄清這一點。 – JustSid