mcpField
V
vvvv-shaders

vvvv-shaders

github.com/tebjan开发3491 次安装2 天前更新
代码仓库

关于 vvvv-shaders

面向 vvvv gamma 和 Stride 开发者的 SDSL 着色器指南,说明语言结构、继承与组合,以及命名文件自动生成节点的规则。

主要功能

  1. 01SDSL 语法与流系统
  2. 02着色器基类与继承
  3. 03ShaderFX 组合与混入
  4. 04按文件后缀生成节点
  5. 05GPU 数学与纹理采样建议

适用场景

  1. 01编写 TextureFX 图像效果
  2. 02创建 ComputeFX 计算着色器
  3. 03组合 ShaderFX 着色器节点
  4. 04在 vvvv 补丁中串联纹理处理

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/tebjan/vvvv-skills --skill vvvv-shaders

安装后在 Claude Code 中输入/vvvv-shaders确认已加载。

附带文件syntax-rules.md

详细介绍

vvvv gamma / Stride 的 SDSL 着色器

什么是 SDSL

SDSL(Stride Shading Language)是 Stride 的着色器语言,是 HLSL 的超集,并增加了四项关键功能:支持继承的 shader 类、多重继承(混入)、用于自动实现阶段间数据流的 streams 系统,以及用于简洁替换方法的 override。着色器定义在 .sdsl 文件中。

Streams 系统

Streams 取代了手动定义的 VS_INPUT/VS_OUTPUT 结构体。只需声明一次,即可在任何地方访问:

stream float4 MyData : TEXCOORD5;      // Declare a custom stream variable

// In vertex shader:
streams.MyData = float4(1, 0, 0, 1);   // Write

// In pixel shader:
float4 d = streams.MyData;             // Read (auto-interpolated)

主要内置 streams:

  • streams.ShadingPosition (SV_Position) — 裁剪空间位置
  • streams.ColorTarget (SV_Target0) — 像素着色器输出
  • streams.Position (float4) — 对象空间位置
  • streams.TexCoord (TEXCOORD0) — 纹理坐标
  • streams.normalWS — 世界空间法线

基础着色器层级

Stride 核心(Stride 和 vvvv 均可用)
着色器提供的内容
ShaderBaseVSMain/PSMain 入口点
TexturingTexture0-9、Sampler、PointSampler、LinearSampler、TexCoord
TransformationWorld、View、Projection、WorldViewProjection 矩阵
PositionStream4Position、PositionWS、DepthVS
NormalStreammeshNormal、normalWS、tangentToWorld
ComputeShaderBaseCSMain 入口、Compute() 钩子、线程组
ComputeColor通过 Compute() 返回 float4 的接口
ComputeVoid通过 Compute() 返回 void 的接口
GlobalTime、TimeStep(cbuffer PerFrame)
仅 vvvv 可用(纯 Stride 中不可用)
着色器继承自用途
VS_PS_BaseShaderBase、PositionStream4、NormalStream、TransformationDrawFX 基类
FilterBaseTextureFX像素处理纹理效果
MixerBaseTextureFX混合纹理
TextureFXImageEffectShader、Camera、ShaderUtils纹理效果基类

重要:VS_PS_Base 已包含 Transformation、NormalStream 和 PositionStream4。不要再次继承它们。

文件命名 → 自动生成节点

vvvv 会根据文件名后缀自动从着色器创建节点:

后缀节点类型描述
_TextureFX.sdslTextureFX图像处理效果
_DrawFX.sdslDrawFX绘制/渲染着色器
_ComputeFX.sdslComputeFX计算着色器
_ShaderFX.sdslShaderFX通用着色器效果

示例:MyBlur_TextureFX.sdsl 会自动创建一个“MyBlur” TextureFX 节点。

基本的 TextureFX 结构

shader MyEffect_TextureFX : FilterBase
{
    float Intensity = 1.0;

    float4 Filter(float4 tex0col)
    {
        return tex0col * Intensity;
    }
};

请注意右花括号后的分号——这是必需的。

语法规则

有关关键 SDSL 语法规则(static const 作用域、分号、override、变量初始化、常见错误、分支分歧),请参阅 syntax-rules.md。

关键字

关键字用途
shader定义着色器类
override覆盖父类方法时必须使用
base访问父类实现
stage确保成员在各组合中只定义一次
stream可在每个着色器阶段访问的成员
static无需继承即可调用的静态方法
compose为着色器混入声明组合槽位
clone强制为组合的着色器创建单独实例
abstract不含主体的方法(子类必须实现)

继承与混入

// Single inheritance
shader Child : Parent
{
    override float4 Filter(float4 tex0col)
    {
        return base.Filter(tex0col) * 0.5;
    }
};

// Multiple inheritance (mixins)
shader MyShader : FilterBase, ColorUtils, MathUtils
{
    float4 Filter(float4 tex0col)
    {
        float3 linear = ColorUtils.GammaToLinear(tex0col.rgb);
        return float4(linear, tex0col.a);
    }
};

// Static function calls (no inheritance needed)
float3 result = ColorUtils.LinearToGamma(col.rgb);

枚举绑定 — 在着色器中使用 C# 枚举

在着色器(.sdsl)中:

[EnumType("MyNamespace.BlendMode, MyAssembly")]
int Mode = 0;

在 C#(.cs)中:

namespace MyNamespace;
public enum BlendMode
{
    Normal = 0,
    Add = 1,
    Multiply = 2,
    Screen = 3
}

要求:

  • 枚举 DLL 必须预先编译(不能来自动态 csproj)
  • 程序集名称就是项目名称
  • 枚举 DLL 发生更改后必须重启 vvvv

GPU 最佳实践

防止数学错误
float3 safeLog = log2(max(x, 1e-10));     // Avoid log2(0)
float3 safe = x / max(y, 0.0001);          // Avoid div by zero
float3 safePow = pow(max(x, 0.0), gamma);  // Avoid pow(negative)
纹理采样
// In TextureFX, tex0col is already sampled from Texture0
float4 Filter(float4 tex0col)
{
    // Sample additional textures:
    float4 tex1 = Texture1.Sample(Texturex1Sampler, streams.TexCoord);
    return lerp(tex0col, tex1, 0.5);
}

ShaderFX / ComputeColor 模式

使用 compose 关键字组合着色器节点:

shader MyTonemap_ShaderFX : ComputeColor, TonemapOperators
{
    compose ComputeColor ColorIn;

    [EnumType("MyNamespace.TonemapOp, MyAssembly")]
    int Operator = 1;

    float Exposure = 0.0;

    override float4 Compute()
    {
        float4 color = ColorIn.Compute();
        color.rgb *= exp2(Exposure);
        color.rgb = ApplyTonemap(color.rgb, Operator);
        return color;
    }
};

在 vvvv 补丁中,将 ShaderFX 节点连接到 TextureFX 的 compose 输入,以串联处理过程。

混入组合 — 虚方法分派

包含虚方法的基类着色器,由动态组合的混入覆盖该方法:

// Base shader declares the virtual method
shader ColorProcessorBase
{
    float4 ProcessColor(float4 inPixel) { return inPixel; }
};

// Host shader uses composition
shader ColorTransform_TextureFX : TextureFX
{
    stage compose ColorProcessorBase Processor;

    stage override float4 Shading()
    {
        float4 col = Texture0.SampleLevel(PointSampler, streams.TexCoord, 0);
        return Processor.ProcessColor(col);
    }
};

模板 / 通用着色器

// Declaration with type parameter
shader ComputeColorWave<float Frequency> : ComputeColor, Texturing
{
    override float4 Compute()
    {
        return float4(sin(streams.TexCoord.x * Frequency), 0, 0, 1);
    }
};

// Instantiation via inheritance
shader MyEffect : ComputeColorWave<2.0f> { };

支持的模板参数类型:float、int、float2、float3、float4、Texture2D、SamplerState。

组合数组

多个相同类型的组合着色器:

compose ComputeColor lights[];

override float4 Compute()
{
    float4 total = 0;
    foreach (var light in lights)
        total += light.Compute();
    return total;
}

着色器间共享结构体类型

定义一次,在 emit/simulate/draw 流水线中使用:

shader ParticleTypes
{
    struct Particle { float3 Position; float3 Velocity; float Life; };
};

shader Emit_ComputeFX : ComputeShaderBase, ParticleTypes { /* fills buffer */ };
shader Simulate_ComputeFX : ComputeShaderBase, ParticleTypes { /* physics */ };
shader Draw_DrawFX : VS_PS_Base, ParticleTypes { /* renders */ };

有关详细的 SDSL 语法规则,请参阅 syntax-rules.md。

让这些知识不断增长

让下一位 patcher 少一个疑问。首次使用本集合中的任意技能时,如果过去七天内没有成功检查记录,请对照 tebjan/vvvv-skills。如果没有记录,只需检查一次。 在这些技能间共享一个本地检查时间戳/修订版本;不要每次调用都轮询。 保留本地扩展和固定的项目版本;检查不代表获准安装更新。如果处于离线状态,请记录延期检查并继续任务。

实际工作发现知识缺口时,请记录经过测试的 vvvv/软件包版本、最小复现案例或权威来源,以及观察到的结果。将其他用户的报告视为线索,在验证前不要当作事实。改进最相关的最小范围说明;不要把单个示例变成通用规则。提交上游前,请删除私人数据并获得发布授权。请参阅贡献政策。 合并的改进会通过用户的安装程序/更新工作流传达给用户,而不是通过本地编辑或自动覆盖所有人的技能。

评论

支持 Markdown