Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用SKShader修改单个像素_Ios_Swift - Fatal编程技术网

Ios 使用SKShader修改单个像素

Ios 使用SKShader修改单个像素,ios,swift,Ios,Swift,我正在尝试为我正在使用的应用程序编写片段着色器。我将我的制服传递到着色器中,该着色器对整个对象有效。我想能够修改对象像素的像素。所以我现在的代码是 let shader = SKShader( fileNamed: "Shader.fsh" ); shader.addUniform( SKUniform( name: "value", float: 1.0 ) ); m_image.shader = shader; 在这里,所有像素的统一“值”都是相同的。但是,例如,假设我想在绘制一定数量的像

我正在尝试为我正在使用的应用程序编写片段着色器。我将我的制服传递到着色器中,该着色器对整个对象有效。我想能够修改对象像素的像素。所以我现在的代码是

let shader = SKShader( fileNamed: "Shader.fsh" );
shader.addUniform( SKUniform( name: "value", float: 1.0 ) );
m_image.shader = shader;
在这里,所有像素的统一“值”都是相同的。但是,例如,假设我想在绘制一定数量的像素后将“value”更改为“0.0”。例如

shader.addUniform( SKUniform( name: "value", float: 1.0 ) );
// 100 pixels are drawn
shader.addUniform( SKUniform( name: "value", float: 0.0 ) );
这在SKShader中是可能的吗?是否必须在着色器源中执行此操作

我想到的一个想法是使用阵列统一,但似乎SKShader不允许这样做

感谢你的帮助就是进步。

一般来说,统一一词的意思是不变的——在所有情况下都是一样的。这就是着色器统一的方式:即使着色器代码对渲染图像中的每个像素独立(并行)运行,输入到着色器的统一变量的值在所有像素上都是相同的

虽然从理论上讲,可以将一组值传递到着色器中,表示每个像素的颜色,但这与传递图像(或只是在精灵上设置纹理图像)基本相同。。。在这一点上,您使用的着色器是徒劳的

相反,您通常希望您的GLSL(ish*)代码,如果它根据像素位置执行任何操作,则找出它写入的像素坐标,并根据该坐标计算结果。在
SKShader
的着色器中,可以从
vec2 v_tex_coord
着色器变量获取像素坐标

(看起来像是一个不错的教程(带有指向其他人的链接)用于开始使用SpriteKit着色器。如果您使用像素着色器或寻求帮助,您会发现可以重用的想法和算法,但它们找到当前输出像素的方式会有所不同。在SpriteKit着色器中,您通常可以安全地将
gl_FragCoord
替换为
v_tex_coord



*
SKShader
本身并不使用实际的GLSL,它实际上使用GLSL的一个子集,该子集会自动转换为适用于所用设备/渲染器的GPU代码。

好的,这很有用。我现在遇到的问题是,我有任意数量的“值”,每次调用render时都会更改。有没有办法使用SKShader使数组一致?没有,请参阅SKUniformType了解SKShader可用的一致类型。另请参阅iOS 10/macOS 10.12/etc中介绍的SKAttribute(在此处原始问答之后)。它控制将数据获取到着色器的另一种方式,这种方式可以以不同的方式变化。