着色代码 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);