将 Core Image Kernel Language 函数转换为 Metal Shading Language
Convert Core Image Kernel Language function to Metal Shading Language
我在 Core Image Kernel Language 中有以下函数,我需要 Metal Shading Language 中的等效函数,但我在使用 destCoord 、unpremultiply 和 premultiply 函数时遇到问题。
kernel vec4 MyFunc(sampler src, __color color, float distance, float slope) {
vec4 t;
float d;
d = destCoord().y * slope + distance;
t = unpremultiply(sample(src, samplerCoord(src)));
t = (t - d*color) / (1.0-d);
return premultiply(t);
}
到目前为止,我在 MSL 中的功能是:
float4 MyFunc(sample_t image, float3 color, float dist, float slope) {
float4 t;
float d;
d = color[1] * slope + dist
...
return t;
}
如有任何帮助,我们将不胜感激!
这应该有效:
float4 MyFunc(sampler src, float4 color, float dist, float slope, destination dest) {
const float d = dest.coord().y * slope + dist;
float4 t = unpremultiply(src.sample(src.coord()));
t = (t - d * color) / (1.0 - d);
return premultiply(t);
}
注意 destination
参数。这是内核的一个可选的最后一个参数,它使您可以访问有关渲染目标的信息(例如您正在渲染到的目标坐标 space 中的坐标)。调用 CIKernel
时无需为此传递任何内容,Core Image 将自动填充它。
由于您只是在当前位置对输入 src
进行采样,因此您还可以将内核优化为 CIColorKernel
。这些内核具有 1:1 输入到输出像素的映射。它们可以由 Core Image 运行时连接起来。内核代码如下所示:
float4 MyFunc(sample_t src, float4 color, float dist, float slope, destination dest) {
const float d = dest.coord().y * slope + dist;
float4 t = unpremultiply(src);
t = (t - d * color) / (1.0 - d);
return premultiply(t);
}
注意 sample_t
(基本上是 float4
)与 sampler
.
我在 Core Image Kernel Language 中有以下函数,我需要 Metal Shading Language 中的等效函数,但我在使用 destCoord 、unpremultiply 和 premultiply 函数时遇到问题。
kernel vec4 MyFunc(sampler src, __color color, float distance, float slope) {
vec4 t;
float d;
d = destCoord().y * slope + distance;
t = unpremultiply(sample(src, samplerCoord(src)));
t = (t - d*color) / (1.0-d);
return premultiply(t);
}
到目前为止,我在 MSL 中的功能是:
float4 MyFunc(sample_t image, float3 color, float dist, float slope) {
float4 t;
float d;
d = color[1] * slope + dist
...
return t;
}
如有任何帮助,我们将不胜感激!
这应该有效:
float4 MyFunc(sampler src, float4 color, float dist, float slope, destination dest) {
const float d = dest.coord().y * slope + dist;
float4 t = unpremultiply(src.sample(src.coord()));
t = (t - d * color) / (1.0 - d);
return premultiply(t);
}
注意 destination
参数。这是内核的一个可选的最后一个参数,它使您可以访问有关渲染目标的信息(例如您正在渲染到的目标坐标 space 中的坐标)。调用 CIKernel
时无需为此传递任何内容,Core Image 将自动填充它。
由于您只是在当前位置对输入 src
进行采样,因此您还可以将内核优化为 CIColorKernel
。这些内核具有 1:1 输入到输出像素的映射。它们可以由 Core Image 运行时连接起来。内核代码如下所示:
float4 MyFunc(sample_t src, float4 color, float dist, float slope, destination dest) {
const float d = dest.coord().y * slope + dist;
float4 t = unpremultiply(src);
t = (t - d * color) / (1.0 - d);
return premultiply(t);
}
注意 sample_t
(基本上是 float4
)与 sampler
.