2016-01-06 95 views
0

我正在嘗試爲我正在編寫的應用程序編寫片段着色器。我將我的制服傳遞到着色器中,但它適用於整個對象。我希望能夠按像素修改對象像素。所以我現在的代碼是......使用SKShader修改單個像素

let shader = SKShader(fileNamed: "Shader.fsh"); 
shader.addUniform(SKUniform(name: "value", float: 1.0)); 
m_image.shader = shader; 

這裏統一的「值」對所有像素都是相同的。但是,例如,假設我想在繪製一定數量的像素之後將「值」更改爲「0.0」。因此,例如......

shader.addUniform(SKUniform(name: "value", float: 1.0)); 
// 100 pixels are drawn 
shader.addUniform(SKUniform(name: "value", float: 0.0)); 

這是甚至可能與SKShader?這是否需要在着色器源代碼中完成?

一個想法我想用一個數組均勻的,但它不會出現SKShader允許這樣做。

感謝您的幫助是提前。

回答

2

一般來說,統一意味着不變 - 在所有情況或情況下都是相同的。這就是着色器制服的方式:即使着色器代碼對渲染圖像中的每個像素獨立(並行)運行,輸入到着色器的統一變量的值在所有像素中都是相同的。在理論上,你可以將一個值的數組傳遞給代表每個像素的顏色的着色器,這與傳遞圖像(或者只是在精靈上設置紋理圖像)基本相同......在那指出你沒有使用着色器。

相反,你通常希望你的GLSL(ISH *)的代碼,如果它這樣做基於像素位置的任何東西,找出像素座標它的寫入和計算了基於該結果。在SKShader的着色器中,您可以從vec2 v_tex_coord着色器變量中獲取像素座標。

This看起來像一個體面的教程(鏈接到其他人)對SpriteKit着色器開始。如果按照這樣做與像素着色器很酷的東西幫助other tutorialsshader code libraries,你會發現想法和算法可以重複使用,但他們的方法找到當前輸出像素會有所不同。在對SpriteKit着色器,通常可以安全地v_tex_coord取代gl_FragCoord


* SKShader不使用實際GLSL本身,它實際上使用GLSL的一個子集,該子集自動轉換爲適當的GPU代碼e設備/渲染器正在使用中。

+0

好吧,這是很有幫助的。我現在遇到的問題是,我有任意數量的「值」,每次調用渲染時都會發生變化。有沒有辦法讓SKShader使數組統一起來? – CMilby

+0

不,請參閱SKUniformType瞭解SKShader提供的統一類型。 – Bobjt

+0

另請參見iOS 10/macOS 10.12/etc中引入的SKAttribute(此處爲原始問答之後)。這控制着另一種獲取數據到着色器的方式,它可以以不同的方式變化。 – rickster