着色代码 shaders (TODO)

注意

本部分与 manim 入门的关联不算很大,因为涉及到大量的 OpenGL Shading Language 的成分,主要用于图形的上色。

有能力的读者,可以先下面的网站学习一下

由于笔者的能力有限,如果发现文档中有任何错误或不当之处,欢迎来 manim-kindergarten 提交 pull request

set_color_by_code

该方法为 Mobject 的成员函数

也许你会用到这个方法来进行上色,这里仅给出一些提示,详细的教程请自行学习 glsl.

glsl 中的变量

  • vec4 color : 颜色,rgba的范围均为 [0.0, 1.0]

    • float r : 红色

    • float g : 绿色

    • float b : 蓝色

    • float a : 透明度

  • vec3 points : 三维坐标

    • float x

    • float y

    • float z

  • vec3 unit_normal : 单位法线

  • vec3 light_coords : 光源坐标

  • float reflectiveness : 反光度(光源照射到的地方会更亮)

  • float gloss : 光泽(由物件反射到相机的光)

  • float shadow : 阴影

下面的代码可以将一个正方形从左到右渐变上色

class TestGlsl(Scene):
    def construct(self):
        square = Square(side_length=4)
        square.set_color_by_code(f"""
            vec3 blue = vec3{tuple(hex_to_rgb(BLUE))};
            vec3 red = vec3{tuple(hex_to_rgb(RED))};
            color.rgb = mix(blue, red, (point.x + 1.5) / 3);
        """)
        self.add(square)

        # hex_to_rgb 会将 16 进制颜色字符串转变为 RGB 三元列表,其值范围均为 [0,1]
        # 利用 tuple 将它们用圆括号括起来,翻译后的字符串就变为(这里仅展示一部分)
        # vec3 blue = vec3(0.345, 0.769, 0.867);