我使用krita的主要目的就是程序化生成纹理。
在https://docs.krita.org/zh_CN/tutorials/seexpr.html中提到:
SeExpr 是由迪士尼动画工作室设计开发的一种可嵌入的表达式语言,它让宿主应用程序可以按照脚本定义动态生成图案。皮克斯动画工作室在 RenderMan 文档 中将它称作“可通过脚本编程的图案生成器与组合器”。
Krita 在填充图层中提供了使用 SeExpr 的模式。
然而,搜遍内外网,教程寥寥无几,而且还不是专供krita的。很多地方的用法并不兼容!
今摸索一天,总算略微入门。记录下来备忘。
1.它是个表达式语言,没有循环语句(但有条件语句)。但并不是没有循环,而是整个程序都在循环中。因为像素很多,它默认认为,图像上的每个点都要处理一遍,所以程序里的表达式默认会循环。类似sql里面select。这样的说法大概不准确,以后再订正吧。
2.$符号是参数的开头。$u,$v,$w,$h等是系统自带参数(全局参数),不要给他们赋值,他们自己有值。u,v是纹理的相对坐标。w,h是图片的宽高。u,v的值是0~1。默认是正方形的。为了,能和图片的宽高匹配,通常会让v乘以h/w。可见u是默认和w对齐的。当然正方形的图片是看不出区别的。原点在左上角。
3.自定义参数(局部参数)在赋值后,似乎可以不带$号使用。但不确定所有地方都可以。如果给的值是数字,会在软件界面出现一个滑动条,方便拖动。井号是注释符,但是如果跟在常数参数赋值后面,可以定义滑动条的取值范围。例如
$a = 0.5 #0,2
就是让滑动条取值范围是0到2。
特别注意,他有整型和浮点的区别,如果滑动条拖不动,在赋值的整数后面加个.0就变成浮点数了。
4.解释一个具体的例子吧:
$u = u-0.5;
$v = v-0.5;
$a = (u*u+v*v)*5;
$d=0.5;
$color = ccurve($a,d-0.01,[1,1,1],4,d,[0,0,0],4,d+0.01,[1,1,1],4);
$color
以上是完整程序。输入进软件后我们将看到一个白底黑线的圆。
前两行是为了给图形移动位置,因为原点在左上角,uv的取值范围在0到1,减0.5后可以将图形移动到uv的中心。
第三行$a是自定义参数。而后面的u*u+v*v可以理解为0=x^2+y^2也就是圆形的函数式。乘以5是为了缩小,至于为什么是乘以而不是除以还没弄懂,也不知道取值范围是多少。不过可以看着来。
第4行$d是自定义参数。为了方便第5行上色使用。
第5行ccurve是填色函数。参数解释如下:$a是需要被填色的函数。从第二个函数起,每三个为一组。每组第一个是渐变条上颜色点的位置,范围是0~1。第二个参数是数组,里面的三个数是RGB颜色。每个通道是0~1。也就是说[1,1,1]是白色。[0,0,0]是黑色。第三个意义不明,据说是渐变的方式。这里用不到。我给了三个色点,也就是三组参数,是白黑白,其中d是线在渐变中的位置,而d+0.01和d-0.01是线的宽度,如果把数改大线会变宽,也会变模糊,因为这是渐变方式填色。可以用4组参数来定义线条,避免线条变模糊,也就是两组定义一个边缘。
如果删掉第三组参数,则图形会变成外黑内白的圆形。这说明渐变的0点是和原点对应的(uv0.5的位置)。
第六行$color是默认的结尾,必须用它结尾。
好的,到这里,我们主要修改第三行就可画出不同的函数图形了。
$uv = u+v;并把d改成0,可以得到一条穿过中心的45°斜线。$uv = u*u+v;是抛物线。如果线太粗了。加一行uv *= 5;就可以变细。
在https://docs.krita.org/zh_CN/tutorials/seexpr.html中提到:
SeExpr 是由迪士尼动画工作室设计开发的一种可嵌入的表达式语言,它让宿主应用程序可以按照脚本定义动态生成图案。皮克斯动画工作室在 RenderMan 文档 中将它称作“可通过脚本编程的图案生成器与组合器”。
Krita 在填充图层中提供了使用 SeExpr 的模式。
然而,搜遍内外网,教程寥寥无几,而且还不是专供krita的。很多地方的用法并不兼容!
今摸索一天,总算略微入门。记录下来备忘。
1.它是个表达式语言,没有循环语句(但有条件语句)。但并不是没有循环,而是整个程序都在循环中。因为像素很多,它默认认为,图像上的每个点都要处理一遍,所以程序里的表达式默认会循环。类似sql里面select。这样的说法大概不准确,以后再订正吧。
2.$符号是参数的开头。$u,$v,$w,$h等是系统自带参数(全局参数),不要给他们赋值,他们自己有值。u,v是纹理的相对坐标。w,h是图片的宽高。u,v的值是0~1。默认是正方形的。为了,能和图片的宽高匹配,通常会让v乘以h/w。可见u是默认和w对齐的。当然正方形的图片是看不出区别的。原点在左上角。
3.自定义参数(局部参数)在赋值后,似乎可以不带$号使用。但不确定所有地方都可以。如果给的值是数字,会在软件界面出现一个滑动条,方便拖动。井号是注释符,但是如果跟在常数参数赋值后面,可以定义滑动条的取值范围。例如
$a = 0.5 #0,2
就是让滑动条取值范围是0到2。
特别注意,他有整型和浮点的区别,如果滑动条拖不动,在赋值的整数后面加个.0就变成浮点数了。
4.解释一个具体的例子吧:
$u = u-0.5;
$v = v-0.5;
$a = (u*u+v*v)*5;
$d=0.5;
$color = ccurve($a,d-0.01,[1,1,1],4,d,[0,0,0],4,d+0.01,[1,1,1],4);
$color
以上是完整程序。输入进软件后我们将看到一个白底黑线的圆。
前两行是为了给图形移动位置,因为原点在左上角,uv的取值范围在0到1,减0.5后可以将图形移动到uv的中心。
第三行$a是自定义参数。而后面的u*u+v*v可以理解为0=x^2+y^2也就是圆形的函数式。乘以5是为了缩小,至于为什么是乘以而不是除以还没弄懂,也不知道取值范围是多少。不过可以看着来。
第4行$d是自定义参数。为了方便第5行上色使用。
第5行ccurve是填色函数。参数解释如下:$a是需要被填色的函数。从第二个函数起,每三个为一组。每组第一个是渐变条上颜色点的位置,范围是0~1。第二个参数是数组,里面的三个数是RGB颜色。每个通道是0~1。也就是说[1,1,1]是白色。[0,0,0]是黑色。第三个意义不明,据说是渐变的方式。这里用不到。我给了三个色点,也就是三组参数,是白黑白,其中d是线在渐变中的位置,而d+0.01和d-0.01是线的宽度,如果把数改大线会变宽,也会变模糊,因为这是渐变方式填色。可以用4组参数来定义线条,避免线条变模糊,也就是两组定义一个边缘。
如果删掉第三组参数,则图形会变成外黑内白的圆形。这说明渐变的0点是和原点对应的(uv0.5的位置)。
第六行$color是默认的结尾,必须用它结尾。
好的,到这里,我们主要修改第三行就可画出不同的函数图形了。
$uv = u+v;并把d改成0,可以得到一条穿过中心的45°斜线。$uv = u*u+v;是抛物线。如果线太粗了。加一行uv *= 5;就可以变细。