ios - 使用 SKShader 修改单个像素

标签 ios swift

我正在尝试为我正在开发的应用程序编写一个片段着色器。我将我的制服传递到可以工作的着色器中,但它适用于整个对象。我希望能够逐个像素地修改对象。所以我现在的代码是....

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 似乎不允许这样做。

感谢您提前提供帮助。

最佳答案

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

虽然理论上您可以将一组值传递到着色器中,代表每个像素的颜色,但这在本质上与传递图像(或只是在 Sprite 上设置纹理图像)相同......在这一点上你是在白白使用着色器。

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

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


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

关于ios - 使用 SKShader 修改单个像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34639945/

相关文章:

ios - 将捕获的图像添加到下一个 View Swift 3 Xcode 8

ios - 在不同的 cell nibs 中显示 2 组 Firebase 数据

swift - 使用 double 对 UITableView 进行排序

ios - 如何使用 swift 在 ios 应用程序中集成 Firebase?

ios - SDK 'Application' 中的产品类型 'iOS 6.0' 需要代码签名

ios - 通过 LinkedIn 共享带等号的链接的问题

ios - 快速错误中的重载函数

ios - 在 stackview 中隐藏按钮会破坏 tableview 中的布局

ios - Swift 的编码/解码枚举 (Xcode 6.1)

ios - 无法让 S3 上传在 Xcode 10.2/Swift 中工作