Shader fixes
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
@@ -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)); \
|
||||
} \
|
||||
";
|
||||
|
||||
|
||||
Reference in New Issue
Block a user