[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