Godot中C#编写的ColorStepsNode自定义着色器节点不显示求助
自定义VisualShaderNodeCustom节点无法在Godot中显示的解决方案
问题情况
刚从Unity转用Godot,正在进行着色器开发,想要将复用性高的ExpressionNode转为VisualShaderNodeCustom,编写的ColorStepsNode放在res://addons/colorStepsNode/ColorStepsNode.cs路径下,但始终无法在着色器编辑器的“添加节点”列表中找到。
节点代码
using Godot; using Godot.Collections; [Tool] [GlobalClass] public partial class ColorStepsNode : VisualShaderNodeCustom { // *** GENERAL public override string _GetName() { return "ColorSteps"; } public override string _GetCategory() { return "Custom"; } public override string _GetDescription() { return "Converts float value between 0.0 and [StepsCount] to fixed steps in grey scale (depth)"; } // *** INPUTS public override int _GetInputPortCount() { // int colorSteps, float value return 2; } public override string _GetInputPortName(int port) { switch (port) { case 0: return "colorSteps"; case 1: return "value"; } throw new System.Exception("unknown portIndex in GetInputPortName in ColorStepsNode."); } public override PortType _GetInputPortType(int port) { switch (port) { case 0: return PortType.ScalarInt; case 1: return PortType.Scalar; } throw new System.Exception("unknown portIndex in GetInputPortType in ColorStepsNode."); } // *** OUTPUTS public override int _GetOutputPortCount() { return 1; } public override string _GetOutputPortName(int port) { if (port == 0) { return "output"; } throw new System.Exception("unknown portIndex in GetOutputPortName in ColorStepsNode."); } public override PortType _GetReturnIconType() { return PortType.Scalar; } public override PortType _GetOutputPortType(int port) { if (port == 0) { return PortType.Scalar; } throw new System.Exception("unknown portIndex in GetOutputPortType in ColorStepsNode."); } // *** FUNCTIONALITY public override string _GetGlobalCode(Shader.Mode mode) { return ""; } public override string _GetCode(Array<string> inputVars, Array<string> outputVars, Shader.Mode mode, VisualShader.Type type) { string colorSteps = inputVars[0]; string value = inputVars[1]; string output = outputVars[0]; string code = $"float colorStepSize = 1.0 / float({colorSteps});" + $"float steppedValue = ({value} - fract({value})) * colorStepSize;" + $"{output} = steppedValue - (colorStepSize / 2.0);"; return code; } }
原ExpressionNode截图

解决步骤
1. 配置插件清单
在res://addons/colorStepsNode/目录下创建plugin.cfg文件,内容如下:
[plugin] name="Color Steps Node" description="自定义视觉着色器节点,实现灰度阶跃效果" author="你的名字" version="1.0" script="ColorStepsNode.cs"
2. 启用插件
打开Godot编辑器的项目 > 项目设置 > 插件页面,找到“Color Steps Node”插件,勾选启用,然后重启编辑器。
3. 检查编译状态
查看编辑器底部的“输出”面板,确认没有C#编译错误。如果有错误,根据提示修复代码后重新编译。
4. 修正着色器逻辑(可选)
你的节点代码逻辑和原ExpressionNode不一致,原表达式为floor(value * colorSteps) / colorSteps - 0.5/colorSteps,建议将_GetCode方法修改为:
public override string _GetCode(Array<string> inputVars, Array<string> outputVars, Shader.Mode mode, VisualShader.Type type) { string colorSteps = inputVars[0]; string value = inputVars[1]; string output = outputVars[0]; string code = $"float colorStepSize = 1.0 / float({colorSteps});" + $"float steppedValue = floor({value} * float({colorSteps})) * colorStepSize;" + $"{output} = steppedValue - colorStepSize * 0.5;"; return code; }
5. 查找节点
重启编辑器后,打开着色器编辑器,点击“添加节点”,在“Custom”分类下搜索“ColorSteps”即可找到你的自定义节点。
内容的提问来源于stack exchange,提问作者Reborok
相关产品推荐
相关产品推荐

