graphics.defineEffect()

类型 函数
graphics.*
返回值
修订版 版本 2024.3703
关键字 着色器、效果、图形
另请参见 自定义着色器效果 (指南)
过滤器/生成器/合成器 (指南)
customFilter (示例)

概览

此函数允许你扩展 Corona 然后定义自定义着色器效果。你的自定义效果可以定义顶点内核或片段内核(或两者)。这些内核类似于着色器,只不过它们必须定义具有特定名称且符合特定函数特征的函数。

有关如何为此内核编写着色器代码的详细说明,请参阅 自定义着色器效果 指南。

注意

自定义效果在 iOS、Android、macOS 台式机和 Win32 台式机上受支持。

语法

graphics.defineEffect( effect )
effect (必填)

Table. 定义着色器效果的表 — 有关详细信息,请参阅下一部分。

效果表参考

effect 表可包含以下属性

category (必填)

String. 效果的类别。这决定了输入纹理的数量

  • "generator" — 假设有 0 个输入纹理。
  • "filter" — 假设有 1 个输入纹理。
  • "composite" — 假设有 2 个输入纹理。
group (可选)

String. 效果所属组的名称。虽然 内置 效果没有名称,但自定义效果默认情况下放在 "custom" 组中。你可以通过传入不同的组名称来覆盖此默认设置。

name (必填)

String. 在类别中唯一标识效果的名称。在给定的类别和组中,这不可与预先存在的冲突。它与 category 属性和 group 属性一起,确定了你分配给 Paint 对象的效果的完整名称,如下所示"<category>.<group>.<name>".

fragment (必填)

String. 片段内核的着色器代码。请参阅 自定义着色器效果 指南中的片段内核。请注意,如果设置了 vertex 属性,则不需要此代码。

vertex (必填)

字符串. 顶点核中的着色器代码。在 自定义着色器效果 指南中,请参阅顶点核。请注意,如果设置了 fragment 属性,不需要 此项。

isTimeDependent (可选)

布尔值. 如果顶点或片段核针对时间(输出会随着时间而变化),请将其设置为 true。默认(如果未提供)假定值为 false,这意味着内核不会在其计算中使用时间。

timeTransform (可选)

. 如果顶点或片段核针对时间,可使用此项来减轻潜在的较大时间值。在 自定义着色器效果 指南中,请参阅时间转换

vertexData (可选)

. 允许为效果指定命名参数。可以最多指定四个参数,每个参数都是 标量(浮点数)。有关详细信息,请参阅 自定义着色器效果 指南中的效果参数。请注意,可以指定 vertexDatauniformData,但不能同时指定这两个参数。

uniformData (可选)

. 允许为效果指定命名参数。可以最多指定四个参数,每个参数可以是不同类型: 标量(浮点数)、vec2 vec3vec4mat3mat4。有关详细信息,请参阅 自定义着色器效果 指南中的效果参数。请注意,可以指定 vertexDatauniformData,但不能同时指定这两个参数。

示例

-- An effect that brightens each pixel
-- Usage: object.fill.effect = "filter.custom.myBrighten"
local kernel = {}
kernel.category = "filter"
kernel.name = "myBrighten"

kernel.fragment =
[[
P_COLOR vec4 FragmentKernel( P_UV vec2 texCoord )
{
    P_COLOR float brightness = 0.5;
    P_COLOR vec4 texColor = texture2D( CoronaSampler0, texCoord );

    // Pre-multiply the alpha to brightness
    brightness = brightness * texColor.a;

    // Add the brightness
    texColor.rgb += brightness;

    // Modulate by the display object's combined alpha/tint
    return CoronaColorScale( result );
}
]]

graphics.defineEffect( kernel )