Shader fixes

This commit is contained in:
luboslenco
2025-07-16 17:40:00 +02:00
parent fe9b47d6c1
commit e4c2c0c7c5
3 changed files with 69 additions and 46 deletions
+11 -9
View File
@@ -316,15 +316,17 @@ function uniforms_set_context_const(location: i32, c: shader_const_t): bool {
v.y = (-zfar * znear) / (zfar - znear);
}
else if (starts_with(c.link, "_size(")) {
let tex: string = substring(c.link, 6, c.link.length - 1);
for (let i: i32 = 0; i < math_floor(_render_path_bind_params.length / 2); ++i) {
let pos: i32 = i * 2; // bind params = [texture, sampler_id]
let sampler_id: string = _render_path_bind_params[pos + 1];
if (sampler_id == tex) {
let rt_id: string = _render_path_bind_params[pos];
let rt: render_target_t = map_get(render_path_render_targets, rt_id);
v.x = rt.width;
v.y = rt.height;
if (_render_path_bind_params != null) {
let tex: string = substring(c.link, 6, c.link.length - 1);
for (let i: i32 = 0; i < math_floor(_render_path_bind_params.length / 2); ++i) {
let pos: i32 = i * 2; // bind params = [texture, sampler_id]
let sampler_id: string = _render_path_bind_params[pos + 1];
if (sampler_id == tex) {
let rt_id: string = _render_path_bind_params[pos];
let rt: render_target_t = map_get(render_path_render_targets, rt_id);
v.x = rt.width;
v.y = rt.height;
}
}
}
}
+20 -14
View File
@@ -638,10 +638,10 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t)
node_shader_add_texture(parser_material_kong, "" + tex_name, "_" + tex_name);
let store: string = parser_material_store_var_name(node);
let pi: f32 = math_pi();
parser_material_write(parser_material_kong, "var " + store + "_rad: float = " + angle + " * (" + pi + " / 180);");
parser_material_write(parser_material_kong, "var " + store + "_rad: float = " + angle + " * (" + pi + " / 180.0);");
parser_material_write(parser_material_kong, "var " + store + "_x: float = cos(" + store + "_rad);");
parser_material_write(parser_material_kong, "var " + store + "_y: float = sin(" + store + "_rad);");
return "sample(" + tex_name + ", sampler_linear, + input.tex_coord + float2(" + store + "_x, " + store + "_y) * " + mask + ").rgb;";
return "sample(" + tex_name + ", sampler_linear, input.tex_coord + float2(" + store + "_x, " + store + "_y) * " + mask + ").rgb";
}
else if (node.type == "BLUR") {
if (parser_material_blur_passthrough) {
@@ -651,18 +651,18 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t)
if (strength == "0.0") {
return "float3(0.0, 0.0, 0.0)";
}
let steps: string = "int(" + strength + " * 10 + 1)";
let steps: string = "(" + strength + " * 10.0 + 1.0)";
let tex_name: string = "texblur_" + parser_material_node_name(node);
node_shader_add_texture(parser_material_kong, "" + tex_name, "_" + tex_name);
node_shader_add_constant(parser_material_kong, "" + tex_name + "_size: float2", "_size(" + tex_name + ")");
let store: string = parser_material_store_var_name(node);
parser_material_write(parser_material_kong, "var " + store + "_res: float3 = float3(0.0, 0.0, 0.0);");
parser_material_write(parser_material_kong, "for (var i: int = -" + steps + "; i <= " + steps + "; i += 1) {");
parser_material_write(parser_material_kong, "for (var j: int = -" + steps + "; j <= " + steps + "; j += 1) {");
parser_material_write(parser_material_kong, store + "_res += sample(" + tex_name + ", sampler_linear, input.tex_coord + float2(i, j) / constants." + tex_name + "_size).rgb;");
parser_material_write(parser_material_kong, "for (var i: int = 0; i <= int(" + steps + " * 2.0); i += 1) {");
parser_material_write(parser_material_kong, "for (var j: int = 0; j <= int(" + steps + " * 2.0); j += 1) {");
parser_material_write(parser_material_kong, store + "_res += sample(" + tex_name + ", sampler_linear, input.tex_coord + float2(float(i) - " + steps + ", float(j) - " + steps + ") / constants." + tex_name + "_size).rgb;");
parser_material_write(parser_material_kong, "}");
parser_material_write(parser_material_kong, "}");
parser_material_write(parser_material_kong, store + "_res /= (" + steps + " * 2 + 1) * (" + steps + " * 2 + 1);");
parser_material_write(parser_material_kong, store + "_res = " + store + "_res / (" + steps + " * 2.0 + 1.0) * (" + steps + " * 2.0 + 1.0);");
return store + "_res";
}
else if (node.type == "HUE_SAT") {
@@ -672,7 +672,7 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t)
let val: string = parser_material_parse_value_input(node.inputs[2]);
let fac: string = parser_material_parse_value_input(node.inputs[3]);
let col: string = parser_material_parse_vector_input(node.inputs[4]);
return "hue_sat(" + col + ", float4(" + hue + "-0.5, " + sat + ", " + val + ", 1.0-" + fac + "))";
return "hue_sat(" + col + ", float4(" + hue + " - 0.5, " + sat + ", " + val + ", 1.0 - " + fac + "))";
}
else if (node.type == "INVERT") {
let fac: string = parser_material_parse_value_input(node.inputs[0]);
@@ -829,6 +829,11 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t)
let fac: string = parser_material_parse_value_input(node.inputs[0]);
let vec: string = parser_material_parse_vector_input(node.inputs[1]);
let curves: f32_array_t = node.buttons[0].default_value;
if (curves[96] == 0.0) {
curves[96] = 1.0;
curves[97] = 1.0;
curves[98] = 1.0;
}
let name: string = parser_material_node_name(node);
let vc0: string = parser_material_vector_curve(name + "0", vec + ".x", curves.buffer + 32 * 0, curves[96]);
let vc1: string = parser_material_vector_curve(name + "1", vec + ".y", curves.buffer + 32 * 1, curves[97]);
@@ -1075,12 +1080,12 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t)
if (blend == "PARTIAL_DERIVATIVE") { //partial derivate blending
parser_material_write(parser_material_kong, "var " + store + "_n1: float3 = " + nm1 + " * 2.0 - 1.0;");
parser_material_write(parser_material_kong, "var " + store + "_n2: float3 = " + nm2 + " * 2.0 - 1.0;");
return "0.5 * normalize(float3(" + store + "_n1.xy * " + store + "_n2.z + " + store + "_n2.xy * " + store + "_n1.z, " + store + "_n1.z * " + store + "_n2.z)) + 0.5;";
return "0.5 * normalize(float3(" + store + "_n1.xy * " + store + "_n2.z + " + store + "_n2.xy * " + store + "_n1.z, " + store + "_n1.z * " + store + "_n2.z)) + 0.5";
}
else if (blend == "WHITEOUT") { //whiteout blending
parser_material_write(parser_material_kong, "var " + store + "_n1: float3 = " + nm1 + " * 2.0 - 1.0;");
parser_material_write(parser_material_kong, "var " + store + "_n2: float3 = " + nm2 + " * 2.0 - 1.0;");
return "0.5 * normalize(float3(" + store + "_n1.xy + " + store + "_n2.xy, " + store + "_n1.z * " + store + "_n2.z)) + 0.5;";
return "0.5 * normalize(float3(" + store + "_n1.xy + " + store + "_n2.xy, " + store + "_n1.z * " + store + "_n2.z)) + 0.5";
}
else if (blend == "REORIENTED") { //reoriented normal mapping
parser_material_write(parser_material_kong, "var " + store + "_n1: float3 = " + nm1 + " * 2.0 - float3(1.0, 1.0, 0.0);");
@@ -1827,9 +1832,10 @@ function parser_material_vector_curve(name: string, fac: string, points: f32_ptr
parser_material_write(parser_material_kong, "" + facs_var + "[" + i + "] = " + p + ";");
}
// Map vector
return "lerp(" +
ys_var + "[" + index_var + "], " + ys_var + "[" + index_var + " + 1], (" + fac_var + " - " +
facs_var + "[" + index_var + "]) * (1.0 / (" + facs_var + "[" + index_var + " + 1] - " + facs_var + "[" + index_var + "])))";
return "0.0"; ////
// return "lerp(" +
// ys_var + "[" + index_var + "], " + ys_var + "[" + index_var + " + 1], (" + fac_var + " - " +
// facs_var + "[" + index_var + "]) * (1.0 / (" + facs_var + "[" + index_var + " + 1] - " + facs_var + "[" + index_var + "])))";
}
function parser_material_res_var_name(node: ui_node_t, socket: ui_node_socket_t): string {
@@ -1907,7 +1913,7 @@ function parser_material_texture_store(node: ui_node_t, tex: bind_tex_t, tex_nam
parser_material_write(parser_material_kong, "var " + tex_store + ": float4 = sample_lod(" + tex_name + ", sampler_linear, " + uv_name + ".xy, 0.0);");
}
if (!ends_with(tex.file, ".jpg")) { // Pre-mult alpha
parser_material_write(parser_material_kong, tex_store + ".rgb *= " + tex_store + ".a;");
parser_material_write(parser_material_kong, tex_store + ".rgb = " + tex_store + ".rgb * " + tex_store + ".a;");
}
}
+38 -23
View File
@@ -40,15 +40,25 @@ fun tex_checker(co: float3, col1: float3, col2: float3, scale: float): float3 {
var xi: float = abs(floor(p.x)); \
var yi: float = abs(floor(p.y)); \
var zi: float = abs(floor(p.z)); \
var check: bool = (((xi % 2.0) == (yi % 2.0)) == bool((zi % 2.0))); \
if (check) { return col1; } else { return col2; } \
/* var check: bool = (xi % 2.0 == yi % 2.0) == zi % 2.0;*/ \
var checka: int = 0; \
var checkb: int = 0; \
if (xi % 2.0 == yi % 2.0) { checka = 1; } \
if (zi % 2.0 != 0.0) { checkb = 1; } \
if (checka == checkb) { return col1; } return col2; \
} \
fun tex_checker_f(co: float3, scale: float): float { \
var p: float3 = (co + 0.000001 * 0.999999) * scale; \
var xi: float = abs(floor(p.x)); \
var yi: float = abs(floor(p.y)); \
var zi: float = abs(floor(p.z)); \
return float(((xi % 2.0) == (yi % 2.0)) == bool((zi % 2.0))); \
/*return float((xi % 2.0 == yi % 2.0) == zi % 2.0);*/ \
var checka: int = 0; \
var checkb: int = 0; \
if (xi % 2.0 == yi % 2.0) { checka = 1; } \
if (zi % 2.0 != 0.0) { checkb = 1; } \
if (checka == checkb) { return 1.0; } return 0.0; \
\
} \
";
@@ -60,19 +70,24 @@ fun tex_voronoi(x: float3): float4 { \
var f: float3 = frac3(x); \
var id: float = 0.0; \
var res: float = 100.0; \
for (var k: int = -1; k <= 1; k += 1) \
for (var j: int = -1; j <= 1; j += 1) \
for (var i: int = -1; i <= 1; i += 1) { \
var b: float3 = float3(float(i), float(j), float(k)); \
for (var k: int = 0; k <= 2; k += 1) \
for (var j: int = 0; j <= 2; j += 1) \
for (var i: int = 0; i <= 2; i += 1) { \
var b: float3 = float3(float(i - 1), float(j - 1), float(k - 1)); \
var pb: float3 = p + b; \
var r: float3 = float3(b) - f + sample(snoise256, sampler_linear, (pb.xy + float2(3.0, 1.0) * pb.z + 0.5) / 256.0).xyz; \
var snoise_sample: float3 = sample(snoise256, sampler_linear, (pb.xy + float2(3.0, 1.0) * pb.z + 0.5) / 256.0).xyz; \
var r: float3 = b - f + snoise_sample; \
var d: float = dot(r, r); \
if (d < res) { \
id = dot(p + b, float3(1.0, 57.0, 113.0)); \
res = d; \
} \
} \
var col: float3 = 0.5 + 0.5 * cos(id * 0.35 + float3(0.0, 1.0, 2.0)); \
/*var col: float3 = 0.5 + 0.5 * cos(id * 0.35 + float3(0.0, 1.0, 2.0));*/ \
var col: float3; \
col.x = 0.5 + 0.5 * cos(id * 0.35 + 0.0); \
col.y = 0.5 + 0.5 * cos(id * 0.35 + 1.0); \
col.z = 0.5 + 0.5 * cos(id * 0.35 + 2.0); \
return float4(col, sqrt(res)); \
} \
";
@@ -80,23 +95,23 @@ fun tex_voronoi(x: float3): float4 { \
// By Morgan McGuire @morgan3d, http://graphicscodex.com Reuse permitted under the BSD license.
// https://www.shadertoy.com/view/4dS3Wd
let str_tex_noise: string = "\
fun hash(n: float): float { return frac(sin(n) * 10000); } \
fun tex_noise_f(float3 x): float { \
var step: float3 = float3(110, 241, 171); \
fun hash(n: float): float { return frac(sin(n) * 10000.0); } \
fun tex_noise_f(x: float3): float { \
var step: float3 = float3(110.0, 241.0, 171.0); \
var i: float3 = floor3(x); \
var f: float3 = frac3(x); \
var n: float = dot(i, step); \
var u: float3 = f * f * (3.0 - 2.0 * f); \
return lerp(lerp(lerp(hash(n + dot(step, float3(0, 0, 0))), hash(n + dot(step, float3(1, 0, 0))), u.x), \
lerp(hash(n + dot(step, float3(0, 1, 0))), hash(n + dot(step, float3(1, 1, 0))), u.x), u.y), \
lerp(lerp(hash(n + dot(step, float3(0, 0, 1))), hash(n + dot(step, float3(1, 0, 1))), u.x), \
lerp(hash(n + dot(step, float3(0, 1, 1))), hash(n + dot(step, float3(1, 1, 1))), u.x), u.y), u.z); \
return lerp(lerp(lerp(hash(n + dot(step, float3(0.0, 0.0, 0.0))), hash(n + dot(step, float3(1.0, 0.0, 0.0))), u.x), \
lerp(hash(n + dot(step, float3(0.0, 1.0, 0.0))), hash(n + dot(step, float3(1.0, 1.0, 0.0))), u.x), u.y), \
lerp(lerp(hash(n + dot(step, float3(0.0, 0.0, 1.0))), hash(n + dot(step, float3(1.0, 0.0, 1.0))), u.x), \
lerp(hash(n + dot(step, float3(0.0, 1.0, 1.0))), hash(n + dot(step, float3(1.0, 1.0, 1.0))), u.x), u.y), u.z); \
} \
fun tex_noise(p: float3): float { \
p *= 1.25; \
var f: float = 0.5 * tex_noise_f(p); p *= 2.01; \
f += 0.25 * tex_noise_f(p); p *= 2.02; \
f += 0.125 * tex_noise_f(p); p *= 2.03; \
p = p * 1.25; \
var f: float = 0.5 * tex_noise_f(p); p = p * 2.01; \
f += 0.25 * tex_noise_f(p); p = p * 2.02; \
f += 0.125 * tex_noise_f(p); p = p * 2.03; \
f += 0.0625 * tex_noise_f(p); \
return 1.0 - f; \
} \
@@ -132,7 +147,7 @@ fun tex_musgrave_f(p: float3): float { \
w.y = dot(x1, x1); \
w.z = dot(x2, x2); \
w.w = dot(x3, x3); \
w = max4(0.6 - w, 0.0); \
w = max4(float4(0.6, 0.6, 0.6, 0.6) - w, float4(0.0, 0.0, 0.0, 0.0)); \
d.x = dot(random3(s), x); \
d.y = dot(random3(s + i1), x1); \
d.z = dot(random3(s + i2), x2); \
@@ -148,7 +163,7 @@ let str_hue_sat: string = "\
fun hsv_to_rgb(c: float3): float3 { \
var K: float4 = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); \
var p: float3 = abs3(frac3(c.xxx + K.xyz) * 6.0 - K.www); \
return c.z * lerp3(K.xxx, clamp3(p - K.xxx, 0.0, 1.0), c.y); \
return lerp3(K.xxx, clamp3(p - K.xxx, float3(0.0, 0.0, 0.0), float3(1.0, 1.0, 1.0)), c.y) * c.z; \
} \
fun rgb_to_hsv(c: float3): float3 { \
var K: float4 = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); \
@@ -228,7 +243,7 @@ let str_brightcontrast: string = "\
fun brightcontrast(col: float3, bright: float, contr: float): float3 { \
var a: float = 1.0 + contr; \
var b: float = bright - contr * 0.5; \
return max3(a * col + b, 0.0); \
return max3(a * col + b, float3(0.0, 0.0, 0.0)); \
} \
";