【问题标题】:How to write in a new shader file in SceneKit: consecutive statements on a line must be separated by ;?如何在 SceneKit 中写入新的着色器文件:一行上的连续语句必须用 ; 分隔?
【发布时间】:2015-05-18 22:42:07
【问题描述】:

我从 SceneKit 和着色器开始,我创建了一个 swift 文件,将其名称更改为 myFragment.shader,然后添加了这个:

uniform sampler2D RTBlurH; // this should hold the texture rendered by the horizontal blur pass
varying vec2 vTexCoord;
const float blurSize = 1.0/512.0;

sum += texture2D(RTBlurH, vec2(vTexCoord.x, vTexCoord.y - 4.0*blurSize)) * 0.05;
sum += texture2D(RTBlurH, vec2(vTexCoord.x, vTexCoord.y - 3.0*blurSize)) * 0.09;
sum += texture2D(RTBlurH, vec2(vTexCoord.x, vTexCoord.y - 2.0*blurSize)) * 0.12;
sum += texture2D(RTBlurH, vec2(vTexCoord.x, vTexCoord.y - blurSize)) * 0.15;
sum += texture2D(RTBlurH, vec2(vTexCoord.x, vTexCoord.y)) * 0.16;
sum += texture2D(RTBlurH, vec2(vTexCoord.x, vTexCoord.y + blurSize)) * 0.15;
sum += texture2D(RTBlurH, vec2(vTexCoord.x, vTexCoord.y + 2.0*blurSize)) * 0.12;
sum += texture2D(RTBlurH, vec2(vTexCoord.x, vTexCoord.y + 3.0*blurSize)) * 0.09;
sum += texture2D(RTBlurH, vec2(vTexCoord.x, vTexCoord.y + 4.0*blurSize)) * 0.05;

gl_FragColor = sum;

来自模糊教程here

但我在前 3 行出现 3 个错误:它要求我添加 ;

我不明白这个问题。

谢谢

【问题讨论】:

  • 顺便说一句,这是在移动 GPU 上进行模糊的一种非常糟糕的方法。每个片段 8 次依赖纹理读取会影响您在某些设备上的性能(并且只会影响其他设备)。 Here's a good writeup 在移动 GPU 上进行模糊处理。另请注意,在 SceneKit 中,您只需将 Core Image 过滤器分配给节点并让 Apple 处理模糊实现。

标签: ios compiler-errors shader scenekit


【解决方案1】:

我创建了一个 swift 文件,将其名称更改为 myFragment.shader

那是你的问题。

当您将文件添加到项目时,Xcode 会根据文件的类型确定在构建时如何处理该文件。如果您创建一个 Swift 文件,它将使用 Swift 编译器对其进行编译。 (而且 Swift 编译器会期望该文件的内容是用 Swift 编写的,而不是 GLSL。)

您不希望将着色器编译为本机 (CPU) 源。着色器在您的应用运行时由 OpenGL 编译(用于 GPU),因此您只需将它们复制到您的包中并在准备好使用它们时将它们传递给 GL(在您的情况下是通过 SceneKit)。

当您重命名文件的类型扩展名时,项目中的文件处理规则不会自动更改。 (这是因为对于某些文件类型,您可以合理地使用与 Xcode 的默认值不同的扩展名。)因此,这里有两个针对两种不同上下文的修复:

更改现有文件的构建规则

对于您所拥有的,您可能不想重新创建项目的某些部分,您只想告诉 Xcode 将您的着色器视为着色器,而不是 Swift 源。在导航器中选择您的项目,转到 Build Phases,然后将 myFragment.shader 从 Compile Sources 移动到 Copy Bundle Resources。

使用正确的构建规则添加新文件

在创建新的着色器文件时可以避免上述情况。如果您使用 Empty 文件模板创建一个新文件,它已经被视为捆绑资源,因此您无需再做任何事情。

同样,如果您将 .shader.fsh.vsh(或其他任何非 Swift/C/ObjC/etc 源文件)拖到您的项目中,则将被视为捆绑包默认资源。

【讨论】:

    【解决方案2】:

    除了 rickster 的回答,请注意您可以使用 Xcode 中的文件检查器更改任何文件的类型:

    通过选择“OpenGL Shading Language source”,您将获得代码补全和正确的语法高亮显示。

    【讨论】:

    • 请注意,only 可以让您完成代码和语法高亮——您仍然需要正确设置构建规则才能将文件复制为捆绑资源而不是编译为 Swift/ C/随便。
    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    相关资源
    最近更新 更多