材质节点编辑器实现简单分析

首先的问题是网上没有小型的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代码都差不多,随便调个效果用啥着色语言写都一样

去年就想搞这个东西,但是昨天到今天花了一天时间看懂大概原理后就失去了兴趣,懒得动手写了,唉……感觉已经变成习惯吃现成的废人了……

猜你喜欢

转载自www.cnblogs.com/kileyi/p/8991177.html