Skip to content

Malt插件和自定义节点

插件

Malt主要是通过插件添加自定义节点的

  • github下载示例插件PluginExample

  • 新建一个Malt_Plugin文件夹,将示例插件PluginExample文件放到里面

图片
  • 打开Malt,在插件设置中添加插件路径,如图所示

注意

输入的路径应该是PluginExample所在的上一级目录Malt_Plugin,不要把PluginExample也加到路径里去了

图片
  • 保存插件设置,重启blender (1) ,现在你应该可以在节点添加菜单中看到新的节点

    1. 或者使用渲染管线旁的刷新按钮

注意

如果插件中添加了新的文件,需要重启渲染器才能读取

自定义节点

PluginExample复制一份,修改一下文件夹名字如MyPlugin

打开文件夹中的__init__.py,这个文件,修改为:

__init__.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import os
from Malt.PipelinePlugin import PipelinePlugin, isinstance_str

class MyShader(PipelinePlugin):

    @classmethod
    def poll_pipeline(self, pipeline):
        return isinstance_str(pipeline, "NPR_Pipeline")

    @classmethod
    def register_graph_libraries(self, graphs):
        library_path = os.path.join(os.path.dirname(__file__), "Shaders")
        for graph in graphs.values():
            if graph.language == "GLSL":
                graph.add_library(library_path)
PLUGIN = MyShader
主要就是改了一下类名,这个文件的作用就是把插件里Shaders文件夹里的glsl文件添加到渲染管线中

在Shaders文件夹下新建一个my_shader.glsl文件,删掉原本的PluginExample.glsl

添加以下代码:

my_shader.glsl
1
2
3
4
5
6
7
8
/* META
@edge0: subtype=Slider;default=0.0;min=0.0;max=1.0;
@edge1: subtype=Slider;default=1.0;min=0.0;max=1.0;
*/
void my_smoothstep( in float x,in float edge0, in float edge1, out float result) {
    result = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);
    result = result * result * (3.0 - 2.0 * result);
}

按下ctrl+S(1)保存文件后你的blender应该会卡一下,然后你应该就能看到新加的节点

  1. 第一次需要重启渲染器
图片
自定义的节点

因为Malt没有自带SmoothStep这个节点,所以我们自己做一个

1
2
3
4
/* META
@edge0: subtype=Slider;default=0.0;min=0.0;max=1.0;
@edge1: subtype=Slider;default=1.0;min=0.0;max=1.0;
*/
META表示元信息,主要用来定义接口的默认值,最大值最小值等

注意

META 部分的格式一定要写正确,有错误的话虽然能看到节点,但是可能会有稀奇古怪的问题

如果出现奇怪的问题可以删掉META再测试一下

函数一般使用inout关键字定义输入输出接口,返回空void

如果只有一个返回值也可以直接返回

1
2
3
4
5
6
float my_smoothstep(float x,float edge0, float edge1) {
    float result;
    result = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);
    result = result * result * (3.0 - 2.0 * result);
    return result;
}

至于这个SmoothStep函数要怎么写,直接网上毛一个过来就行了,或者叫ai写一个

override覆盖参数

如果想让使用同一个Shader的材质,拥有不同的参数效果该怎么办,就要需要用到参数覆盖了

点击任意一个节点,可以看到N面板节点选项卡中的属性右边有一个小眼睛的图标

打开眼睛图标的参数就会在材质面板显示出来,在材质面板中勾选属性右边的,就可以为每一个材质单独设置参数

像是贴图参数等每个材质都不一样,就可以显示在材质面板中

图片
自定义的节点

数据类型

Malt节点中不同的数据类型会自动隐式转换

详细参考Malt数据类型

  • 布尔型:bool
  • 浮点型:float
  • 整数型:int
  • 无符号整数型:uint
  • 二维向量:vec2
  • 三维向量:vec3
  • 四维向量:vec4
  • 布尔矢量:bvec(n)
  • 整数矢量:ivec(n)
  • 无符号整数矢量:uvec(n)
  • 4*4矩阵mat4
  • 一维纹理sampler1D
  • 二维纹理sampler2D
  • 包含int值的(n)纹理isampler(n)D
  • 包含uint值的(n)纹理usampler(n)D
  • 结构体:struct
  • 数组:array(size)

其他

内置节点的GLSL在 插件文件夹\BlenderMalt\.MaltPath\Malt\Shaders

内置的变量可以查看插件文件夹\BlenderMalt\.MaltPath\Malt\Shaders\Node Utils 2\Input.glsl文件,里面有一些关键字可以使用

比如POSITION,NORMAL,view_direction()等,可以直接在函数中使用,也可以在META中设置为默认值:

1
2
3
4
5
6
7
8
9
/* META
@position: default=POSITION;
@normal: default=NORMAL;
@view_direction: default=view_direction();
*/
void example(in vec3 position, in vec3 normal, in vec3 view_direction, out vec4 color)
{
    color = vec4(position, 1.0);
}
图片
这里可以显示隐藏的节点

其他插件

制作法向外扩描边的插件

透明层插件