首先的问题是网上没有小型的C/C++开源材质节点编辑器的工程,Unity到是有,不过因为是C#又是CG可能不是太具有代表性,实际上分析后发现和C/C++ GLSL还是C# CG应该没什么区别。
参考的代码有blender2.79,C代码,GLSL语言
以及Unity插件ShaderForge 1.38和Amplify Shader Editor 1.4.5,C#代码,CG语言
知乎有篇文章简单提了一点,没有什么干货,当个娱乐性前言读读还行。
https://www.zhihu.com/question/35106026
实际上通过跟踪以上3个源码,思路基本相同,首先定义节点Node,有各种乱七八糟的属性,然后在编译新shader的时候,只编译那些连到主输出out的活跃(active)节点就行了,不活跃的可能只是保存到注释或什么地方,不参与编译。
之后就是根据当前所有有效节点,生成对应shader代码的过程了,都是硬编码,没什么难度就是体力活。Unity的简单点调用API,GLSL自己重新编译一遍glShaderSource,glCompileShader
blender\source\blender\gpu\intern\gpu_codegen.c
GPU_generate_pass函数
fragmentcode = code_generate_fragment(nodes, outlink->output); vertexcode = code_generate_vertex(nodes, type); geometrycode = code_generate_geometry(nodes, use_opensubdiv);
接着跟GPU_shader_create_ex函数进去看就懂了
可以自己加两句代码,直接编译新shader时把glsl保存到文件就行了,加个序号,可供其他程序使用。
不过感觉没啥必要,因为shader代码都差不多,随便调个效果用啥着色语言写都一样
去年就想搞这个东西,但是昨天到今天花了一天时间看懂大概原理后就失去了兴趣,懒得动手写了,唉……感觉已经变成习惯吃现成的废人了……