frame_effect

class janim.items.effect.frame_effect.AppliedGroup(*items: Item, root_only: bool = False, **kwargs)

基类:Item

FrameEffect 等类的基础类

提供了 apply()discard() 方法用于标记对指定的物件 应用/取消应用 效果

add(*objs, prepend=False, insert=None) Self

警告

调用 add() 很可能不会按预期工作

如果你想应用额外的物件,需要使用 apply()

remove(*objs) Self

警告

调用 remove() 很可能不会按预期工作

如果你想应用额外的物件,需要使用 discard()

apply(*items: Item, root_only: bool = False) Self

对更多物件应用效果

discard(*items: Item, root_only: bool = False) Self

对指定物件的取消应用效果

class janim.items.effect.frame_effect.FrameEffect(*items: Item, fragment_shader: str, cache_key: str | None = None, root_only: bool = False, **kwargs)

基类:AppliedGroup

将传入的着色器 fragment_shader 应用到 items

着色器基本格式:

#version 330 core

in vec2 v_texcoord; // 传入的纹理坐标
out vec4 f_color;   // 输出的颜色

#[JA_FINISH_UP_UNIFORMS]

void main()
{
    // 进行处理,例如
    f_color = frame_texture(v_texcoord);    // 注意:需要用 frame_texture 读取纹理颜色(即 items 的渲染结果)
    f_color.rgb = 1.0 - f_color.rgb;        // 反色

    #[JA_FINISH_UP]
}

其中 #[JA_FINISH_UP] 是一个占位符,JAnim 会在这里做一些额外的操作,前面的 #[JA_FINISH_UP_UNIFORMS] 与之对应

上述代码最核心的是 main 中“进行处理”的部分,其余的代码作为固定的写法照抄即可

如果懒得抄,可以用 SimpleFrameEffect,这个类只要写“进行处理”这部分就好了,因为它把其余代码都封装了

完整示例请参考 基础样例 中的对应代码

renderer_cls

FrameEffectRenderer 的别名

apply_uniforms(*, optional: bool = False, **kwargs) None
dynamic_uniforms() dict
class janim.items.effect.frame_effect.SimpleFrameEffect(*items: Item, shader: str, uniforms: Iterable[str] = [], cache_key: str | None = None, root_only: bool = False, **kwargs)

基类:FrameEffect

FrameEffect 的简化封装,具体请参考 FrameEffect 中的说明

备注

如果该着色器代码中出现报错,会显示为 JA_SIMPLE_FRAMEEFFECT_SHADER 中出现的