ios – 在Interface Builder(Xcode)中使用Shadertoy的着色器

概述我正在尝试使用精灵工具包在Interface Builder中查看着色器的样子,并希望在 ShaderToy处使用一些着色器.为此,我创建了一个“shader.fsh”文件,一个场景文件,并添加了一个将sprite颜色sprite到场景,给它一个自定义着色器(shader.fsh) 虽然非常基本的着色器似乎有效: void main() { gl_FragColor = vec4(0.0, 我正在尝试使用精灵工具包在Interface Builder中查看着色器的样子,并希望在 ShaderToy处使用一些着色器.为此,我创建了一个“shader.fsh”文件,一个场景文件,并添加了一个将sprite颜色sprite到场景,给它一个自定义着色器(shader.fsh)

虽然非常基本的着色器似乎有效:

voID main() {    gl_Fragcolor = vec4(0.0,1.0,0.0,1.0);}

我尝试从17000转换着色器的任何尝试都会导致Xcode在尝试渲染它们时冻结(旋转彩球).

我正在使用的着色器是this one:

#define M_PI 3.1415926535897932384626433832795float rand(vec2 co){    return fract(sin(dot(co.xy,vec2(12.9898,78.233))) * 43758.5453);}voID mainImage( out vec4 fragcolor,in vec2 fragCoord ){    float size = 30.0;    float prob = 0.95;    vec2 pos = floor(1.0 / size * fragCoord.xy);    float color = 0.0;    float starValue = rand(pos);    if (starValue > prob)    {        vec2 center = size * pos + vec2(size,size) * 0.5;        float t = 0.9 + 0.2 * sin(iGlobalTime + (starValue - prob) / (1.0 - prob) * 45.0);        color = 1.0 - distance(fragCoord.xy,center) / (0.5 * size);        color = color * t / (abs(fragCoord.y - center.y)) * t / (abs(fragCoord.x - center.x));    }    else if (rand(fragCoord.xy / iResolution.xy) > 0.996)    {        float r = rand(fragCoord.xy);        color = r * (0.25 * sin(iGlobalTime * (r * 5.0) + 720.0 * r) + 0.75);    }    fragcolor = vec4(vec3(color),1.0);}

我试过了:

>用main(voID)替换mainImage()(以便调用它)
>用相关变量替换iXxxxx变量(iGlobalTime,iResolution)和fragCoord变量(基于建议here)
>更换一些变量(iGlobalTime)……

将mainImage更改为main()并交换变量使其在TinyShading实时测试器应用程序中无错误地运行 – 结果在Xcode(旋转球,冻结)中始终相同.这里的任何建议都会有所帮助,因为目前有关该主题的信息量非常少.

解决方法 我设法使用 SKShader在SpriteKit中使用它.我已经能够渲染ShaderToy的每个着色器,这是迄今为止我尝试过的.唯一的例外是您必须使用iMouse删除任何代码,因为iOS中没有鼠标.我做了以下……

1)将ShaderToy中的mainImage函数声明更改为…

voID main(voID) {    ...}

ShaderToy mainImage函数有一个名为fragCoord的输入.在iOS中,这是全局可用的gl_FragCoord,因此您的主要功能不再需要任何输入.

2)执行全部替换以将以下内容从ShaderToy名称更改为其iOS名称…

> fragCoord成为gl_FragCoord
> fragcolor变为gl_Fragcolor
> iGlobalTime成为u_time

注意:还有更多我还没有遇到过.我会像我一样更新

3)提供iResolution稍微复杂一点……

iResolution是视口大小(以像素为单位),可转换为SpriteKit中的精灵大小.这曾经在iOS中以u_sprite_size的形式提供,但已被删除.幸运的是,Apple提供了一个很好的例子,说明如何使用SKShader documentation中的uniforms将它注入到着色器中.

但是,如ShaderToy的Shader inputs部分所述,iResolution的类型是vec3(x,y和z),而不是u_sprite_size,它是vec2(x和y).我还没有看到使用iResolution的z值的单个ShaderToy.因此,我们可以简单地使用零值的z值.我修改了Apple文档中的示例,为我的着色器提供类型为vec3的iResolution,如此…

let uniformBasedShader = SKShader(filenamed: "YourShader.fsh")let sprite = SKSpriteNode()sprite.shader = uniformBasedShader       let Spritesize = vector_float3(    float(sprite.frame.size.wIDth),// x                     float(sprite.frame.size.height),// y    float(0.0)                       // z - never used)uniformBasedShader.uniforms = [        SKUniform(name: "iResolution",vectorfloat3: Spritesize)]

而已 :)

总结

以上是内存溢出为你收集整理的ios – 在Interface Builder(Xcode)中使用Shadertoy的着色器全部内容,希望文章能够帮你解决ios – 在Interface Builder(Xcode)中使用Shadertoy的着色器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1058789.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存