[Bf-blender-cvs] [e7f7b9a8115] soc-2019-cycles-procedural: Add 1D, 2D, and 4D noise to OSL.
OmarSquircleArt
noreply at git.blender.org
Fri Jun 28 19:36:15 CEST 2019
Commit: e7f7b9a811591f5e0e9a0f69bf236c66b8800596
Author: OmarSquircleArt
Date: Fri Jun 28 19:36:54 2019 +0200
Branches: soc-2019-cycles-procedural
https://developer.blender.org/rBe7f7b9a811591f5e0e9a0f69bf236c66b8800596
Add 1D, 2D, and 4D noise to OSL.
SVM is still in the works, though I have updated the 3D version to work for now.
===================================================================
M intern/cycles/blender/blender_shader.cpp
M intern/cycles/kernel/shaders/node_brick_texture.osl
M intern/cycles/kernel/shaders/node_checker_texture.osl
M intern/cycles/kernel/shaders/node_gradient_texture.osl
M intern/cycles/kernel/shaders/node_ies_light.osl
M intern/cycles/kernel/shaders/node_magic_texture.osl
M intern/cycles/kernel/shaders/node_musgrave_texture.osl
M intern/cycles/kernel/shaders/node_noise_texture.osl
M intern/cycles/kernel/shaders/node_texture.h
M intern/cycles/kernel/shaders/node_wave_texture.osl
M intern/cycles/kernel/svm/svm.h
M intern/cycles/kernel/svm/svm_noisetex.h
M intern/cycles/render/nodes.cpp
M intern/cycles/render/nodes.h
M source/blender/gpu/shaders/gpu_shader_material.glsl
===================================================================
diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp
index 425999c220d..cf38a03de31 100644
--- a/intern/cycles/blender/blender_shader.cpp
+++ b/intern/cycles/blender/blender_shader.cpp
@@ -771,6 +771,7 @@ static ShaderNode *add_node(Scene *scene,
else if (b_node.is_a(&RNA_ShaderNodeTexNoise)) {
BL::ShaderNodeTexNoise b_noise_node(b_node);
NoiseTextureNode *noise = new NoiseTextureNode();
+ noise->dimensions = b_noise_node.dimensions();
BL::TexMapping b_texture_mapping(b_noise_node.texture_mapping());
get_tex_mapping(&noise->tex_mapping, b_texture_mapping);
node = noise;
diff --git a/intern/cycles/kernel/shaders/node_brick_texture.osl b/intern/cycles/kernel/shaders/node_brick_texture.osl
index 0abc3574c48..30644ef2ff3 100644
--- a/intern/cycles/kernel/shaders/node_brick_texture.osl
+++ b/intern/cycles/kernel/shaders/node_brick_texture.osl
@@ -15,7 +15,6 @@
*/
#include "stdosl.h"
-#include "node_texture.h"
/* Brick */
diff --git a/intern/cycles/kernel/shaders/node_checker_texture.osl b/intern/cycles/kernel/shaders/node_checker_texture.osl
index e068f7952ed..e05cf20099f 100644
--- a/intern/cycles/kernel/shaders/node_checker_texture.osl
+++ b/intern/cycles/kernel/shaders/node_checker_texture.osl
@@ -15,7 +15,6 @@
*/
#include "stdosl.h"
-#include "node_texture.h"
/* Checker */
diff --git a/intern/cycles/kernel/shaders/node_gradient_texture.osl b/intern/cycles/kernel/shaders/node_gradient_texture.osl
index 52bf466673d..5cc81d367f2 100644
--- a/intern/cycles/kernel/shaders/node_gradient_texture.osl
+++ b/intern/cycles/kernel/shaders/node_gradient_texture.osl
@@ -15,7 +15,6 @@
*/
#include "stdosl.h"
-#include "node_texture.h"
/* Gradient */
diff --git a/intern/cycles/kernel/shaders/node_ies_light.osl b/intern/cycles/kernel/shaders/node_ies_light.osl
index ce0173451da..6e9181cde40 100644
--- a/intern/cycles/kernel/shaders/node_ies_light.osl
+++ b/intern/cycles/kernel/shaders/node_ies_light.osl
@@ -15,7 +15,6 @@
*/
#include "stdosl.h"
-#include "node_texture.h"
/* IES Light */
diff --git a/intern/cycles/kernel/shaders/node_magic_texture.osl b/intern/cycles/kernel/shaders/node_magic_texture.osl
index aa700e575ef..26e7d57278b 100644
--- a/intern/cycles/kernel/shaders/node_magic_texture.osl
+++ b/intern/cycles/kernel/shaders/node_magic_texture.osl
@@ -15,7 +15,6 @@
*/
#include "stdosl.h"
-#include "node_texture.h"
/* Magic */
diff --git a/intern/cycles/kernel/shaders/node_musgrave_texture.osl b/intern/cycles/kernel/shaders/node_musgrave_texture.osl
index a7877c43d46..7b46573fcb9 100644
--- a/intern/cycles/kernel/shaders/node_musgrave_texture.osl
+++ b/intern/cycles/kernel/shaders/node_musgrave_texture.osl
@@ -36,14 +36,14 @@ float noise_musgrave_fBm(point ip, float H, float lacunarity, float octaves)
point p = ip;
for (i = 0; i < (int)octaves; i++) {
- value += safe_noise(p, "signed") * pwr;
+ value += safe_snoise(p) * pwr;
pwr *= pwHL;
p *= lacunarity;
}
rmd = octaves - floor(octaves);
if (rmd != 0.0)
- value += rmd * safe_noise(p, "signed") * pwr;
+ value += rmd * safe_snoise(p) * pwr;
return value;
}
@@ -65,14 +65,14 @@ float noise_musgrave_multi_fractal(point ip, float H, float lacunarity, float oc
point p = ip;
for (i = 0; i < (int)octaves; i++) {
- value *= (pwr * safe_noise(p, "signed") + 1.0);
+ value *= (pwr * safe_snoise(p) + 1.0);
pwr *= pwHL;
p *= lacunarity;
}
rmd = octaves - floor(octaves);
if (rmd != 0.0)
- value *= (rmd * pwr * safe_noise(p, "signed") + 1.0); /* correct? */
+ value *= (rmd * pwr * safe_snoise(p) + 1.0); /* correct? */
return value;
}
@@ -95,11 +95,11 @@ float noise_musgrave_hetero_terrain(
point p = ip;
/* first unscaled octave of function; later octaves are scaled */
- value = offset + safe_noise(p, "signed");
+ value = offset + safe_snoise(p);
p *= lacunarity;
for (i = 1; i < (int)octaves; i++) {
- increment = (safe_noise(p, "signed") + offset) * pwr * value;
+ increment = (safe_snoise(p) + offset) * pwr * value;
value += increment;
pwr *= pwHL;
p *= lacunarity;
@@ -107,7 +107,7 @@ float noise_musgrave_hetero_terrain(
rmd = octaves - floor(octaves);
if (rmd != 0.0) {
- increment = (safe_noise(p, "signed") + offset) * pwr * value;
+ increment = (safe_snoise(p) + offset) * pwr * value;
value += rmd * increment;
}
@@ -131,7 +131,7 @@ float noise_musgrave_hybrid_multi_fractal(
int i;
point p = ip;
- result = safe_noise(p, "signed") + offset;
+ result = safe_snoise(p) + offset;
weight = gain * result;
p *= lacunarity;
@@ -139,7 +139,7 @@ float noise_musgrave_hybrid_multi_fractal(
if (weight > 1.0)
weight = 1.0;
- signal = (safe_noise(p, "signed") + offset) * pwr;
+ signal = (safe_snoise(p) + offset) * pwr;
pwr *= pwHL;
result += weight * signal;
weight *= gain * signal;
@@ -148,7 +148,7 @@ float noise_musgrave_hybrid_multi_fractal(
rmd = octaves - floor(octaves);
if (rmd != 0.0)
- result += rmd * ((safe_noise(p, "signed") + offset) * pwr);
+ result += rmd * ((safe_snoise(p) + offset) * pwr);
return result;
}
@@ -170,7 +170,7 @@ float noise_musgrave_ridged_multi_fractal(
int i;
point p = ip;
- signal = offset - fabs(safe_noise(p, "signed"));
+ signal = offset - fabs(safe_snoise(p));
signal *= signal;
result = signal;
weight = 1.0;
@@ -178,7 +178,7 @@ float noise_musgrave_ridged_multi_fractal(
for (i = 1; i < (int)octaves; i++) {
p *= lacunarity;
weight = clamp(signal * gain, 0.0, 1.0);
- signal = offset - fabs(safe_noise(p, "signed"));
+ signal = offset - fabs(safe_snoise(p));
signal *= signal;
signal *= weight;
result += signal * pwr;
diff --git a/intern/cycles/kernel/shaders/node_noise_texture.osl b/intern/cycles/kernel/shaders/node_noise_texture.osl
index 2cbd571e206..e2225e454e2 100644
--- a/intern/cycles/kernel/shaders/node_noise_texture.osl
+++ b/intern/cycles/kernel/shaders/node_noise_texture.osl
@@ -15,46 +15,103 @@
*/
#include "stdosl.h"
+#include "vector2.h"
+#include "vector4.h"
#include "node_texture.h"
-/* Noise */
+#define vector3 point
-float noise(point ip, float distortion, float detail, output color Color)
-{
- point r;
- point p = ip;
- int hard = 0;
+/* To compute the color output of the noise, we either swizzle the
+ * components, add a random offset {75, 125, 150}, or do both.
+ */
+float noise(float p, float detail, float distortion, output color Color)
+{
if (distortion != 0.0) {
- r[0] = safe_noise(p + point(13.5), "unsigned") * distortion;
- r[1] = safe_noise(p, "unsigned") * distortion;
- r[2] = safe_noise(p - point(13.5), "unsigned") * distortion;
+ p += safe_noise(p + 13.5) * distortion;
+ }
+
+ float fac = noise_turbulence(p, detail);
+ Color = color(fac, noise_turbulence(p + 75.0, detail), noise_turbulence(p + 125.0, detail));
+ return fac;
+}
+float noise(vector2 p, float detail, float distortion, output color Color)
+{
+ if (distortion != 0.0) {
+ vector2 r;
+ r.x = safe_noise(p + vector2(13.5, 13.5)) * distortion;
+ r.y = safe_noise(p) * distortion;
p += r;
}
- float fac = noise_turbulence(p, detail, hard);
+ float fac = noise_turbulence(p, detail);
+ Color = color(fac,
+ noise_turbulence(p + vector2(150.0, 125.0), detail),
+ noise_turbulence(p + vector2(75.0, 125.0), detail));
+ return fac;
+}
+
+float noise(vector3 p, float detail, float distortion, output color Color)
+{
+ if (distortion != 0.0) {
+ vector3 r, offset = vector3(13.5);
+ r[0] = safe_noise(p + offset) * distortion;
+ r[1] = safe_noise(p) * distortion;
+ r[2] = safe_noise(p - offset) * distortion;
+ p += r;
+ }
+ float fac = noise_turbulence(p, detail);
Color = color(fac,
- noise_turbulence(point(p[1], p[0], p[2]), detail, hard),
- noise_turbulence(point(p[1], p[2], p[0]), detail, hard));
+ noise_turbulence(vector3(p[1], p[0], p[2]), detail),
+ noise_turbulence(vector3(p[1], p[2], p[0]), detail));
+ return fac;
+}
+
+float noise(vector4 p, float detail, float distortion, output color Color)
+{
+ if (distortion != 0.0) {
+ vector4 r, offset = vector4(13.5, 13.5, 13.5, 13.5);
+ r.x = safe_noise(p + offset) * distortion;
+ r.y = safe_noise(p) * distortion;
+ r.z = safe_noise(p - offset) * distortion;
+ r.w = safe_noise(vector4(p.w, p.y, p.z, p.x) + offset) * distortion;
+ p += r;
+ }
+ float fac = noise_turbulence(p, detail);
+ Color = color(fac,
+ noise_turbulence(vector4(p.y, p.w, p.z, p.x), detail),
+ noise_turbulence(vector4(p.y, p.z, p.w, p.x), detail));
return fac;
}
shader node_noise_texture(int use_mapping = 0,
matrix mapping = matrix(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
- float Distortion = 0.0,
+ string dimensions = "3D",
+ vector3 Vector = P,
+ float W = 0.0,
float Scale = 5.0,
float Detail = 2.0,
- point Vector = P,
+ float Distortion = 0.0,
output float Fac = 0.0,
output color Color = 0.0)
{
- point p = Vector;
-
+ vector3 p = Vector;
if (use_mapping)
p = transform(mapping, p);
+ p *= Scale;
+ float w = W * Scale;
- Fac = noise(p * Scale, Distortion, Detail, Color);
+ if (dimensions == "1D")
+ Fac = noise(w, Detail, Distortion, Color);
+ else if (dimensions == "2D")
+ Fac = noise(vector2(p[0], p[1]), Detail, Distortion, Color);
+ else if (dimensions == "3D")
+ Fac = noise(p, Detail, Distortion, Color);
+ else if (dimensions == "4D")
+ Fac = noise(vector4(p[0], p[1], p[2], w), Detail, Distortion, Color);
+ else
+ error("Unknown dimension!");
}
diff --git a/intern/cycles/kernel/shaders/node_texture.h b/intern/cycles/kernel/shaders/node_texture.h
index 98aa0b7f1e2.
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list