@triforge/shader-core 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundle.js +125 -6
- package/dist/core/ShaderNode.d.ts.map +1 -1
- package/dist/core/ShaderNode.js +16 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/nodes/process/AddShader.js +3 -3
- package/dist/nodes/process/Bump.d.ts +25 -2
- package/dist/nodes/process/Bump.d.ts.map +1 -1
- package/dist/nodes/process/Bump.js +113 -32
- package/dist/nodes/process/DiffuseBSDF.js +7 -7
- package/dist/nodes/process/Emission.js +3 -3
- package/dist/nodes/process/GlassBSDF.js +13 -13
- package/dist/nodes/process/GlossyBSDF.js +14 -14
- package/dist/nodes/process/MixShader.js +3 -3
- package/dist/nodes/process/PrincipledBSDF.js +39 -39
- package/dist/nodes/process/PrincipledHair.js +70 -70
- package/dist/nodes/process/PrincipledVolume.js +21 -21
- package/dist/nodes/process/RefractionBSDF.js +7 -7
- package/dist/nodes/process/SheenBSDF.js +12 -12
- package/dist/nodes/process/SpecularBSDF.js +15 -15
- package/dist/nodes/process/SubsurfaceScattering.js +7 -7
- package/dist/nodes/process/ToonBSDF.js +6 -6
- package/dist/nodes/process/TranslucentBSDF.js +5 -5
- package/dist/nodes/process/TransparentBSDF.d.ts +26 -0
- package/dist/nodes/process/TransparentBSDF.d.ts.map +1 -0
- package/dist/nodes/process/TransparentBSDF.js +29 -0
- package/dist/nodes/process/VolumeAbsorption.js +3 -3
- package/dist/nodes/process/VolumeScatter.js +7 -7
- package/package.json +1 -1
package/dist/bundle.js
CHANGED
|
@@ -237,6 +237,18 @@ var ShaderNode = class {
|
|
|
237
237
|
enumerable: true,
|
|
238
238
|
configurable: true
|
|
239
239
|
});
|
|
240
|
+
const AXES = ["x", "y", "z"];
|
|
241
|
+
AXES.forEach((axis, idx) => {
|
|
242
|
+
Object.defineProperty(this.parameters, `${paramName}.${axis}`, {
|
|
243
|
+
get: () => uniforms[uniformName].value[idx],
|
|
244
|
+
set: (v) => {
|
|
245
|
+
const arr = uniforms[uniformName].value;
|
|
246
|
+
arr[idx] = finiteOr(v, 0);
|
|
247
|
+
},
|
|
248
|
+
enumerable: true,
|
|
249
|
+
configurable: true
|
|
250
|
+
});
|
|
251
|
+
});
|
|
240
252
|
} else {
|
|
241
253
|
Object.defineProperty(this.parameters, paramName, {
|
|
242
254
|
get: () => uniforms[uniformName].value,
|
|
@@ -2753,13 +2765,19 @@ var Bump = class _Bump extends ProcessNode {
|
|
|
2753
2765
|
return "Bump";
|
|
2754
2766
|
}
|
|
2755
2767
|
static {
|
|
2756
|
-
|
|
2768
|
+
// Both modes emit their own per-instance defs (a #ifndef-guarded shared function
|
|
2769
|
+
// for 'derivative', a per-instance uniform declaration for 'uv-offset' — see
|
|
2770
|
+
// compileDefs). instanceSpecificDef:true is required so multiple 'uv-offset'
|
|
2771
|
+
// instances each get their own uniform decl instead of being deduped by nodeType.
|
|
2772
|
+
this.instanceSpecificDef = true;
|
|
2757
2773
|
}
|
|
2758
2774
|
get metadata() {
|
|
2759
2775
|
return { label: "Bump", category: "Vector", color: "#4a3a8a", cost: "medium" };
|
|
2760
2776
|
}
|
|
2761
2777
|
static {
|
|
2762
|
-
this.
|
|
2778
|
+
this.derivativeGlslFunction = `
|
|
2779
|
+
#ifndef _ST_BUMP_FN
|
|
2780
|
+
#define _ST_BUMP_FN
|
|
2763
2781
|
vec3 _st_bump(float height, float strength, float distance, vec3 N) {
|
|
2764
2782
|
// Cotangent frame bump \u2014 camera-independent.
|
|
2765
2783
|
// We derive world-space surface tangent T and bitangent B from the UV
|
|
@@ -2786,15 +2804,34 @@ vec3 _st_bump(float height, float strength, float distance, vec3 N) {
|
|
|
2786
2804
|
|
|
2787
2805
|
float scale = strength * distance * 50.0;
|
|
2788
2806
|
return normalize(N - T * dhdu * scale - B * dhdv * scale);
|
|
2789
|
-
}
|
|
2807
|
+
}
|
|
2808
|
+
#endif`;
|
|
2790
2809
|
}
|
|
2791
2810
|
constructor(inputs = {}) {
|
|
2792
2811
|
super("Bump");
|
|
2812
|
+
this._method = inputs.method ?? "derivative";
|
|
2813
|
+
if (this._method === "uv-offset") {
|
|
2814
|
+
if (ShaderConfig.errorLevel !== "off" && !inputs.uniformName) {
|
|
2815
|
+
ShaderNodeError.throw({
|
|
2816
|
+
nodeType: "Bump",
|
|
2817
|
+
nodeId: this.id,
|
|
2818
|
+
problem: 'uniformName is required when method:"uv-offset".',
|
|
2819
|
+
fix: 'new Bump({ method: "uv-offset", uniformName: "uHeightTex" })\n After compile(): mat.material.uniforms.uHeightTex = { value: texture }'
|
|
2820
|
+
});
|
|
2821
|
+
}
|
|
2822
|
+
if (inputs.uniformName) assertGlslIdentifier(inputs.uniformName, "Bump uniformName");
|
|
2823
|
+
this._uniformName = inputs.uniformName ?? null;
|
|
2824
|
+
} else {
|
|
2825
|
+
this._uniformName = null;
|
|
2826
|
+
}
|
|
2793
2827
|
this._inputs = this.createInputs(inputs, {
|
|
2794
2828
|
strength: ["float", inputs.strength ?? 1],
|
|
2795
2829
|
distance: ["float", inputs.distance ?? 1],
|
|
2796
2830
|
height: ["float", 0.5],
|
|
2797
|
-
normal: ["color", null]
|
|
2831
|
+
normal: ["color", null],
|
|
2832
|
+
vector: ["vector", null],
|
|
2833
|
+
texelSize: ["float", inputs.texelSize ?? 1 / 512],
|
|
2834
|
+
lod: ["float", inputs.lod ?? 0]
|
|
2798
2835
|
});
|
|
2799
2836
|
this._outputs = this.createOutputs({ Normal: "color" });
|
|
2800
2837
|
}
|
|
@@ -2805,13 +2842,60 @@ vec3 _st_bump(float height, float strength, float distance, vec3 N) {
|
|
|
2805
2842
|
return this._outputs;
|
|
2806
2843
|
}
|
|
2807
2844
|
compileDefs() {
|
|
2808
|
-
|
|
2845
|
+
if (this._method === "uv-offset") {
|
|
2846
|
+
return [
|
|
2847
|
+
"#ifndef _ST_BUMP_TEXLOD_EXT",
|
|
2848
|
+
"#define _ST_BUMP_TEXLOD_EXT",
|
|
2849
|
+
"#extension GL_EXT_shader_texture_lod : enable",
|
|
2850
|
+
"#endif",
|
|
2851
|
+
`uniform sampler2D ${this._uniformName};`
|
|
2852
|
+
].join("\n");
|
|
2853
|
+
}
|
|
2854
|
+
return _Bump.derivativeGlslFunction;
|
|
2809
2855
|
}
|
|
2810
2856
|
compileCall(ctx) {
|
|
2811
|
-
const height = ctx.resolveInput(this._inputs.height);
|
|
2812
2857
|
const strength = ctx.resolveInput(this._inputs.strength);
|
|
2813
2858
|
const distance = ctx.resolveInput(this._inputs.distance);
|
|
2814
2859
|
const normal = this._inputs.normal.isConnected() ? ctx.outputVar(this._inputs.normal.connection.node, this._inputs.normal.connection.name) : "normalize(vNormal)";
|
|
2860
|
+
if (this._method === "uv-offset") {
|
|
2861
|
+
const uv = this._inputs.vector.isConnected() ? ctx.resolveInput(this._inputs.vector) : "vUv";
|
|
2862
|
+
const texelSize = ctx.resolveInput(this._inputs.texelSize);
|
|
2863
|
+
const lod = ctx.resolveInput(this._inputs.lod);
|
|
2864
|
+
const id = this.id;
|
|
2865
|
+
const hL = `_bmp_${id}_hL`, hR = `_bmp_${id}_hR`;
|
|
2866
|
+
const hD = `_bmp_${id}_hD`, hU = `_bmp_${id}_hU`;
|
|
2867
|
+
const dPdx = `_bmp_${id}_dPdx`, dPdy = `_bmp_${id}_dPdy`;
|
|
2868
|
+
const dUdx = `_bmp_${id}_dUdx`, dUdy = `_bmp_${id}_dUdy`;
|
|
2869
|
+
const det = `_bmp_${id}_det`, sgn = `_bmp_${id}_sgn`, invDet = `_bmp_${id}_invDet`;
|
|
2870
|
+
const T = `_bmp_${id}_T`, B = `_bmp_${id}_B`;
|
|
2871
|
+
const dhdu = `_bmp_${id}_dhdu`, dhdv = `_bmp_${id}_dhdv`;
|
|
2872
|
+
const scale = `_bmp_${id}_scale`;
|
|
2873
|
+
const ts = `_bmp_${id}_ts`;
|
|
2874
|
+
return [
|
|
2875
|
+
`float ${ts} = ${texelSize};`,
|
|
2876
|
+
`float ${hL} = texture2DLodEXT(${this._uniformName}, ${uv} - vec2(${ts}, 0.0), ${lod}).r;`,
|
|
2877
|
+
`float ${hR} = texture2DLodEXT(${this._uniformName}, ${uv} + vec2(${ts}, 0.0), ${lod}).r;`,
|
|
2878
|
+
`float ${hD} = texture2DLodEXT(${this._uniformName}, ${uv} - vec2(0.0, ${ts}), ${lod}).r;`,
|
|
2879
|
+
`float ${hU} = texture2DLodEXT(${this._uniformName}, ${uv} + vec2(0.0, ${ts}), ${lod}).r;`,
|
|
2880
|
+
// Cotangent frame from screen-space derivatives — this builds the tangent
|
|
2881
|
+
// basis (surface-fixed), not the height sample, so it doesn't carry the
|
|
2882
|
+
// camera-distance instability the uv-offset method exists to avoid.
|
|
2883
|
+
`vec3 ${dPdx} = dFdx(vPosition);`,
|
|
2884
|
+
`vec3 ${dPdy} = dFdy(vPosition);`,
|
|
2885
|
+
`vec2 ${dUdx} = dFdx(vUv);`,
|
|
2886
|
+
`vec2 ${dUdy} = dFdy(vUv);`,
|
|
2887
|
+
`float ${det} = ${dUdx}.x * ${dUdy}.y - ${dUdx}.y * ${dUdy}.x;`,
|
|
2888
|
+
`float ${sgn} = sign(${det});`,
|
|
2889
|
+
`float ${invDet} = ${sgn} / max(abs(${det}), 1e-6);`,
|
|
2890
|
+
`vec3 ${T} = normalize((${dUdy}.y * ${dPdx} - ${dUdx}.y * ${dPdy}) * ${invDet});`,
|
|
2891
|
+
`vec3 ${B} = normalize(cross(${normal}, ${T})) * ${sgn};`,
|
|
2892
|
+
`float ${dhdu} = (${hR} - ${hL}) / max(2.0 * ${ts}, 1e-6);`,
|
|
2893
|
+
`float ${dhdv} = (${hU} - ${hD}) / max(2.0 * ${ts}, 1e-6);`,
|
|
2894
|
+
`float ${scale} = ${strength} * ${distance} * 50.0;`,
|
|
2895
|
+
`vec3 ${ctx.outputVar(this, "Normal")} = normalize(${normal} - ${T} * ${dhdu} * ${scale} - ${B} * ${dhdv} * ${scale});`
|
|
2896
|
+
].join("\n ");
|
|
2897
|
+
}
|
|
2898
|
+
const height = ctx.resolveInput(this._inputs.height);
|
|
2815
2899
|
return `vec3 ${ctx.outputVar(this, "Normal")} = _st_bump(${height}, ${strength}, ${distance}, ${normal});`;
|
|
2816
2900
|
}
|
|
2817
2901
|
};
|
|
@@ -4257,6 +4341,40 @@ vec3 _st_translucentBSDF(vec3 color, vec3 N) {
|
|
|
4257
4341
|
}
|
|
4258
4342
|
};
|
|
4259
4343
|
|
|
4344
|
+
// src/nodes/process/TransparentBSDF.ts
|
|
4345
|
+
var TransparentBSDF = class extends ProcessNode {
|
|
4346
|
+
get nodeType() {
|
|
4347
|
+
return "TransparentBSDF";
|
|
4348
|
+
}
|
|
4349
|
+
static {
|
|
4350
|
+
this.instanceSpecificDef = false;
|
|
4351
|
+
}
|
|
4352
|
+
get metadata() {
|
|
4353
|
+
return { label: "Transparent BSDF", category: "Shader", color: "#336699", cost: "low" };
|
|
4354
|
+
}
|
|
4355
|
+
constructor() {
|
|
4356
|
+
super("TransparentBSDF");
|
|
4357
|
+
this._inputs = this.createInputs({}, {});
|
|
4358
|
+
this._outputs = this.createOutputs({ BSDF: "shader" });
|
|
4359
|
+
}
|
|
4360
|
+
getInputSockets() {
|
|
4361
|
+
return this._inputs;
|
|
4362
|
+
}
|
|
4363
|
+
getOutputSockets() {
|
|
4364
|
+
return this._outputs;
|
|
4365
|
+
}
|
|
4366
|
+
compileDefs() {
|
|
4367
|
+
return "";
|
|
4368
|
+
}
|
|
4369
|
+
/** Always fully transparent — a constant, not a dynamic value, so this always requests transparent:true. */
|
|
4370
|
+
wantsTransparency() {
|
|
4371
|
+
return true;
|
|
4372
|
+
}
|
|
4373
|
+
compileCall(ctx) {
|
|
4374
|
+
return `vec4 ${ctx.outputVar(this, "BSDF")} = vec4(0.0, 0.0, 0.0, 0.0);`;
|
|
4375
|
+
}
|
|
4376
|
+
};
|
|
4377
|
+
|
|
4260
4378
|
// src/nodes/process/PrincipledHair.ts
|
|
4261
4379
|
var PrincipledHair = class _PrincipledHair extends ProcessNode {
|
|
4262
4380
|
get nodeType() {
|
|
@@ -5660,6 +5778,7 @@ export {
|
|
|
5660
5778
|
TextureCoordinate,
|
|
5661
5779
|
ToonBSDF,
|
|
5662
5780
|
TranslucentBSDF,
|
|
5781
|
+
TransparentBSDF,
|
|
5663
5782
|
UVMap,
|
|
5664
5783
|
Value,
|
|
5665
5784
|
VectorCurves,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ShaderNode.d.ts","sourceRoot":"","sources":["../../src/core/ShaderNode.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAsBjD,6DAA6D;AAC7D,KAAK,QAAQ,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;AAE/C,8CAA8C;AAC9C,KAAK,SAAS,GAAG,UAAU,CAAA;AAE3B,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAK,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAK,MAAM,CAAA;IAChB,IAAI,EAAM,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAA;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;GAGG;AACH,8BAAsB,UAAU;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IAEnB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,CAAA;IAErB;;;;;OAKG;IACH,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAEvC;;;;;;;;OAQG;IACH,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAK;IAElE,2EAA2E;IAC3E,OAAO,CAAC,WAAW,CAAmC;IACtD,yDAAyD;IACzD,OAAO,CAAC,YAAY,CAAkC;gBAE1C,QAAQ,EAAE,MAAM;IAI5B,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAA;IAC/B,QAAQ,KAAK,QAAQ,IAAI,YAAY,CAAA;IAErC,QAAQ,CAAC,eAAe,IAAK,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IACjE,QAAQ,CAAC,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC;IAEzD;;;;;;;;;OASG;IACH,gBAAgB,IAAI,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAIzG;;;;;OAKG;IACH,iBAAiB,IAAI,OAAO;IAE5B;;;OAGG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY;IAelC;;;OAGG;IACH,QAAQ,CAAC,WAAW,IAAI,MAAM;IAE9B;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,qBAAqB,EAAE,cAAc,GAAG,MAAM;IAE/E;;;;OAIG;IACH,MAAM,CAAC,mBAAmB,UAAQ;IAElC;;;;;;;;;;OAUG;IACH,SAAS,CAAC,YAAY,CACpB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAC7B,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAkCvC;;;;;OAKG;IACH,SAAS,CAAC,aAAa,CACrB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAC9B,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC;IAQ/B;;;;OAIG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"ShaderNode.d.ts","sourceRoot":"","sources":["../../src/core/ShaderNode.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAsBjD,6DAA6D;AAC7D,KAAK,QAAQ,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;AAE/C,8CAA8C;AAC9C,KAAK,SAAS,GAAG,UAAU,CAAA;AAE3B,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAK,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAK,MAAM,CAAA;IAChB,IAAI,EAAM,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAA;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;GAGG;AACH,8BAAsB,UAAU;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IAEnB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,CAAA;IAErB;;;;;OAKG;IACH,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAEvC;;;;;;;;OAQG;IACH,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAK;IAElE,2EAA2E;IAC3E,OAAO,CAAC,WAAW,CAAmC;IACtD,yDAAyD;IACzD,OAAO,CAAC,YAAY,CAAkC;gBAE1C,QAAQ,EAAE,MAAM;IAI5B,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAA;IAC/B,QAAQ,KAAK,QAAQ,IAAI,YAAY,CAAA;IAErC,QAAQ,CAAC,eAAe,IAAK,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IACjE,QAAQ,CAAC,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC;IAEzD;;;;;;;;;OASG;IACH,gBAAgB,IAAI,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAIzG;;;;;OAKG;IACH,iBAAiB,IAAI,OAAO;IAE5B;;;OAGG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY;IAelC;;;OAGG;IACH,QAAQ,CAAC,WAAW,IAAI,MAAM;IAE9B;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,qBAAqB,EAAE,cAAc,GAAG,MAAM;IAE/E;;;;OAIG;IACH,MAAM,CAAC,mBAAmB,UAAQ;IAElC;;;;;;;;;;OAUG;IACH,SAAS,CAAC,YAAY,CACpB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAC7B,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAkCvC;;;;;OAKG;IACH,SAAS,CAAC,aAAa,CACrB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAC9B,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC;IAQ/B;;;;OAIG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,GAAG,IAAI;CAqCpE"}
|
package/dist/core/ShaderNode.js
CHANGED
|
@@ -151,6 +151,22 @@ export class ShaderNode {
|
|
|
151
151
|
enumerable: true,
|
|
152
152
|
configurable: true,
|
|
153
153
|
});
|
|
154
|
+
// Per-component aliases (e.g. parameters['location.x']) for any vector-typed
|
|
155
|
+
// uniform parameter, so a KeyframeTrack can animate a single axis. Reads/writes
|
|
156
|
+
// go through the same uniforms[uniformName].value array as the whole-vector
|
|
157
|
+
// getter/setter above, so both access styles stay in sync automatically.
|
|
158
|
+
const AXES = ['x', 'y', 'z'];
|
|
159
|
+
AXES.forEach((axis, idx) => {
|
|
160
|
+
Object.defineProperty(this.parameters, `${paramName}.${axis}`, {
|
|
161
|
+
get: () => uniforms[uniformName].value[idx],
|
|
162
|
+
set: (v) => {
|
|
163
|
+
const arr = uniforms[uniformName].value;
|
|
164
|
+
arr[idx] = finiteOr(v, 0);
|
|
165
|
+
},
|
|
166
|
+
enumerable: true,
|
|
167
|
+
configurable: true,
|
|
168
|
+
});
|
|
169
|
+
});
|
|
154
170
|
}
|
|
155
171
|
else {
|
|
156
172
|
Object.defineProperty(this.parameters, paramName, {
|
package/dist/index.d.ts
CHANGED
|
@@ -83,6 +83,7 @@ export { SubsurfaceScattering } from './nodes/process/SubsurfaceScattering.js';
|
|
|
83
83
|
export { ToonBSDF } from './nodes/process/ToonBSDF.js';
|
|
84
84
|
export { SpecularBSDF } from './nodes/process/SpecularBSDF.js';
|
|
85
85
|
export { TranslucentBSDF } from './nodes/process/TranslucentBSDF.js';
|
|
86
|
+
export { TransparentBSDF } from './nodes/process/TransparentBSDF.js';
|
|
86
87
|
export { PrincipledHair } from './nodes/process/PrincipledHair.js';
|
|
87
88
|
export { Math as ShaderMath } from './nodes/process/Math.js';
|
|
88
89
|
export { Clamp } from './nodes/process/Clamp.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -88,6 +88,7 @@ export { SubsurfaceScattering } from './nodes/process/SubsurfaceScattering.js';
|
|
|
88
88
|
export { ToonBSDF } from './nodes/process/ToonBSDF.js';
|
|
89
89
|
export { SpecularBSDF } from './nodes/process/SpecularBSDF.js';
|
|
90
90
|
export { TranslucentBSDF } from './nodes/process/TranslucentBSDF.js';
|
|
91
|
+
export { TransparentBSDF } from './nodes/process/TransparentBSDF.js';
|
|
91
92
|
export { PrincipledHair } from './nodes/process/PrincipledHair.js';
|
|
92
93
|
// ── Process nodes — Converter ─────────────────────────────────────────────────
|
|
93
94
|
export { Math as ShaderMath } from './nodes/process/Math.js';
|
|
@@ -30,7 +30,7 @@ export class AddShader extends ProcessNode {
|
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
AddShader.instanceSpecificDef = false;
|
|
33
|
-
AddShader.glslFunction = `
|
|
34
|
-
vec4 _st_addShader(vec4 a, vec4 b) {
|
|
35
|
-
return vec4(a.rgb + b.rgb, max(a.a, b.a));
|
|
33
|
+
AddShader.glslFunction = `
|
|
34
|
+
vec4 _st_addShader(vec4 a, vec4 b) {
|
|
35
|
+
return vec4(a.rgb + b.rgb, max(a.a, b.a));
|
|
36
36
|
}`;
|
|
@@ -7,19 +7,42 @@ export interface BumpInputs {
|
|
|
7
7
|
distance?: OutputSocket | number;
|
|
8
8
|
height?: OutputSocket;
|
|
9
9
|
normal?: OutputSocket;
|
|
10
|
+
/**
|
|
11
|
+
* 'derivative' (default) — height gradient via dFdx/dFdy of the `height` input.
|
|
12
|
+
* Screen-space, camera/rasterization-dependent: stable for procedural/vertex-fed
|
|
13
|
+
* height but can speckle or seam-flicker across a wide camera-distance range when
|
|
14
|
+
* `height` comes from a sampled texture.
|
|
15
|
+
*
|
|
16
|
+
* 'uv-offset' — explicit texelSize-offset samples of a height texture at a fixed
|
|
17
|
+
* LOD, independent of screen-space derivatives. Stable under camera motion for
|
|
18
|
+
* texture-driven relief (e.g. planetary crater/regolith maps). Requires `uniformName`.
|
|
19
|
+
*/
|
|
20
|
+
method?: 'derivative' | 'uv-offset';
|
|
21
|
+
/** Required when method:'uv-offset'. Name of the sampler2D height-map uniform. */
|
|
22
|
+
uniformName?: string;
|
|
23
|
+
/** UV to sample at, when method:'uv-offset'. Defaults to the surface UV (vUv). */
|
|
24
|
+
vector?: OutputSocket;
|
|
25
|
+
/** Texel size (1 / texture resolution) for the uv-offset samples. Default 1/512. */
|
|
26
|
+
texelSize?: OutputSocket | number;
|
|
27
|
+
/** Explicit mip/LOD level for the uv-offset samples. Default 0. */
|
|
28
|
+
lod?: OutputSocket | number;
|
|
10
29
|
}
|
|
11
30
|
/**
|
|
12
31
|
* Bump — Blender "Bump" node equivalent.
|
|
13
|
-
* Converts a height map into a perturbed surface normal
|
|
32
|
+
* Converts a height map into a perturbed surface normal.
|
|
14
33
|
*
|
|
15
34
|
* Inputs: strength [0-1], distance, height (float), normal (optional override)
|
|
35
|
+
* method ('derivative' | 'uv-offset'), uniformName/vector/texelSize/lod
|
|
36
|
+
* (uv-offset mode only)
|
|
16
37
|
* Outputs: Normal (color/vec3)
|
|
17
38
|
*/
|
|
18
39
|
export declare class Bump extends ProcessNode {
|
|
19
40
|
get nodeType(): string;
|
|
20
41
|
static instanceSpecificDef: boolean;
|
|
21
42
|
get metadata(): NodeMetadata;
|
|
22
|
-
static
|
|
43
|
+
static derivativeGlslFunction: string;
|
|
44
|
+
private readonly _method;
|
|
45
|
+
private readonly _uniformName;
|
|
23
46
|
private readonly _inputs;
|
|
24
47
|
private readonly _outputs;
|
|
25
48
|
constructor(inputs?: BumpInputs);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Bump.d.ts","sourceRoot":"","sources":["../../../src/nodes/process/Bump.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"Bump.d.ts","sourceRoot":"","sources":["../../../src/nodes/process/Bump.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAIvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAE9D,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,YAAY,GAAG,MAAM,CAAA;IAChC,QAAQ,CAAC,EAAE,YAAY,GAAG,MAAM,CAAA;IAChC,MAAM,CAAC,EAAI,YAAY,CAAA;IACvB,MAAM,CAAC,EAAI,YAAY,CAAA;IACvB;;;;;;;;;OASG;IACH,MAAM,CAAC,EAAO,YAAY,GAAG,WAAW,CAAA;IACxC,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,kFAAkF;IAClF,MAAM,CAAC,EAAO,YAAY,CAAA;IAC1B,oFAAoF;IACpF,SAAS,CAAC,EAAI,YAAY,GAAG,MAAM,CAAA;IACnC,mEAAmE;IACnE,GAAG,CAAC,EAAU,YAAY,GAAG,MAAM,CAAA;CACpC;AAED;;;;;;;;GAQG;AACH,qBAAa,IAAK,SAAQ,WAAW;IACnC,IAAI,QAAQ,WAAoB;IAKhC,MAAM,CAAC,mBAAmB,UAAO;IAEjC,IAAI,QAAQ,IAAI,YAAY,CAE3B;IAED,MAAM,CAAC,sBAAsB,SA8BxB;IAEL,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2E;IACnG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmE;gBAEhF,MAAM,GAAE,UAAe;IA+BnC,eAAe;IACf,gBAAgB;IAEhB,WAAW,IAAI,MAAM;IAarB,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAkDzC"}
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import { ProcessNode } from '../../core/ProcessNode.js';
|
|
2
|
+
import { ShaderNodeError } from '../../core/ShaderNodeError.js';
|
|
3
|
+
import { ShaderConfig } from '../../core/ShaderConfig.js';
|
|
4
|
+
import { assertGlslIdentifier } from '../../core/glslIdentifier.js';
|
|
2
5
|
/**
|
|
3
6
|
* Bump — Blender "Bump" node equivalent.
|
|
4
|
-
* Converts a height map into a perturbed surface normal
|
|
7
|
+
* Converts a height map into a perturbed surface normal.
|
|
5
8
|
*
|
|
6
9
|
* Inputs: strength [0-1], distance, height (float), normal (optional override)
|
|
10
|
+
* method ('derivative' | 'uv-offset'), uniformName/vector/texelSize/lod
|
|
11
|
+
* (uv-offset mode only)
|
|
7
12
|
* Outputs: Normal (color/vec3)
|
|
8
13
|
*/
|
|
9
14
|
export class Bump extends ProcessNode {
|
|
@@ -13,53 +18,129 @@ export class Bump extends ProcessNode {
|
|
|
13
18
|
}
|
|
14
19
|
constructor(inputs = {}) {
|
|
15
20
|
super('Bump');
|
|
21
|
+
this._method = inputs.method ?? 'derivative';
|
|
22
|
+
if (this._method === 'uv-offset') {
|
|
23
|
+
if (ShaderConfig.errorLevel !== 'off' && !inputs.uniformName) {
|
|
24
|
+
ShaderNodeError.throw({
|
|
25
|
+
nodeType: 'Bump',
|
|
26
|
+
nodeId: this.id,
|
|
27
|
+
problem: 'uniformName is required when method:"uv-offset".',
|
|
28
|
+
fix: 'new Bump({ method: "uv-offset", uniformName: "uHeightTex" })\n After compile(): mat.material.uniforms.uHeightTex = { value: texture }',
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
if (inputs.uniformName)
|
|
32
|
+
assertGlslIdentifier(inputs.uniformName, 'Bump uniformName');
|
|
33
|
+
this._uniformName = inputs.uniformName ?? null;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
this._uniformName = null;
|
|
37
|
+
}
|
|
16
38
|
this._inputs = this.createInputs(inputs, {
|
|
17
39
|
strength: ['float', inputs.strength ?? 1.0],
|
|
18
40
|
distance: ['float', inputs.distance ?? 1.0],
|
|
19
41
|
height: ['float', 0.5],
|
|
20
42
|
normal: ['color', null],
|
|
43
|
+
vector: ['vector', null],
|
|
44
|
+
texelSize: ['float', inputs.texelSize ?? 1 / 512],
|
|
45
|
+
lod: ['float', inputs.lod ?? 0.0],
|
|
21
46
|
});
|
|
22
47
|
this._outputs = this.createOutputs({ Normal: 'color' });
|
|
23
48
|
}
|
|
24
49
|
getInputSockets() { return this._inputs; }
|
|
25
50
|
getOutputSockets() { return this._outputs; }
|
|
26
|
-
compileDefs() {
|
|
51
|
+
compileDefs() {
|
|
52
|
+
if (this._method === 'uv-offset') {
|
|
53
|
+
return [
|
|
54
|
+
'#ifndef _ST_BUMP_TEXLOD_EXT',
|
|
55
|
+
'#define _ST_BUMP_TEXLOD_EXT',
|
|
56
|
+
'#extension GL_EXT_shader_texture_lod : enable',
|
|
57
|
+
'#endif',
|
|
58
|
+
`uniform sampler2D ${this._uniformName};`,
|
|
59
|
+
].join('\n');
|
|
60
|
+
}
|
|
61
|
+
return Bump.derivativeGlslFunction;
|
|
62
|
+
}
|
|
27
63
|
compileCall(ctx) {
|
|
28
|
-
const height = ctx.resolveInput(this._inputs.height);
|
|
29
64
|
const strength = ctx.resolveInput(this._inputs.strength);
|
|
30
65
|
const distance = ctx.resolveInput(this._inputs.distance);
|
|
31
66
|
const normal = this._inputs.normal.isConnected()
|
|
32
67
|
? ctx.outputVar(this._inputs.normal.connection.node, this._inputs.normal.connection.name)
|
|
33
68
|
: 'normalize(vNormal)';
|
|
69
|
+
if (this._method === 'uv-offset') {
|
|
70
|
+
const uv = this._inputs.vector.isConnected() ? ctx.resolveInput(this._inputs.vector) : 'vUv';
|
|
71
|
+
const texelSize = ctx.resolveInput(this._inputs.texelSize);
|
|
72
|
+
const lod = ctx.resolveInput(this._inputs.lod);
|
|
73
|
+
const id = this.id;
|
|
74
|
+
const hL = `_bmp_${id}_hL`, hR = `_bmp_${id}_hR`;
|
|
75
|
+
const hD = `_bmp_${id}_hD`, hU = `_bmp_${id}_hU`;
|
|
76
|
+
const dPdx = `_bmp_${id}_dPdx`, dPdy = `_bmp_${id}_dPdy`;
|
|
77
|
+
const dUdx = `_bmp_${id}_dUdx`, dUdy = `_bmp_${id}_dUdy`;
|
|
78
|
+
const det = `_bmp_${id}_det`, sgn = `_bmp_${id}_sgn`, invDet = `_bmp_${id}_invDet`;
|
|
79
|
+
const T = `_bmp_${id}_T`, B = `_bmp_${id}_B`;
|
|
80
|
+
const dhdu = `_bmp_${id}_dhdu`, dhdv = `_bmp_${id}_dhdv`;
|
|
81
|
+
const scale = `_bmp_${id}_scale`;
|
|
82
|
+
const ts = `_bmp_${id}_ts`;
|
|
83
|
+
return [
|
|
84
|
+
`float ${ts} = ${texelSize};`,
|
|
85
|
+
`float ${hL} = texture2DLodEXT(${this._uniformName}, ${uv} - vec2(${ts}, 0.0), ${lod}).r;`,
|
|
86
|
+
`float ${hR} = texture2DLodEXT(${this._uniformName}, ${uv} + vec2(${ts}, 0.0), ${lod}).r;`,
|
|
87
|
+
`float ${hD} = texture2DLodEXT(${this._uniformName}, ${uv} - vec2(0.0, ${ts}), ${lod}).r;`,
|
|
88
|
+
`float ${hU} = texture2DLodEXT(${this._uniformName}, ${uv} + vec2(0.0, ${ts}), ${lod}).r;`,
|
|
89
|
+
// Cotangent frame from screen-space derivatives — this builds the tangent
|
|
90
|
+
// basis (surface-fixed), not the height sample, so it doesn't carry the
|
|
91
|
+
// camera-distance instability the uv-offset method exists to avoid.
|
|
92
|
+
`vec3 ${dPdx} = dFdx(vPosition);`,
|
|
93
|
+
`vec3 ${dPdy} = dFdy(vPosition);`,
|
|
94
|
+
`vec2 ${dUdx} = dFdx(vUv);`,
|
|
95
|
+
`vec2 ${dUdy} = dFdy(vUv);`,
|
|
96
|
+
`float ${det} = ${dUdx}.x * ${dUdy}.y - ${dUdx}.y * ${dUdy}.x;`,
|
|
97
|
+
`float ${sgn} = sign(${det});`,
|
|
98
|
+
`float ${invDet} = ${sgn} / max(abs(${det}), 1e-6);`,
|
|
99
|
+
`vec3 ${T} = normalize((${dUdy}.y * ${dPdx} - ${dUdx}.y * ${dPdy}) * ${invDet});`,
|
|
100
|
+
`vec3 ${B} = normalize(cross(${normal}, ${T})) * ${sgn};`,
|
|
101
|
+
`float ${dhdu} = (${hR} - ${hL}) / max(2.0 * ${ts}, 1e-6);`,
|
|
102
|
+
`float ${dhdv} = (${hU} - ${hD}) / max(2.0 * ${ts}, 1e-6);`,
|
|
103
|
+
`float ${scale} = ${strength} * ${distance} * 50.0;`,
|
|
104
|
+
`vec3 ${ctx.outputVar(this, 'Normal')} = normalize(${normal} - ${T} * ${dhdu} * ${scale} - ${B} * ${dhdv} * ${scale});`,
|
|
105
|
+
].join('\n ');
|
|
106
|
+
}
|
|
107
|
+
const height = ctx.resolveInput(this._inputs.height);
|
|
34
108
|
return `vec3 ${ctx.outputVar(this, 'Normal')} = _st_bump(${height}, ${strength}, ${distance}, ${normal});`;
|
|
35
109
|
}
|
|
36
110
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
111
|
+
// Both modes emit their own per-instance defs (a #ifndef-guarded shared function
|
|
112
|
+
// for 'derivative', a per-instance uniform declaration for 'uv-offset' — see
|
|
113
|
+
// compileDefs). instanceSpecificDef:true is required so multiple 'uv-offset'
|
|
114
|
+
// instances each get their own uniform decl instead of being deduped by nodeType.
|
|
115
|
+
Bump.instanceSpecificDef = true;
|
|
116
|
+
Bump.derivativeGlslFunction = `
|
|
117
|
+
#ifndef _ST_BUMP_FN
|
|
118
|
+
#define _ST_BUMP_FN
|
|
119
|
+
vec3 _st_bump(float height, float strength, float distance, vec3 N) {
|
|
120
|
+
// Cotangent frame bump — camera-independent.
|
|
121
|
+
// We derive world-space surface tangent T and bitangent B from the UV
|
|
122
|
+
// parameterisation (cotangent frame). This gives vectors that are fixed
|
|
123
|
+
// to the surface regardless of camera orientation.
|
|
124
|
+
// Then we express the height gradient in UV space (dh/du, dh/dv) which
|
|
125
|
+
// is also surface-fixed, eliminating the screen-space dependency.
|
|
126
|
+
vec3 dPdx = dFdx(vPosition);
|
|
127
|
+
vec3 dPdy = dFdy(vPosition);
|
|
128
|
+
vec2 dUdx = dFdx(vUv);
|
|
129
|
+
vec2 dUdy = dFdy(vUv);
|
|
130
|
+
|
|
131
|
+
float det = dUdx.x * dUdy.y - dUdx.y * dUdy.x;
|
|
132
|
+
float sgn = sign(det);
|
|
133
|
+
float invDet = sgn / max(abs(det), 1e-6);
|
|
134
|
+
|
|
135
|
+
// World-space tangent and bitangent from UV Jacobian (camera-independent)
|
|
136
|
+
vec3 T = normalize((dUdy.y * dPdx - dUdx.y * dPdy) * invDet);
|
|
137
|
+
vec3 B = normalize(cross(N, T)) * sgn;
|
|
138
|
+
|
|
139
|
+
// Height gradient in UV space (camera-independent)
|
|
140
|
+
float dhdu = (dUdy.y * dFdx(height) - dUdx.y * dFdy(height)) * invDet;
|
|
141
|
+
float dhdv = (dUdx.x * dFdy(height) - dUdy.x * dFdx(height)) * invDet;
|
|
142
|
+
|
|
143
|
+
float scale = strength * distance * 50.0;
|
|
144
|
+
return normalize(N - T * dhdu * scale - B * dhdv * scale);
|
|
145
|
+
}
|
|
146
|
+
#endif`;
|
|
@@ -33,11 +33,11 @@ export class DiffuseBSDF extends ProcessNode {
|
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
DiffuseBSDF.instanceSpecificDef = false;
|
|
36
|
-
DiffuseBSDF.glslFunction = `
|
|
37
|
-
vec3 _st_diffuseBSDF(vec3 color, float roughness, vec3 N) {
|
|
38
|
-
vec3 L = normalize(vec3(1.0, 2.0, 1.0));
|
|
39
|
-
float NdotL = max(dot(N, L), 0.0);
|
|
40
|
-
float diffuse = NdotL / 3.14159265;
|
|
41
|
-
vec3 ambient = color * 0.15;
|
|
42
|
-
return ambient + color * (diffuse * (1.0 - roughness * 0.5));
|
|
36
|
+
DiffuseBSDF.glslFunction = `
|
|
37
|
+
vec3 _st_diffuseBSDF(vec3 color, float roughness, vec3 N) {
|
|
38
|
+
vec3 L = normalize(vec3(1.0, 2.0, 1.0));
|
|
39
|
+
float NdotL = max(dot(N, L), 0.0);
|
|
40
|
+
float diffuse = NdotL / 3.14159265;
|
|
41
|
+
vec3 ambient = color * 0.15;
|
|
42
|
+
return ambient + color * (diffuse * (1.0 - roughness * 0.5));
|
|
43
43
|
}`;
|
|
@@ -30,7 +30,7 @@ export class Emission extends ProcessNode {
|
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
Emission.instanceSpecificDef = false;
|
|
33
|
-
Emission.glslFunction = `
|
|
34
|
-
vec3 _st_emission(vec3 color, float strength) {
|
|
35
|
-
return color * strength;
|
|
33
|
+
Emission.glslFunction = `
|
|
34
|
+
vec3 _st_emission(vec3 color, float strength) {
|
|
35
|
+
return color * strength;
|
|
36
36
|
}`;
|
|
@@ -35,17 +35,17 @@ export class GlassBSDF extends ProcessNode {
|
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
37
|
GlassBSDF.instanceSpecificDef = false;
|
|
38
|
-
GlassBSDF.glslFunction = `
|
|
39
|
-
vec3 _st_glassBSDF(vec3 color, float roughness, float ior, vec3 N) {
|
|
40
|
-
vec3 V = normalize(cameraPosition - vPosition);
|
|
41
|
-
vec3 L = normalize(vec3(1.0, 2.0, 1.0));
|
|
42
|
-
vec3 H = normalize(L + V);
|
|
43
|
-
float F0 = pow((1.0 - ior) / (1.0 + ior), 2.0);
|
|
44
|
-
float fresnel = F0 + (1.0 - F0) * pow(1.0 - max(dot(V, N), 0.0), 5.0);
|
|
45
|
-
float NdotH = max(dot(N, H), 0.0);
|
|
46
|
-
float a2 = roughness * roughness * roughness * roughness;
|
|
47
|
-
float D = a2 / max(3.14159 * pow(NdotH * NdotH * (a2 - 1.0) + 1.0, 2.0), 0.0001);
|
|
48
|
-
vec3 spec = vec3(1.0) * D * fresnel;
|
|
49
|
-
vec3 refr = color * (1.0 - fresnel) * (1.0 - roughness * 0.3);
|
|
50
|
-
return spec + refr;
|
|
38
|
+
GlassBSDF.glslFunction = `
|
|
39
|
+
vec3 _st_glassBSDF(vec3 color, float roughness, float ior, vec3 N) {
|
|
40
|
+
vec3 V = normalize(cameraPosition - vPosition);
|
|
41
|
+
vec3 L = normalize(vec3(1.0, 2.0, 1.0));
|
|
42
|
+
vec3 H = normalize(L + V);
|
|
43
|
+
float F0 = pow((1.0 - ior) / (1.0 + ior), 2.0);
|
|
44
|
+
float fresnel = F0 + (1.0 - F0) * pow(1.0 - max(dot(V, N), 0.0), 5.0);
|
|
45
|
+
float NdotH = max(dot(N, H), 0.0);
|
|
46
|
+
float a2 = roughness * roughness * roughness * roughness;
|
|
47
|
+
float D = a2 / max(3.14159 * pow(NdotH * NdotH * (a2 - 1.0) + 1.0, 2.0), 0.0001);
|
|
48
|
+
vec3 spec = vec3(1.0) * D * fresnel;
|
|
49
|
+
vec3 refr = color * (1.0 - fresnel) * (1.0 - roughness * 0.3);
|
|
50
|
+
return spec + refr;
|
|
51
51
|
}`;
|
|
@@ -33,18 +33,18 @@ export class GlossyBSDF extends ProcessNode {
|
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
GlossyBSDF.instanceSpecificDef = false;
|
|
36
|
-
GlossyBSDF.glslFunction = `
|
|
37
|
-
vec3 _st_glossyBSDF(vec3 color, float roughness, vec3 N) {
|
|
38
|
-
vec3 L = normalize(vec3(1.0, 2.0, 1.0));
|
|
39
|
-
vec3 V = normalize(cameraPosition - vPosition);
|
|
40
|
-
vec3 H = normalize(L + V);
|
|
41
|
-
float a = roughness * roughness;
|
|
42
|
-
float a2 = a * a;
|
|
43
|
-
float NdotH = max(dot(N, H), 0.0);
|
|
44
|
-
float D = a2 / max(3.14159265 * pow(NdotH * NdotH * (a2 - 1.0) + 1.0, 2.0), 0.0001);
|
|
45
|
-
float NdotL = max(dot(N, L), 0.0);
|
|
46
|
-
float NdotV = max(dot(N, V), 0.0001);
|
|
47
|
-
float k = (roughness + 1.0) * (roughness + 1.0) / 8.0;
|
|
48
|
-
float G = (NdotL / (NdotL * (1.0 - k) + k)) * (NdotV / (NdotV * (1.0 - k) + k));
|
|
49
|
-
return color * D * G / max(4.0 * NdotL * NdotV, 0.0001) * NdotL;
|
|
36
|
+
GlossyBSDF.glslFunction = `
|
|
37
|
+
vec3 _st_glossyBSDF(vec3 color, float roughness, vec3 N) {
|
|
38
|
+
vec3 L = normalize(vec3(1.0, 2.0, 1.0));
|
|
39
|
+
vec3 V = normalize(cameraPosition - vPosition);
|
|
40
|
+
vec3 H = normalize(L + V);
|
|
41
|
+
float a = roughness * roughness;
|
|
42
|
+
float a2 = a * a;
|
|
43
|
+
float NdotH = max(dot(N, H), 0.0);
|
|
44
|
+
float D = a2 / max(3.14159265 * pow(NdotH * NdotH * (a2 - 1.0) + 1.0, 2.0), 0.0001);
|
|
45
|
+
float NdotL = max(dot(N, L), 0.0);
|
|
46
|
+
float NdotV = max(dot(N, V), 0.0001);
|
|
47
|
+
float k = (roughness + 1.0) * (roughness + 1.0) / 8.0;
|
|
48
|
+
float G = (NdotL / (NdotL * (1.0 - k) + k)) * (NdotV / (NdotV * (1.0 - k) + k));
|
|
49
|
+
return color * D * G / max(4.0 * NdotL * NdotV, 0.0001) * NdotL;
|
|
50
50
|
}`;
|
|
@@ -41,7 +41,7 @@ export class MixShader extends ProcessNode {
|
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
43
|
MixShader.instanceSpecificDef = false;
|
|
44
|
-
MixShader.glslFunction = `
|
|
45
|
-
vec4 _st_mixShader(float fac, vec4 a, vec4 b) {
|
|
46
|
-
return mix(a, b, clamp(fac, 0.0, 1.0));
|
|
44
|
+
MixShader.glslFunction = `
|
|
45
|
+
vec4 _st_mixShader(float fac, vec4 a, vec4 b) {
|
|
46
|
+
return mix(a, b, clamp(fac, 0.0, 1.0));
|
|
47
47
|
}`;
|
|
@@ -48,43 +48,43 @@ export class PrincipledBSDF extends ProcessNode {
|
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
PrincipledBSDF.instanceSpecificDef = false;
|
|
51
|
-
PrincipledBSDF.glslFunction = `
|
|
52
|
-
// Set these on material.uniforms after compile()
|
|
53
|
-
#ifndef _ST_HAIR_LIGHT_UNIFORMS
|
|
54
|
-
#define _ST_HAIR_LIGHT_UNIFORMS
|
|
55
|
-
uniform vec3 uSunDirection;
|
|
56
|
-
uniform vec3 uSunColor;
|
|
57
|
-
uniform vec3 uAmbientColor;
|
|
58
|
-
#endif
|
|
59
|
-
|
|
60
|
-
vec3 _st_schlick(vec3 F0, float c) {
|
|
61
|
-
return F0 + (1.0 - F0) * pow(clamp(1.0 - c, 0.0, 1.0), 5.0);
|
|
62
|
-
}
|
|
63
|
-
float _st_ggx(float NdotH, float r) {
|
|
64
|
-
float a = r * r, a2 = a * a;
|
|
65
|
-
float d = (NdotH * NdotH) * (a2 - 1.0) + 1.0;
|
|
66
|
-
return a2 / max(3.14159 * d * d, 1e-7);
|
|
67
|
-
}
|
|
68
|
-
float _st_geo(float NdotX, float r) {
|
|
69
|
-
float k = (r + 1.0) * (r + 1.0) / 8.0;
|
|
70
|
-
return NdotX / max(NdotX * (1.0 - k) + k, 1e-7);
|
|
71
|
-
}
|
|
72
|
-
vec3 _st_principledBSDF(vec3 base, float metallic, float roughness, float ior, vec3 N) {
|
|
73
|
-
vec3 V = normalize(cameraPosition - vPosition);
|
|
74
|
-
vec3 L = normalize(uSunDirection);
|
|
75
|
-
vec3 H = normalize(L + V);
|
|
76
|
-
float r = max(roughness, 0.04);
|
|
77
|
-
float NdotL = max(dot(N, L), 0.0);
|
|
78
|
-
float NdotV = max(dot(N, V), 1e-4);
|
|
79
|
-
float NdotH = max(dot(N, H), 0.0);
|
|
80
|
-
float HdotV = max(dot(H, V), 0.0);
|
|
81
|
-
float f0s = pow((1.0 - ior) / (1.0 + ior), 2.0);
|
|
82
|
-
vec3 F0 = mix(vec3(f0s), base, metallic);
|
|
83
|
-
vec3 F = _st_schlick(F0, HdotV);
|
|
84
|
-
float D = _st_ggx(NdotH, r);
|
|
85
|
-
float G = _st_geo(NdotL, r) * _st_geo(NdotV, r);
|
|
86
|
-
vec3 spec = (D * G * F) / max(4.0 * NdotV * NdotL, 1e-7);
|
|
87
|
-
vec3 kD = (1.0 - F) * (1.0 - metallic);
|
|
88
|
-
vec3 ambient = uAmbientColor * base;
|
|
89
|
-
return ambient + (kD * base / 3.14159 + spec * uSunColor) * NdotL;
|
|
51
|
+
PrincipledBSDF.glslFunction = `
|
|
52
|
+
// Set these on material.uniforms after compile()
|
|
53
|
+
#ifndef _ST_HAIR_LIGHT_UNIFORMS
|
|
54
|
+
#define _ST_HAIR_LIGHT_UNIFORMS
|
|
55
|
+
uniform vec3 uSunDirection;
|
|
56
|
+
uniform vec3 uSunColor;
|
|
57
|
+
uniform vec3 uAmbientColor;
|
|
58
|
+
#endif
|
|
59
|
+
|
|
60
|
+
vec3 _st_schlick(vec3 F0, float c) {
|
|
61
|
+
return F0 + (1.0 - F0) * pow(clamp(1.0 - c, 0.0, 1.0), 5.0);
|
|
62
|
+
}
|
|
63
|
+
float _st_ggx(float NdotH, float r) {
|
|
64
|
+
float a = r * r, a2 = a * a;
|
|
65
|
+
float d = (NdotH * NdotH) * (a2 - 1.0) + 1.0;
|
|
66
|
+
return a2 / max(3.14159 * d * d, 1e-7);
|
|
67
|
+
}
|
|
68
|
+
float _st_geo(float NdotX, float r) {
|
|
69
|
+
float k = (r + 1.0) * (r + 1.0) / 8.0;
|
|
70
|
+
return NdotX / max(NdotX * (1.0 - k) + k, 1e-7);
|
|
71
|
+
}
|
|
72
|
+
vec3 _st_principledBSDF(vec3 base, float metallic, float roughness, float ior, vec3 N) {
|
|
73
|
+
vec3 V = normalize(cameraPosition - vPosition);
|
|
74
|
+
vec3 L = normalize(uSunDirection);
|
|
75
|
+
vec3 H = normalize(L + V);
|
|
76
|
+
float r = max(roughness, 0.04);
|
|
77
|
+
float NdotL = max(dot(N, L), 0.0);
|
|
78
|
+
float NdotV = max(dot(N, V), 1e-4);
|
|
79
|
+
float NdotH = max(dot(N, H), 0.0);
|
|
80
|
+
float HdotV = max(dot(H, V), 0.0);
|
|
81
|
+
float f0s = pow((1.0 - ior) / (1.0 + ior), 2.0);
|
|
82
|
+
vec3 F0 = mix(vec3(f0s), base, metallic);
|
|
83
|
+
vec3 F = _st_schlick(F0, HdotV);
|
|
84
|
+
float D = _st_ggx(NdotH, r);
|
|
85
|
+
float G = _st_geo(NdotL, r) * _st_geo(NdotV, r);
|
|
86
|
+
vec3 spec = (D * G * F) / max(4.0 * NdotV * NdotL, 1e-7);
|
|
87
|
+
vec3 kD = (1.0 - F) * (1.0 - metallic);
|
|
88
|
+
vec3 ambient = uAmbientColor * base;
|
|
89
|
+
return ambient + (kD * base / 3.14159 + spec * uSunColor) * NdotL;
|
|
90
90
|
}`;
|
|
@@ -64,74 +64,74 @@ export class PrincipledHair extends ProcessNode {
|
|
|
64
64
|
}
|
|
65
65
|
PrincipledHair.instanceSpecificDef = false;
|
|
66
66
|
// Light uniforms guarded by a #define so they survive alongside PrincipledBSDF in the same graph.
|
|
67
|
-
PrincipledHair.glslFunction = `
|
|
68
|
-
#ifndef _ST_HAIR_LIGHT_UNIFORMS
|
|
69
|
-
#define _ST_HAIR_LIGHT_UNIFORMS
|
|
70
|
-
uniform vec3 uSunDirection;
|
|
71
|
-
uniform vec3 uSunColor;
|
|
72
|
-
uniform vec3 uAmbientColor;
|
|
73
|
-
#endif
|
|
74
|
-
|
|
75
|
-
float _st_hairHash(float n) {
|
|
76
|
-
return fract(sin(n * 127.1 + 311.7) * 43758.5453);
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
// Kajiya-Kay dual-lobe hair BSDF.
|
|
80
|
-
// T = strand tangent (unit, world space)
|
|
81
|
-
// R = primary specular exponent = 1 / (roughness^2)
|
|
82
|
-
// R2 = secondary specular exponent = 1 / (radialRoughness^2)
|
|
83
|
-
vec3 _st_principledHair(
|
|
84
|
-
vec3 color,
|
|
85
|
-
float roughness,
|
|
86
|
-
float radialRoughness,
|
|
87
|
-
float coat,
|
|
88
|
-
float ior,
|
|
89
|
-
float offset,
|
|
90
|
-
float randomColor,
|
|
91
|
-
float randomRoughness,
|
|
92
|
-
float rnd,
|
|
93
|
-
vec3 T
|
|
94
|
-
) {
|
|
95
|
-
// Per-strand variation
|
|
96
|
-
float rc = _st_hairHash(rnd * 1.3731 + 0.1);
|
|
97
|
-
float rr = _st_hairHash(rnd * 2.7183 + 0.2);
|
|
98
|
-
color = mix(color, color * (0.6 + 0.8 * rc), randomColor);
|
|
99
|
-
roughness = clamp(roughness + (rr - 0.5) * randomRoughness * 0.5, 0.02, 1.0);
|
|
100
|
-
|
|
101
|
-
vec3 V = normalize(cameraPosition - vPosition);
|
|
102
|
-
vec3 L = normalize(uSunDirection);
|
|
103
|
-
vec3 H = normalize(L + V);
|
|
104
|
-
vec3 N = normalize(vNormal);
|
|
105
|
-
|
|
106
|
-
// Kajiya-Kay diffuse: sin(angle T, L)
|
|
107
|
-
float cosT = dot(T, L);
|
|
108
|
-
float sinT = sqrt(max(1.0 - cosT * cosT, 0.0));
|
|
109
|
-
float diff = sinT * max(dot(N, L) * 0.5 + 0.5, 0.0); // wrap diffuse
|
|
110
|
-
|
|
111
|
-
// R lobe — primary specular, shifted by +offset along normal
|
|
112
|
-
float f0 = pow(clamp((1.0 - ior) / (1.0 + ior), 0.0, 1.0), 2.0);
|
|
113
|
-
vec3 T1 = normalize(T + offset * N);
|
|
114
|
-
float cosTH1 = dot(T1, H);
|
|
115
|
-
float sinTH1 = sqrt(max(1.0 - cosTH1 * cosTH1, 0.0));
|
|
116
|
-
float exp1 = max(1.0 / max(roughness * roughness, 0.001), 1.0);
|
|
117
|
-
float spec1 = pow(sinTH1, exp1);
|
|
118
|
-
vec3 F1 = vec3(f0) + (vec3(1.0) - vec3(f0)) * pow(1.0 - max(dot(H, V), 0.0), 5.0);
|
|
119
|
-
|
|
120
|
-
// TRT lobe — secondary specular, shifted by -2*offset, colored
|
|
121
|
-
vec3 T2 = normalize(T - 2.0 * offset * N);
|
|
122
|
-
float cosTH2 = dot(T2, H);
|
|
123
|
-
float sinTH2 = sqrt(max(1.0 - cosTH2 * cosTH2, 0.0));
|
|
124
|
-
float rr2 = clamp(radialRoughness, 0.02, 1.0);
|
|
125
|
-
float exp2 = max(1.0 / max(rr2 * rr2, 0.001), 1.0);
|
|
126
|
-
float spec2 = pow(sinTH2, exp2) * 0.25;
|
|
127
|
-
|
|
128
|
-
// Coat gloss
|
|
129
|
-
float cosTHc = dot(T, H);
|
|
130
|
-
float sinTHc = sqrt(max(1.0 - cosTHc * cosTHc, 0.0));
|
|
131
|
-
float coatSpec = pow(sinTHc, 128.0) * coat;
|
|
132
|
-
|
|
133
|
-
vec3 diffuse = color * (uSunColor * diff + uAmbientColor);
|
|
134
|
-
vec3 specular = uSunColor * (F1 * spec1 + vec3(coatSpec)) + color * uSunColor * spec2;
|
|
135
|
-
|
|
136
|
-
return diffuse + specular;
|
|
67
|
+
PrincipledHair.glslFunction = `
|
|
68
|
+
#ifndef _ST_HAIR_LIGHT_UNIFORMS
|
|
69
|
+
#define _ST_HAIR_LIGHT_UNIFORMS
|
|
70
|
+
uniform vec3 uSunDirection;
|
|
71
|
+
uniform vec3 uSunColor;
|
|
72
|
+
uniform vec3 uAmbientColor;
|
|
73
|
+
#endif
|
|
74
|
+
|
|
75
|
+
float _st_hairHash(float n) {
|
|
76
|
+
return fract(sin(n * 127.1 + 311.7) * 43758.5453);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Kajiya-Kay dual-lobe hair BSDF.
|
|
80
|
+
// T = strand tangent (unit, world space)
|
|
81
|
+
// R = primary specular exponent = 1 / (roughness^2)
|
|
82
|
+
// R2 = secondary specular exponent = 1 / (radialRoughness^2)
|
|
83
|
+
vec3 _st_principledHair(
|
|
84
|
+
vec3 color,
|
|
85
|
+
float roughness,
|
|
86
|
+
float radialRoughness,
|
|
87
|
+
float coat,
|
|
88
|
+
float ior,
|
|
89
|
+
float offset,
|
|
90
|
+
float randomColor,
|
|
91
|
+
float randomRoughness,
|
|
92
|
+
float rnd,
|
|
93
|
+
vec3 T
|
|
94
|
+
) {
|
|
95
|
+
// Per-strand variation
|
|
96
|
+
float rc = _st_hairHash(rnd * 1.3731 + 0.1);
|
|
97
|
+
float rr = _st_hairHash(rnd * 2.7183 + 0.2);
|
|
98
|
+
color = mix(color, color * (0.6 + 0.8 * rc), randomColor);
|
|
99
|
+
roughness = clamp(roughness + (rr - 0.5) * randomRoughness * 0.5, 0.02, 1.0);
|
|
100
|
+
|
|
101
|
+
vec3 V = normalize(cameraPosition - vPosition);
|
|
102
|
+
vec3 L = normalize(uSunDirection);
|
|
103
|
+
vec3 H = normalize(L + V);
|
|
104
|
+
vec3 N = normalize(vNormal);
|
|
105
|
+
|
|
106
|
+
// Kajiya-Kay diffuse: sin(angle T, L)
|
|
107
|
+
float cosT = dot(T, L);
|
|
108
|
+
float sinT = sqrt(max(1.0 - cosT * cosT, 0.0));
|
|
109
|
+
float diff = sinT * max(dot(N, L) * 0.5 + 0.5, 0.0); // wrap diffuse
|
|
110
|
+
|
|
111
|
+
// R lobe — primary specular, shifted by +offset along normal
|
|
112
|
+
float f0 = pow(clamp((1.0 - ior) / (1.0 + ior), 0.0, 1.0), 2.0);
|
|
113
|
+
vec3 T1 = normalize(T + offset * N);
|
|
114
|
+
float cosTH1 = dot(T1, H);
|
|
115
|
+
float sinTH1 = sqrt(max(1.0 - cosTH1 * cosTH1, 0.0));
|
|
116
|
+
float exp1 = max(1.0 / max(roughness * roughness, 0.001), 1.0);
|
|
117
|
+
float spec1 = pow(sinTH1, exp1);
|
|
118
|
+
vec3 F1 = vec3(f0) + (vec3(1.0) - vec3(f0)) * pow(1.0 - max(dot(H, V), 0.0), 5.0);
|
|
119
|
+
|
|
120
|
+
// TRT lobe — secondary specular, shifted by -2*offset, colored
|
|
121
|
+
vec3 T2 = normalize(T - 2.0 * offset * N);
|
|
122
|
+
float cosTH2 = dot(T2, H);
|
|
123
|
+
float sinTH2 = sqrt(max(1.0 - cosTH2 * cosTH2, 0.0));
|
|
124
|
+
float rr2 = clamp(radialRoughness, 0.02, 1.0);
|
|
125
|
+
float exp2 = max(1.0 / max(rr2 * rr2, 0.001), 1.0);
|
|
126
|
+
float spec2 = pow(sinTH2, exp2) * 0.25;
|
|
127
|
+
|
|
128
|
+
// Coat gloss
|
|
129
|
+
float cosTHc = dot(T, H);
|
|
130
|
+
float sinTHc = sqrt(max(1.0 - cosTHc * cosTHc, 0.0));
|
|
131
|
+
float coatSpec = pow(sinTHc, 128.0) * coat;
|
|
132
|
+
|
|
133
|
+
vec3 diffuse = color * (uSunColor * diff + uAmbientColor);
|
|
134
|
+
vec3 specular = uSunColor * (F1 * spec1 + vec3(coatSpec)) + color * uSunColor * spec2;
|
|
135
|
+
|
|
136
|
+
return diffuse + specular;
|
|
137
137
|
}`;
|
|
@@ -43,25 +43,25 @@ export class PrincipledVolume extends ProcessNode {
|
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
PrincipledVolume.instanceSpecificDef = false;
|
|
46
|
-
PrincipledVolume.glslFunction = `
|
|
47
|
-
vec3 _st_principledVolume(
|
|
48
|
-
vec3 scatterColor, float density,
|
|
49
|
-
float anisotropy, vec3 absorptionColor,
|
|
50
|
-
vec3 emissionColor, float emissionStrength,
|
|
51
|
-
float blackbodyIntensity, float temperature
|
|
52
|
-
) {
|
|
53
|
-
float g = clamp(anisotropy, -0.9999, 0.9999);
|
|
54
|
-
float g2 = g * g;
|
|
55
|
-
float phase = (1.0 - g2) / pow(1.0 + g2, 1.5);
|
|
56
|
-
|
|
57
|
-
vec3 scatter = scatterColor * density * phase;
|
|
58
|
-
vec3 absorption = absorptionColor * density;
|
|
59
|
-
vec3 emission = emissionColor * emissionStrength;
|
|
60
|
-
|
|
61
|
-
// Simplified blackbody tint: blend toward hot white at high temperature
|
|
62
|
-
float tNorm = clamp((temperature - 800.0) / 4200.0, 0.0, 1.0);
|
|
63
|
-
vec3 bb = mix(vec3(1.0, 0.2, 0.0), vec3(1.0, 0.95, 0.8), tNorm);
|
|
64
|
-
emission += bb * blackbodyIntensity * density;
|
|
65
|
-
|
|
66
|
-
return scatter + emission - absorption * 0.5;
|
|
46
|
+
PrincipledVolume.glslFunction = `
|
|
47
|
+
vec3 _st_principledVolume(
|
|
48
|
+
vec3 scatterColor, float density,
|
|
49
|
+
float anisotropy, vec3 absorptionColor,
|
|
50
|
+
vec3 emissionColor, float emissionStrength,
|
|
51
|
+
float blackbodyIntensity, float temperature
|
|
52
|
+
) {
|
|
53
|
+
float g = clamp(anisotropy, -0.9999, 0.9999);
|
|
54
|
+
float g2 = g * g;
|
|
55
|
+
float phase = (1.0 - g2) / pow(1.0 + g2, 1.5);
|
|
56
|
+
|
|
57
|
+
vec3 scatter = scatterColor * density * phase;
|
|
58
|
+
vec3 absorption = absorptionColor * density;
|
|
59
|
+
vec3 emission = emissionColor * emissionStrength;
|
|
60
|
+
|
|
61
|
+
// Simplified blackbody tint: blend toward hot white at high temperature
|
|
62
|
+
float tNorm = clamp((temperature - 800.0) / 4200.0, 0.0, 1.0);
|
|
63
|
+
vec3 bb = mix(vec3(1.0, 0.2, 0.0), vec3(1.0, 0.95, 0.8), tNorm);
|
|
64
|
+
emission += bb * blackbodyIntensity * density;
|
|
65
|
+
|
|
66
|
+
return scatter + emission - absorption * 0.5;
|
|
67
67
|
}`;
|
|
@@ -36,11 +36,11 @@ export class RefractionBSDF extends ProcessNode {
|
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
RefractionBSDF.instanceSpecificDef = false;
|
|
39
|
-
RefractionBSDF.glslFunction = `
|
|
40
|
-
vec3 _st_refractionBSDF(vec3 color, float roughness, float ior, vec3 N) {
|
|
41
|
-
vec3 V = normalize(cameraPosition - vPosition);
|
|
42
|
-
vec3 refDir = refract(-V, N, 1.0 / ior);
|
|
43
|
-
float fresnel = pow(1.0 - max(dot(V, N), 0.0), 5.0);
|
|
44
|
-
vec3 refColor = color * (1.0 - fresnel) * (1.0 - roughness * 0.5);
|
|
45
|
-
return refColor;
|
|
39
|
+
RefractionBSDF.glslFunction = `
|
|
40
|
+
vec3 _st_refractionBSDF(vec3 color, float roughness, float ior, vec3 N) {
|
|
41
|
+
vec3 V = normalize(cameraPosition - vPosition);
|
|
42
|
+
vec3 refDir = refract(-V, N, 1.0 / ior);
|
|
43
|
+
float fresnel = pow(1.0 - max(dot(V, N), 0.0), 5.0);
|
|
44
|
+
vec3 refColor = color * (1.0 - fresnel) * (1.0 - roughness * 0.5);
|
|
45
|
+
return refColor;
|
|
46
46
|
}`;
|
|
@@ -34,16 +34,16 @@ export class SheenBSDF extends ProcessNode {
|
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
SheenBSDF.instanceSpecificDef = false;
|
|
37
|
-
SheenBSDF.glslFunction = `
|
|
38
|
-
vec3 _st_sheenBSDF(vec3 color, float roughness, vec3 N) {
|
|
39
|
-
vec3 V = normalize(cameraPosition - vPosition);
|
|
40
|
-
vec3 L = normalize(vec3(1.0, 2.0, 1.0));
|
|
41
|
-
vec3 H = normalize(L + V);
|
|
42
|
-
float NdotL = max(dot(N, L), 0.0);
|
|
43
|
-
float NdotV = max(dot(N, V), 0.0001);
|
|
44
|
-
float NdotH = max(dot(N, H), 0.0);
|
|
45
|
-
float sinThetaH = sqrt(max(1.0 - NdotH * NdotH, 0.0));
|
|
46
|
-
float r2 = roughness * roughness;
|
|
47
|
-
float sheen = (2.0 + 1.0 / r2) * pow(sinThetaH, 1.0 / r2) / (2.0 * 3.14159);
|
|
48
|
-
return color * sheen * NdotL / max(NdotL + NdotV - NdotL * NdotV, 0.0001) + color * 0.03;
|
|
37
|
+
SheenBSDF.glslFunction = `
|
|
38
|
+
vec3 _st_sheenBSDF(vec3 color, float roughness, vec3 N) {
|
|
39
|
+
vec3 V = normalize(cameraPosition - vPosition);
|
|
40
|
+
vec3 L = normalize(vec3(1.0, 2.0, 1.0));
|
|
41
|
+
vec3 H = normalize(L + V);
|
|
42
|
+
float NdotL = max(dot(N, L), 0.0);
|
|
43
|
+
float NdotV = max(dot(N, V), 0.0001);
|
|
44
|
+
float NdotH = max(dot(N, H), 0.0);
|
|
45
|
+
float sinThetaH = sqrt(max(1.0 - NdotH * NdotH, 0.0));
|
|
46
|
+
float r2 = roughness * roughness;
|
|
47
|
+
float sheen = (2.0 + 1.0 / r2) * pow(sinThetaH, 1.0 / r2) / (2.0 * 3.14159);
|
|
48
|
+
return color * sheen * NdotL / max(NdotL + NdotV - NdotL * NdotV, 0.0001) + color * 0.03;
|
|
49
49
|
}`;
|
|
@@ -36,19 +36,19 @@ export class SpecularBSDF extends ProcessNode {
|
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
SpecularBSDF.instanceSpecificDef = false;
|
|
39
|
-
SpecularBSDF.glslFunction = `
|
|
40
|
-
vec3 _st_specularBSDF(vec3 base, vec3 spec, float roughness, vec3 N) {
|
|
41
|
-
vec3 L = normalize(vec3(1.0, 2.0, 1.0));
|
|
42
|
-
vec3 V = normalize(cameraPosition - vPosition);
|
|
43
|
-
vec3 H = normalize(L + V);
|
|
44
|
-
float NdotL = max(dot(N, L), 0.0);
|
|
45
|
-
float NdotH = max(dot(N, H), 0.0);
|
|
46
|
-
float NdotV = max(dot(N, V), 0.0001);
|
|
47
|
-
float a2 = pow(roughness, 4.0);
|
|
48
|
-
float D = a2 / max(3.14159 * pow(NdotH * NdotH * (a2 - 1.0) + 1.0, 2.0), 0.0001);
|
|
49
|
-
float k = (roughness + 1.0) * (roughness + 1.0) / 8.0;
|
|
50
|
-
float G = (NdotL / (NdotL * (1.0 - k) + k)) * (NdotV / (NdotV * (1.0 - k) + k));
|
|
51
|
-
vec3 F = spec + (1.0 - spec) * pow(1.0 - max(dot(H, V), 0.0), 5.0);
|
|
52
|
-
vec3 specColor = D * G * F / max(4.0 * NdotL * NdotV, 0.0001);
|
|
53
|
-
return (base / 3.14159 + specColor) * NdotL + base * 0.04;
|
|
39
|
+
SpecularBSDF.glslFunction = `
|
|
40
|
+
vec3 _st_specularBSDF(vec3 base, vec3 spec, float roughness, vec3 N) {
|
|
41
|
+
vec3 L = normalize(vec3(1.0, 2.0, 1.0));
|
|
42
|
+
vec3 V = normalize(cameraPosition - vPosition);
|
|
43
|
+
vec3 H = normalize(L + V);
|
|
44
|
+
float NdotL = max(dot(N, L), 0.0);
|
|
45
|
+
float NdotH = max(dot(N, H), 0.0);
|
|
46
|
+
float NdotV = max(dot(N, V), 0.0001);
|
|
47
|
+
float a2 = pow(roughness, 4.0);
|
|
48
|
+
float D = a2 / max(3.14159 * pow(NdotH * NdotH * (a2 - 1.0) + 1.0, 2.0), 0.0001);
|
|
49
|
+
float k = (roughness + 1.0) * (roughness + 1.0) / 8.0;
|
|
50
|
+
float G = (NdotL / (NdotL * (1.0 - k) + k)) * (NdotV / (NdotV * (1.0 - k) + k));
|
|
51
|
+
vec3 F = spec + (1.0 - spec) * pow(1.0 - max(dot(H, V), 0.0), 5.0);
|
|
52
|
+
vec3 specColor = D * G * F / max(4.0 * NdotL * NdotV, 0.0001);
|
|
53
|
+
return (base / 3.14159 + specColor) * NdotL + base * 0.04;
|
|
54
54
|
}`;
|
|
@@ -36,11 +36,11 @@ export class SubsurfaceScattering extends ProcessNode {
|
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
SubsurfaceScattering.instanceSpecificDef = false;
|
|
39
|
-
SubsurfaceScattering.glslFunction = `
|
|
40
|
-
vec3 _st_sss(vec3 color, float scale, vec3 radius, vec3 N) {
|
|
41
|
-
vec3 L = normalize(vec3(1.0, 2.0, 1.0));
|
|
42
|
-
float wrap = max(dot(N, L) * 0.5 + 0.5, 0.0);
|
|
43
|
-
vec3 scatter = color * radius * wrap * scale;
|
|
44
|
-
float back = max(-dot(N, L), 0.0) * scale * 0.3;
|
|
45
|
-
return color * (0.04 + wrap * 0.5) + scatter + color * back;
|
|
39
|
+
SubsurfaceScattering.glslFunction = `
|
|
40
|
+
vec3 _st_sss(vec3 color, float scale, vec3 radius, vec3 N) {
|
|
41
|
+
vec3 L = normalize(vec3(1.0, 2.0, 1.0));
|
|
42
|
+
float wrap = max(dot(N, L) * 0.5 + 0.5, 0.0);
|
|
43
|
+
vec3 scatter = color * radius * wrap * scale;
|
|
44
|
+
float back = max(-dot(N, L), 0.0) * scale * 0.3;
|
|
45
|
+
return color * (0.04 + wrap * 0.5) + scatter + color * back;
|
|
46
46
|
}`;
|
|
@@ -35,10 +35,10 @@ export class ToonBSDF extends ProcessNode {
|
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
37
|
ToonBSDF.instanceSpecificDef = false;
|
|
38
|
-
ToonBSDF.glslFunction = `
|
|
39
|
-
vec3 _st_toonBSDF(vec3 color, float size, float smoothWidth, vec3 N) {
|
|
40
|
-
vec3 L = normalize(vec3(1.0, 2.0, 1.0));
|
|
41
|
-
float NdotL = dot(N, L) * 0.5 + 0.5;
|
|
42
|
-
float band = smoothstep(size - smoothWidth, size + smoothWidth, NdotL);
|
|
43
|
-
return color * band + color * 0.1;
|
|
38
|
+
ToonBSDF.glslFunction = `
|
|
39
|
+
vec3 _st_toonBSDF(vec3 color, float size, float smoothWidth, vec3 N) {
|
|
40
|
+
vec3 L = normalize(vec3(1.0, 2.0, 1.0));
|
|
41
|
+
float NdotL = dot(N, L) * 0.5 + 0.5;
|
|
42
|
+
float band = smoothstep(size - smoothWidth, size + smoothWidth, NdotL);
|
|
43
|
+
return color * band + color * 0.1;
|
|
44
44
|
}`;
|
|
@@ -31,9 +31,9 @@ export class TranslucentBSDF extends ProcessNode {
|
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
TranslucentBSDF.instanceSpecificDef = false;
|
|
34
|
-
TranslucentBSDF.glslFunction = `
|
|
35
|
-
vec3 _st_translucentBSDF(vec3 color, vec3 N) {
|
|
36
|
-
vec3 L = normalize(vec3(1.0, 2.0, 1.0));
|
|
37
|
-
float backDot = max(dot(-N, L), 0.0);
|
|
38
|
-
return color * backDot / 3.14159265 + color * 0.02;
|
|
34
|
+
TranslucentBSDF.glslFunction = `
|
|
35
|
+
vec3 _st_translucentBSDF(vec3 color, vec3 N) {
|
|
36
|
+
vec3 L = normalize(vec3(1.0, 2.0, 1.0));
|
|
37
|
+
float backDot = max(dot(-N, L), 0.0);
|
|
38
|
+
return color * backDot / 3.14159265 + color * 0.02;
|
|
39
39
|
}`;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ProcessNode } from '../../core/ProcessNode.js';
|
|
2
|
+
import type { NodeMetadata } from '../../core/ShaderNode.js';
|
|
3
|
+
import type { CompileContext } from '../../core/CompileContext.js';
|
|
4
|
+
/**
|
|
5
|
+
* Transparent BSDF — Blender "Transparent BSDF" node equivalent.
|
|
6
|
+
* Passes light through unfiltered — full transparency, colorless, no inputs.
|
|
7
|
+
* Combine with MixShader/AddShader to build cutout, fresnel-fade, or
|
|
8
|
+
* rim-light materials without a hand-written GLSL output node.
|
|
9
|
+
*
|
|
10
|
+
* Outputs: BSDF (shader) — always vec4(0.0, 0.0, 0.0, 0.0)
|
|
11
|
+
*/
|
|
12
|
+
export declare class TransparentBSDF extends ProcessNode {
|
|
13
|
+
get nodeType(): string;
|
|
14
|
+
static instanceSpecificDef: boolean;
|
|
15
|
+
get metadata(): NodeMetadata;
|
|
16
|
+
private readonly _inputs;
|
|
17
|
+
private readonly _outputs;
|
|
18
|
+
constructor();
|
|
19
|
+
getInputSockets(): Record<string, import("../../index.js").InputSocket<unknown>>;
|
|
20
|
+
getOutputSockets(): Record<string, import("../../index.js").OutputSocket>;
|
|
21
|
+
compileDefs(): string;
|
|
22
|
+
/** Always fully transparent — a constant, not a dynamic value, so this always requests transparent:true. */
|
|
23
|
+
wantsTransparency(): boolean;
|
|
24
|
+
compileCall(ctx: CompileContext): string;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=TransparentBSDF.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TransparentBSDF.d.ts","sourceRoot":"","sources":["../../../src/nodes/process/TransparentBSDF.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAElE;;;;;;;GAOG;AACH,qBAAa,eAAgB,SAAQ,WAAW;IAC9C,IAAI,QAAQ,WAA+B;IAC3C,MAAM,CAAC,mBAAmB,UAAQ;IAElC,IAAI,QAAQ,IAAI,YAAY,CAE3B;IAED,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2E;IACnG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmE;;IAQ5F,eAAe;IACf,gBAAgB;IAChB,WAAW;IAEX,4GAA4G;IAC5G,iBAAiB,IAAI,OAAO;IAE5B,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAGzC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ProcessNode } from '../../core/ProcessNode.js';
|
|
2
|
+
/**
|
|
3
|
+
* Transparent BSDF — Blender "Transparent BSDF" node equivalent.
|
|
4
|
+
* Passes light through unfiltered — full transparency, colorless, no inputs.
|
|
5
|
+
* Combine with MixShader/AddShader to build cutout, fresnel-fade, or
|
|
6
|
+
* rim-light materials without a hand-written GLSL output node.
|
|
7
|
+
*
|
|
8
|
+
* Outputs: BSDF (shader) — always vec4(0.0, 0.0, 0.0, 0.0)
|
|
9
|
+
*/
|
|
10
|
+
export class TransparentBSDF extends ProcessNode {
|
|
11
|
+
get nodeType() { return 'TransparentBSDF'; }
|
|
12
|
+
get metadata() {
|
|
13
|
+
return { label: 'Transparent BSDF', category: 'Shader', color: '#336699', cost: 'low' };
|
|
14
|
+
}
|
|
15
|
+
constructor() {
|
|
16
|
+
super('TransparentBSDF');
|
|
17
|
+
this._inputs = this.createInputs({}, {});
|
|
18
|
+
this._outputs = this.createOutputs({ BSDF: 'shader' });
|
|
19
|
+
}
|
|
20
|
+
getInputSockets() { return this._inputs; }
|
|
21
|
+
getOutputSockets() { return this._outputs; }
|
|
22
|
+
compileDefs() { return ''; }
|
|
23
|
+
/** Always fully transparent — a constant, not a dynamic value, so this always requests transparent:true. */
|
|
24
|
+
wantsTransparency() { return true; }
|
|
25
|
+
compileCall(ctx) {
|
|
26
|
+
return `vec4 ${ctx.outputVar(this, 'BSDF')} = vec4(0.0, 0.0, 0.0, 0.0);`;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
TransparentBSDF.instanceSpecificDef = false;
|
|
@@ -30,7 +30,7 @@ export class VolumeAbsorption extends ProcessNode {
|
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
VolumeAbsorption.instanceSpecificDef = false;
|
|
33
|
-
VolumeAbsorption.glslFunction = `
|
|
34
|
-
vec3 _st_volumeAbsorption(vec3 color, float density) {
|
|
35
|
-
return color * density;
|
|
33
|
+
VolumeAbsorption.glslFunction = `
|
|
34
|
+
vec3 _st_volumeAbsorption(vec3 color, float density) {
|
|
35
|
+
return color * density;
|
|
36
36
|
}`;
|
|
@@ -32,11 +32,11 @@ export class VolumeScatter extends ProcessNode {
|
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
34
|
VolumeScatter.instanceSpecificDef = false;
|
|
35
|
-
VolumeScatter.glslFunction = `
|
|
36
|
-
vec3 _st_volumeScatter(vec3 color, float density, float anisotropy) {
|
|
37
|
-
float g = clamp(anisotropy, -0.9999, 0.9999);
|
|
38
|
-
float g2 = g * g;
|
|
39
|
-
// HG phase at cosTheta=0 (isotropic approximation for surface shading context)
|
|
40
|
-
float phase = (1.0 - g2) / pow(1.0 + g2, 1.5);
|
|
41
|
-
return color * density * phase;
|
|
35
|
+
VolumeScatter.glslFunction = `
|
|
36
|
+
vec3 _st_volumeScatter(vec3 color, float density, float anisotropy) {
|
|
37
|
+
float g = clamp(anisotropy, -0.9999, 0.9999);
|
|
38
|
+
float g2 = g * g;
|
|
39
|
+
// HG phase at cosTheta=0 (isotropic approximation for surface shading context)
|
|
40
|
+
float phase = (1.0 - g2) / pow(1.0 + g2, 1.5);
|
|
41
|
+
return color * density * phase;
|
|
42
42
|
}`;
|