2012-03-19 42 views
22

在我的片段着色器可以裝入紋理,那麼這樣做:如何獲取片段着色器中的像素信息?

uniform sampler2D tex; 

void main(void) { 
    vec4 color = texture2D(tex, gl_TexCoord[0].st); 
    gl_FragColor = color; 
} 

這將當前像素紋理的顏色值。我可以修改這些,等等,它運作良好。

但有幾個問題。我如何知道「我是哪個」像素?例如,假設我想將像素100,100(x,y)設置爲紅色。其他一切都是黑色的。我該怎麼做:

「if currentSelf.Position()==(100,100); then color = red; else color = black?」

我知道如何設置顏色,但是如何獲得「我的」位置?

其次,我如何從鄰居像素獲取值?

我嘗試這樣做:

vec4 nextColor = texture2D(tex, gl_TexCoord[1].st); 

但並不清楚它是什麼回來?如果我像素100,100;我如何獲得101,100或100,101的值?

回答

28

如何判斷我是哪個像素?

你不是一個像素。你是片段。 OpenGL稱它們爲「片段着色器」是有原因的;這是因爲它們不是像素而是。事實上,不僅可能它們永遠不會成爲像素(通過discard或深度測試或其他),由於多重採樣,多個片段可以組合成一個像素。

如果您想知道片段着色器在窗口空間中的位置,請使用gl_FragCoord。片段位置是浮點值,而不是整數,因此您必須使用範圍而不是單個「100,100」值進行測試。

其次,我如何從鄰居像素獲取值?

如果你正在談論相鄰的幀緩衝像素,你不要。片段着色器不能隨意從幀緩衝區讀取,無論是在自己的位置還是在鄰近位置。

如果您正在討論訪問鄰近的texel,那麼這只是將您傳遞到的紋理座標偏移到texture2D的問題。您必須獲取紋理的大小(因爲您不使用GLSL 1.30或更高版本,您必須手動將其傳入),反轉大小並從紋理座標的S和T分量中添加或減去這些大小。

+1

打我給它;所有我不得不說的與這個略有不同的是,鏈接http://www.opengl.org/sdk/docs/manglsl/xhtml/gl_FragCoord.xml對'gl_FragCoord'進行了更詳細的描述,中間渲染到紋理,如果他真的想要根據輸出緩衝區中的多個相鄰像素的組合計算輸出片段。 – Tommy 2012-03-19 23:35:14

+0

基本上我想要做的是,如果像素x,y在其中有紅色的鄰居,在x,y中增加紅色。有沒有教程可以解釋如何做到這一點? – user697111 2012-03-19 23:54:08

+2

@ user697111:你想實現一個工作在紋理的紅色通道上的「膨脹」濾鏡。谷歌這些關鍵字,你應該找到很多。 – datenwolf 2012-03-20 00:02:48

0

簡單易行。

只需根據分辨率計算像素的大小。然後查找+1和-1。

vec2 onePixel = vec2(1.0, 1.0)/u_textureSize; 
gl_FragColor = (
    texture2D(u_image, v_texCoord) + 
    texture2D(u_image, v_texCoord + vec2(onePixel.x, 0.0)) + 
    texture2D(u_image, v_texCoord + vec2(-onePixel.x, 0.0)))/3.0; 

有一個很好的例子here

相關問題