2013-07-30 102 views
1

有沒有辦法,而不是使用gl_FragColor輸出的預定座標,設置特定像素的顏色的座標?glsl片段着色器中的特定座標輸出?

我目前正試圖通過實施着色均值平移算法。我的輸入是一個黑色和白色的紋理,其中白點代表要聚類的點,黑色代表無數據。

計算在所述鄰域中的所有點位置的加權平均後,我必須設置像素在所得位置到一個新的顏色表示一個羣集。

例如,如果我看的18x18中心的像素的鄰域涉及fragcoord和找到3個白色像素: Fragcoord = 30,33 像素1:座標(30,33) 像素2:座標( 27,33) 像素3:座標(30,30)

在計算它們的位置的平均值之後,我會有(29,32)。有沒有辦法將像素設置爲29,32以不同的顏色,在具有不同碎片的着色器單元中(例如30,33)?

喜歡的東西gl_FragColor(VEC2(29,32))= vec4(1.0,1.0,1.0,1.0); ?

回答

2

不,這是不可能的。爲特定位置的特定片段調用片段着色器,並且只能輸出此特定片段的值(或排除整個片段),然後將其寫入幀緩衝區中恰好在該預定片段位置處。

您可以做的不是將您的輸出寫入幀緩衝區,而是寫入其他存儲器,可以是任意圖像(使用image load/store)或shader storage buffer。但是這兩個功能需要相當先進的硬件功能(GL 4+硬件)。在這種情況下,您也可以使用正確的compute shader(或實際計算框架,如CUDAOpenCL,如果您不需要任何其他OpenGL功能)完成整個任務。


另一種方式,也適用於舊的硬件是做你的東西在頂點着色器,而不是片段着色器。這樣您就可以相應地計算頂點的剪輯空間位置(然後轉換爲片段位置)。當使用幾何着色器而不是頂點着色器時,甚至可以分散數據(爲單個輸入計算多個輸出)或丟棄東西。

2

正如Christian所說,這是不可能的;如果可以使用它,計算框架或映像加載/存儲是切換到的最佳選擇。

如果必須使用GLSL沒有圖像加載/存儲,你有一個選擇:如果您的圖像有N個像素總量,然後再發送n個頂點頂點着色器爲點;在頂點着色器中,從基於gl_VertexID的紋理中讀取(在GLSL 1.10中可用,如果您有1.40+,則應該使用instancing和gl_InstanceID代替),然後定位該點以便當它進入片段着色器時,它完全覆蓋你想要的像素。然後只要像素着色器輸出爲白色即可。

它一劈,但它可以正常工作,如果你沒有其他選擇。

相關問題