Page 1 of 6

CustomShader3D: Cg shader editing in your comp

Posted: Wed Jun 01, 2016 8:44 am
by Chad
Image

You've seen me post teasers in the past, but it's finally available for you to purchase. Custom Shader 3D is a tool for making customized fragment shaders directly within your comp. Whether you need to come up with a new look or solve a 3D compositing problem on the fly, or you want to develop a library of shaders for your facility, or you want to mimic the look of shaders used in your interactive 3D application, Custom Shader 3D (3CuS) gives the ability to quickly develop and version ideas alongside all the existing builtin and plugin shaders Fusion Studio offers.

3CuS uses Cg, the same GPU language that Fusion uses for it's OpenGL renderers and viewports. So whatever you make in 3CuS, it integrates well with tools you already have, so mixing and matching shaders is easy.

Here is an example of a Cg shader that reproduces parts of 3BC:
Spoiler:
  1.  
  2. FuFloat4 InputMtl;
  3. FuFloat4 EffectMask;
  4. float Gain;
  5. float Lift;
  6. float Gamma;
  7. float Contrast;
  8. float Brightness;
  9. float Forward;
  10. bool Red;
  11. bool Green;
  12. bool Blue;
  13. bool Alpha;
  14. bool PreDividePostMultiply;
  15.  
  16. float4 Shade(inout FuFragment f)
  17. {
  18.  
  19. float4 inmtl = InputMtl.Shade(f);
  20. float mask = EffectMask.Shade(f).a;   // If the input is RGBA, only want the A.
  21. float4 outmtl = inmtl;                            
  22.  
  23. if (PreDividePostMultiply == 1)  // This is the pre-divide.  Don't forget the post-multiply below.
  24. {
  25.      if (abs(inmtl.a) < 1.0e-10) outmtl.rgb /= 1.0e-10;     // If the alpha is very tiny, don't accidentally divide by zero.
  26.      else outmtl.rgb /= outmtl.a;
  27. }
  28.  
  29. if (Forward == 0)
  30. {
  31.  
  32.      outmtl *= (Gain - Lift) + Lift;                              // Gain and Lift
  33.      outmtl = sign(outmtl) * pow(abs(outmtl), 1/Gamma);           // Gamma
  34.      outmtl = (outmtl- 0.5) * (Contrast + 1) + 0.5 + Brightness;  // Contrast and Brightness
  35.  
  36. }
  37.  
  38. else  // Reverse
  39.  
  40. {
  41.    
  42.      outmtl = (outmtl - 0.5 - Brightness) / (Contrast + 1) + 0.5;
  43.      outmtl = sign(outmtl) * pow(abs(outmtl), Gamma);
  44.      outmtl = (outmtl - Lift) / (Gain - Lift);
  45.  
  46. }
  47.  
  48. if (PreDividePostMultiply == 1)
  49. {
  50.      if (Alpha == 1) outmtl.a = inmtl.a;   // If Alpha is unchecked, set it back to the input value.
  51.      outmtl.rgb *= outmtl.a;
  52. }
  53.  
  54. outmtl = lerp(inmtl, outmtl , saturate(mask));  // Saturating the mask prevents overshoot on the lerp.
  55.  
  56. if (Red == 0) outmtl.r = inmtl.r;           // If Red, Green, Blue, Alpha are unchecked, set the values back to the original.
  57. if (Green == 0) outmtl.g = inmtl.g;
  58. if (Blue == 0) outmtl.b = inmtl.b;
  59. if (Alpha == 0) outmtl.a = inmtl.a;
  60.  
  61. return outmtl;
  62.  

And here is how it looks inside Fusion:

Image

Using 3CuS, you can access rendercontext matrices, lighting, colors, floats, materials, booleans, and transforms. Your shaders can interact with Fusion's lighting or you can create your own. Effects can happen in a mix of eye space, world space, and model space. 3CuS supports images and masks, so you can create pixel perfect floating point GPU accelerated concatenated color corrections that render orders of magnitude times faster than Fusion's image tools, even faster than Resolve!

Because 3CuS uses UserControls, you can customize your tools UI using standard Fusion inputs. A artist can make a quick and dirty tool and leave the default GUI, while a TD can create a sleek interface that looks and acts just like a native SDK tool including help URL's, tooltips, presets, tile pics, etc., and locks and hides the shader code to prevent accidental tampering. You can even move the shader code to an external file that can be updated independently from the comp.

Sample files will get you up and running right away, and there are many resources available for Cg and HLSL. The .settings files can of course be shared just like any other tool, so you can copy/paste, share in Bins, or post them on this very forum!

Debug output happens right in the console, so you can see any warnings or errors in your code when it compiles.
Spoiler:
Additionally, you can see the shader source for any of the builtin or plugin shaders, so you can adapt an existing shader and customize it for your needs.


Whether you need an animated 3D mask, a special warping effect, a unique cartoon material, a volumetric raymarcher, or a GPU accelerated image processing toolset, Custom Shader 3D provides the flexibility you need to get the shot you want.

Re: CustomShader3D: Cg shader editing in your comp

Posted: Wed Jun 01, 2016 10:40 am
by SecondMan
I've parted with my hard earned cash (Canadian dollars no less!) as soon as I saw the link appear in the environment light thread on the BMD forum.

Just going through the docs and examples and honestly, this is one of the most exciting third party developments for Fusion, ever. Steeper than usual learning curve perhaps, as I'll have to pick up Cg (and change that colour scheme! :)), but the potential for this is just staggering!

I hope many more can see the enormous benefits 3CuS can bring and support Indicated's efforts!

Congratulations on the release of a terrific tool, Chad! You guys rock!

Re: CustomShader3D: Cg shader editing in your comp

Posted: Wed Jun 01, 2016 10:43 am
by SecondMan
Actually, now that I've just gone over your plugin page, I'm intrigued by Stdlib - will this be able to churn out Cg code to put into 3CuS?

That would be just... whoa.

:)

Re: CustomShader3D: Cg shader editing in your comp

Posted: Wed Jun 01, 2016 10:56 am
by Chad
Sort of. Each tool in Stdlib emits it's own shading function. So it will look like:

  1. FuFloat4 A;
  2. FuFloat4 B;
  3. float4 Shade(inout FuFragment f)
  4. {
  5. return float4(dot(A.Shade(f), B.Shade(f)));
  6. }

and:

  1. FuFloat4 A;
  2. float4 Shade(inout FuFragment f)
  3. {
  4. return float4(normalize(A.Shade(f)));
  5. }

If you wanted to combine those, there's only one useful line in each, and both are returns. And there's two FuFloat4 A, but they're different inputs. The code you really want in 3CuS is:

  1. FuFloat4 A;
  2. FuFloat4 B;
  3. float4 Shade(inout FuFragment f)
  4. {
  5. return float4(normalize(dot(A.Shade(f), B.Shade(f))));
  6. }


And as you can see, getting those first two blocks to turn into the third block probably isn't worth it. The compiler doesn't care, but you, as a human, aren't a good Cg compiler. :)

Stdlib is cool because...
  • It gives a node based editing setup which many users will enjoy.
  • It makes debugging easier since each node can be thrown up to a viewer to see what the values are at that point in the "shader".
  • It works with all the other materials, so it's not like you have a separate window or separate language to deal with.
  • It works with the SW renderer. It's gonna be slow, but it at least will work.

Re: CustomShader3D: Cg shader editing in your comp

Posted: Wed Jun 01, 2016 11:51 am
by Chad
Just a test, seeing how it would look to share some setups on here...

Image

That's a triplanar texture. Doesn't use UV's to apply the mapping, makes reasonably seamless texture mapping, which is great because editing UV's in Fusion is hard.


The Fusion .setting:
Spoiler:
Code: [Select all] [Expand/Collapse] [Download] (Triplanar.setting)
  1. {
  2.     Tools = ordered() {
  3.         BrightnessContrast1 = BrightnessContrast {
  4.             Inputs = {
  5.                 Red = Input { Value = 0, },
  6.                 Green = Input { Value = 0, },
  7.                 Blue = Input { Value = 0, },
  8.                 Alpha = Input { Value = 1, },
  9.                 Brightness = Input { Value = 1, },
  10.                 ClipWhite = Input { Value = 1, },
  11.                 Input = Input {
  12.                     SourceOp = "FastNoise2",
  13.                     Source = "Output",
  14.                 },
  15.             },
  16.             ViewInfo = OperatorInfo { Pos = { 0, 940.5, }, },
  17.         },
  18.         Texture2D1_1 = Texture2DOperator {
  19.             Inputs = {
  20.                 Input = Input {
  21.                     SourceOp = "BrightnessContrast1",
  22.                     Source = "Output",
  23.                 },
  24.                 WrapMode = Input { Value = FuID { "Wrap", }, },
  25.                 ["FilterMode.Nest"] = Input { Value = 1, },
  26.                 ["FilterMode.GL.LowQ"] = Input { Value = FuID { "SAT", }, },
  27.                 ["FilterMode.GL.HiQ"] = Input { Value = FuID { "SAT", }, },
  28.                 MaterialID = Input { Value = 3, },
  29.             },
  30.             ViewInfo = OperatorInfo { Pos = { 165, 940.5, }, },
  31.         },
  32.         FastNoise2 = FastNoise {
  33.             Inputs = {
  34.                 Width = Input { Value = 1024, },
  35.                 Height = Input { Value = 1024, },
  36.                 Depth = Input { Value = 1, },
  37.                 ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2", }, },
  38.                 Discontinuous = Input { Value = 1, },
  39.                 Inverted = Input { Value = 1, },
  40.                 Detail = Input { Value = 4.1319943, },
  41.                 Contrast = Input { Value = 1.3323782, },
  42.                 XScale = Input { Value = 18.9670014, },
  43.                 Gradient = Input {
  44.                     Value = Gradient {
  45.                         Colors = {
  46.                             [0] = { 0, 0, 0, 1, },
  47.                             [1] = { 1, 1, 1, 1, },
  48.                         },
  49.                     },
  50.                 },
  51.             },
  52.             ViewInfo = OperatorInfo { Pos = { -110, 940.5, }, },
  53.         },
  54.         CustomShader3D1_11 = Indicated.CustomShaderOperator3D {
  55.             CtrlWZoom = false,
  56.             CurrentSettings = 2,
  57.             CustomData = {
  58.                 Settings = {
  59.                     [1] = {
  60.                         Tools = ordered() {
  61.                             CustomShader3D1 = Indicated.CustomShaderOperator3D {
  62.                                 Inputs = {
  63.                                     ChildMtl = Input {
  64.                                         CustomData = {
  65.                                             Metadata = {
  66.                                                 Type = "Material",
  67.                                                 Set = "ChildMtl",
  68.                                             },
  69.                                         },
  70.                                         SourceOp = "Texture2D1",
  71.                                         Source = "MaterialOutput",
  72.                                     },
  73.                                     ShaderTextInputs = Input { Value = "\nFuFloat4 ChildMtl;\nFuFloat4 WorldPos;\nFuFloat4 ObjNormal;\nfloat Tiling;\nfloat Sharpness;\n\n", },
  74.                                     MaterialID = Input { Value = 1, },
  75.                                     FloatGroup = Input { Value = 1, },
  76.                                     WorldPos = Input {
  77.                                         CustomData = {
  78.                                             Metadata = {
  79.                                                 Type = "Material",
  80.                                                 Set = "WorldPos",
  81.                                             },
  82.                                         },
  83.                                         SourceOp = "ChannelBoolean1_1",
  84.                                         Source = "MaterialOutput",
  85.                                     },
  86.                                     ObjNormal = Input {
  87.                                         CustomData = {
  88.                                             Metadata = {
  89.                                                 Type = "Material",
  90.                                                 Set = "ObjNormal",
  91.                                             },
  92.                                         },
  93.                                         SourceOp = "ChannelBoolean1",
  94.                                         Source = "MaterialOutput",
  95.                                     },
  96.                                     Sharpness = Input {
  97.                                         Value = 2.8190476,
  98.                                         CustomData = {
  99.                                             Metadata = {
  100.                                                 Type = "Float",
  101.                                                 Set = "Sharpness",
  102.                                             },
  103.                                         },
  104.                                     },
  105.                                     ShaderTextBody = Input { Value = "float4 Shade(inout FuFragment f)\r\n{\r\n\r\nhalf3 blend = pow(abs(ObjNormal.Shade(f)), Sharpness);\r\nblend /= dot(blend, 1);\r\n\r\nhalf3 position = WorldPos.Shade(f)*Tiling +.5;\r\n\r\n\r\nhalf3 oldUV = f.TexCoord0;\r\n\r\nf.TexCoord0.xy = position.zy;\r\nhalf4 cx = ChildMtl.Shade(f);\r\n\r\nf.TexCoord0.xy = position.zx;\r\nhalf4 cy = ChildMtl.Shade(f);\r\n\r\nf.TexCoord0.xy = float2(cos(position.y), sin(position.x));\r\nhalf4 cz = ChildMtl.Shade(f);\r\n\r\nf.TexCoord0 = oldUV;\r\n\r\nhalf4 ret = cx * blend.x + cy * blend.y + cz * blend.z;\r\n\r\n//\r\n\r\n//ret.rg = position.rg ;\r\n//ret.b = 0;\r\n\r\n//ret.rgb = cy;\r\n\r\n//ret.rgb = (cx * blend.x) .rgb; \r\n\r\nreturn ret ;\r\n\r\n}", },
  106.                                     MaterialGroup = Input { Value = 1, },
  107.                                     Tiling = Input {
  108.                                         Value = 0.1857143,
  109.                                         CustomData = {
  110.                                             Metadata = {
  111.                                                 Type = "Float",
  112.                                                 Set = "Tiling",
  113.                                             },
  114.                                         },
  115.                                     },
  116.                                 },
  117.                                 CtrlWZoom = false,
  118.                                 ViewInfo = OperatorInfo { Pos = { 605, 313.5, }, },
  119.                                 UserControls = ordered() {
  120.                                     ChildMtl = {
  121.                                         {
  122.                                             LINKID_DataType = "MtlGraph3D",
  123.                                         },
  124.                                         {
  125.                                             LINKID_DataType = "Image",
  126.                                         },
  127.                                         {
  128.                                             LINKID_AllowedDataType = "Image",
  129.                                         },
  130.                                         {
  131.                                             LINKID_AllowedDataType = "Mask",
  132.                                         },
  133.                                         LINK_Main = 1,
  134.                                         INP_AcceptsGLImages = true,
  135.                                         INPID_InputControl = "ImageControl",
  136.                                         IC_ControlPage = 0,
  137.                                         INP_AcceptsMasks = true,
  138.                                         INP_Required = false,
  139.                                     },
  140.                                     Tiling = {
  141.                                         IC_ControlPage = 0,
  142.                                         LINKID_DataType = "Number",
  143.                                         INPID_InputControl = "SliderControl",
  144.                                     },
  145.                                     WorldPos = {
  146.                                         {
  147.                                             LINKID_DataType = "MtlGraph3D",
  148.                                         },
  149.                                         {
  150.                                             LINKID_DataType = "Image",
  151.                                         },
  152.                                         {
  153.                                             LINKID_AllowedDataType = "Image",
  154.                                         },
  155.                                         {
  156.                                             LINKID_AllowedDataType = "Mask",
  157.                                         },
  158.                                         LINK_Main = 2,
  159.                                         INP_AcceptsGLImages = true,
  160.                                         INPID_InputControl = "ImageControl",
  161.                                         IC_ControlPage = 0,
  162.                                         INP_AcceptsMasks = true,
  163.                                         INP_Required = false,
  164.                                     },
  165.                                     ObjNormal = {
  166.                                         {
  167.                                             LINKID_DataType = "MtlGraph3D",
  168.                                         },
  169.                                         {
  170.                                             LINKID_DataType = "Image",
  171.                                         },
  172.                                         {
  173.                                             LINKID_AllowedDataType = "Image",
  174.                                         },
  175.                                         {
  176.                                             LINKID_AllowedDataType = "Mask",
  177.                                         },
  178.                                         LINK_Main = 3,
  179.                                         INP_AcceptsGLImages = true,
  180.                                         INPID_InputControl = "ImageControl",
  181.                                         IC_ControlPage = 0,
  182.                                         INP_AcceptsMasks = true,
  183.                                         INP_Required = false,
  184.                                     },
  185.                                     Sharpness = {
  186.                                         IC_ControlPage = 0,
  187.                                         LINKID_DataType = "Number",
  188.                                         INPID_InputControl = "SliderControl",
  189.                                     },
  190.                                 },
  191.                                 CustomData = {
  192.                                 },
  193.                             },
  194.                         },
  195.                     },
  196.                 },
  197.             },
  198.             Inputs = {
  199.                 ShaderTextInputs = Input { Value = "FuFloat4 ChildMtl;\nfloat Tiling;\nfloat Sharpness;\nfloat4x4 ClipToScreen;\nfloat4x4 ProjectionI;\nfloat4x4 Projection;\nfloat3x3 ModelToEyeIT;\nfloat4x4 ModelToEye;\nfloat3x3 EyeToModelIT;\nfloat4x4 EyeToModel;\nfloat3x3 WorldToEyeIT;\nfloat4x4 WorldToEye;\nfloat3x3 EyeToWorldIT;\nfloat4x4 EyeToWorld;\n\n", },
  200.                 ShaderTextBody = Input { Value = "float4 Shade(inout FuFragment f)\r\n{\r\n\r\nfloat4 ret = 1;\r\n\r\nhalf3 blend = pow(abs(mul(EyeToModelIT, f.Normal)), Sharpness); \r\n\r\nblend /= dot(blend, 1);\r\n\r\nhalf3 position = mul(EyeToModel, float4(f.Position, 1)).xyz*Tiling;  \r\n\r\nposition += 0.5;\r\n\r\nhalf3 oldUV = f.TexCoord0;\r\n\r\nf.TexCoord0.xy = position.zy; \r\nhalf4 cx = ChildMtl.Shade(f);\r\n\r\nf.TexCoord0.xy = position.xz;\r\nhalf4 cy = ChildMtl.Shade(f);\r\n\r\nf.TexCoord0.xy = position.yx;  \r\nhalf4 cz = ChildMtl.Shade(f);\r\n\r\nf.TexCoord0 = oldUV;\r\n\r\nret =  float4(cx * blend.x + cy * blend.y + cz * blend.z);\r\n\r\nreturn ret;\r\n\r\n}", },
  201.                 RCGroup = Input { Value = 1, },
  202.                 RCMatrices = Input { Value = 2047, },
  203.                 MaterialID = Input { Value = 1, },
  204.                 ChildMtl = Input {
  205.                     SourceOp = "Texture2D1_1",
  206.                     Source = "MaterialOutput",
  207.                     CustomData = {
  208.                         Metadata = {
  209.                             Type = "Material",
  210.                             Set = "ChildMtl",
  211.                         },
  212.                     },
  213.                 },
  214.                 Tiling = Input {
  215.                     CustomData = {
  216.                         Metadata = {
  217.                             Type = "Float",
  218.                             Set = "Tiling",
  219.                         },
  220.                     },
  221.                 },
  222.                 Sharpness = Input {
  223.                     CustomData = {
  224.                         Metadata = {
  225.                             Type = "Float",
  226.                             Set = "Sharpness",
  227.                         },
  228.                     },
  229.                 },
  230.             },
  231.             ViewInfo = OperatorInfo { Pos = { 275, 940.5, }, },
  232.             UserControls = ordered() {
  233.                 ChildMtl = {
  234.                     {
  235.                         LINKID_DataType = "MtlGraph3D",
  236.                     },
  237.                     {
  238.                         LINKID_DataType = "Image",
  239.                     },
  240.                     {
  241.                         LINKID_AllowedDataType = "Image",
  242.                     },
  243.                     {
  244.                         LINKID_AllowedDataType = "Mask",
  245.                     },
  246.                     INP_AcceptsGLImages = true,
  247.                     LINK_Main = 1,
  248.                     INP_AcceptsMasks = true,
  249.                     INPID_InputControl = "ImageControl",
  250.                     INP_Required = false,
  251.                     IC_ControlPage = 0,
  252.                 },
  253.                 Tiling = {
  254.                     IC_ControlPage = 0,
  255.                     INP_Default = 0.35,
  256.                     INPID_InputControl = "SliderControl",
  257.                     LINKID_DataType = "Number",
  258.                     INP_MinAllowed = 0,
  259.                 },
  260.                 Sharpness = {
  261.                     LINKID_DataType = "Number",
  262.                     IC_ControlPage = 0,
  263.                     INP_Default = 2,
  264.                     INP_MinScale = 1,
  265.                     INPID_InputControl = "SliderControl",
  266.                     INP_MaxAllowed = 10,
  267.                     INP_MaxScale = 3,
  268.                     INP_MinAllowed = 1,
  269.                 },
  270.             },
  271.         },
  272.         CustomShader3D1_12 = Indicated.CustomShaderOperator3D {
  273.             Inputs = {
  274.                 ShaderTextInputs = Input { Value = "FuFloat4 ChildMtl;\n\n", },
  275.                 ShaderTextBody = Input { Value = "float4 Shade(inout FuFragment f)\r\n{\r\n\r\nfloat ret = 1-ChildMtl.Shade(f).r;\r\n\r\nreturn ret;\r\n\r\n}", },
  276.                 MaterialID = Input { Value = 1, },
  277.                 ChildMtl = Input {
  278.                     SourceOp = "CustomShader3D1_11",
  279.                     Source = "MaterialOutput",
  280.                     CustomData = {
  281.                         Metadata = {
  282.                             Set = "ChildMtl",
  283.                             Type = "Material",
  284.                         },
  285.                     },
  286.                 },
  287.             },
  288.             ViewInfo = OperatorInfo { Pos = { 385, 907.5, }, },
  289.             UserControls = ordered() {
  290.                 ChildMtl = {
  291.                     {
  292.                         LINKID_DataType = "MtlGraph3D",
  293.                     },
  294.                     {
  295.                         LINKID_DataType = "Image",
  296.                     },
  297.                     {
  298.                         LINKID_AllowedDataType = "Image",
  299.                     },
  300.                     {
  301.                         LINKID_AllowedDataType = "Mask",
  302.                     },
  303.                     LINK_Main = 1,
  304.                     INP_AcceptsGLImages = true,
  305.                     INP_Required = false,
  306.                     IC_ControlPage = 0,
  307.                     INP_AcceptsMasks = true,
  308.                     INPID_InputControl = "ImageControl",
  309.                 },
  310.             },
  311.         },
  312.         Blinn2 = MtlBlinn {
  313.             Inputs = {
  314.                 ["Diffuse.Color.Material"] = Input {
  315.                     SourceOp = "CustomShader3D1_11",
  316.                     Source = "MaterialOutput",
  317.                 },
  318.                 ["Specular.Nest"] = Input { Value = 1, },
  319.                 ["Specular.Intensity"] = Input { Value = 0.3799127, },
  320.                 ["Specular.Exponent"] = Input { Value = 95, },
  321.                 ["Specular.Exponent.Material"] = Input {
  322.                     SourceOp = "CustomShader3D1_12",
  323.                     Source = "MaterialOutput",
  324.                 },
  325.                 MaterialID = Input { Value = 12, },
  326.             },
  327.             ViewInfo = OperatorInfo { Pos = { 440, 940.5, }, },
  328.         },
  329.         Shape3D1_1 = Shape3D {
  330.             Inputs = {
  331.                 ["SurfacePlaneInputs.ObjectID.ObjectID"] = Input { Value = 1, },
  332.                 Shape = Input { Value = FuID { "SurfaceTorusInputs", }, },
  333.                 MaterialInput = Input {
  334.                     SourceOp = "Blinn2",
  335.                     Source = "MaterialOutput",
  336.                 },
  337.                 ["MtlStdInputs.MaterialID"] = Input { Value = 1, },
  338.                 ["SurfaceTorusInputs.Section"] = Input { Value = 0.452381, },
  339.                 ["SurfaceTorusInputs.SubdivisionLevelBase"] = Input { Value = 100, },
  340.                 ["SurfaceTorusInputs.SubdivisionLevelHeight"] = Input { Value = 100, },
  341.                 ["SurfaceTorusInputs.Visibility.Nest"] = Input { Value = 1, },
  342.                 ["SurfaceTorusInputs.Visibility.CullBackFace"] = Input { Value = 1, },
  343.                 ["SurfaceTorusInputs.BlendMode.Nest"] = Input { Value = 1, },
  344.                 ["SurfaceTorusInputs.BlendMode.GL.BlendMode"] = Input { Value = FuID { "Subtractive", }, },
  345.                 ["SurfaceTorusInputs.ObjectID.ObjectID"] = Input { Value = 2, },
  346.             },
  347.             ViewInfo = OperatorInfo { Pos = { 550, 940.5, }, },
  348.         },
  349.         Plasma1_1 = Plasma {
  350.             Inputs = {
  351.                 Width = Input { Value = 2048, },
  352.                 Height = Input { Value = 1556, },
  353.                 ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2", }, },
  354.                 Scale = Input { Value = 1.702439, },
  355.                 Operation = Input { Value = 3, },
  356.                 Circle1Scale = Input { Value = 0.3668342, },
  357.                 Circle2Scale = Input { Value = 1.81, },
  358.                 Circle3Scale = Input { Value = 0.9748744, },
  359.                 Circle4Scale = Input { Value = 0.6331658, },
  360.                 EffectMask = Input {
  361.                     SourceOp = "Rectangle1",
  362.                     Source = "Mask",
  363.                 },
  364.             },
  365.             ViewInfo = OperatorInfo { Pos = { 550, 1039.5, }, },
  366.         },
  367.         Rectangle1 = RectangleMask {
  368.             Inputs = {
  369.                 SoftEdge = Input { Value = 0.2, },
  370.                 MaskWidth = Input { Value = 2048, },
  371.                 MaskHeight = Input { Value = 1556, },
  372.                 PixelAspect = Input { Value = { 1, 1, }, },
  373.                 ClippingMode = Input { Value = FuID { "None", }, },
  374.             },
  375.             ViewInfo = OperatorInfo { Pos = { 440, 1039.5, }, },
  376.         },
  377.         Blur1 = Blur {
  378.             Inputs = {
  379.                 XBlurSize = Input { Value = 21, },
  380.                 Input = Input {
  381.                     SourceOp = "Plasma1_1",
  382.                     Source = "Output",
  383.                 },
  384.             },
  385.             ViewInfo = OperatorInfo { Pos = { 660, 1039.5, }, },
  386.         },
  387.         Displace3D1 = Displace3D {
  388.             Inputs = {
  389.                 SceneInput = Input {
  390.                     SourceOp = "Shape3D1_1",
  391.                     Source = "Output",
  392.                 },
  393.                 Channel = Input { Value = 1, },
  394.                 Scale = Input { Value = 0.5427873, },
  395.                 Bias = Input { Value = -0.3809524, },
  396.                 Input = Input {
  397.                     SourceOp = "Blur1",
  398.                     Source = "Output",
  399.                 },
  400.             },
  401.             ViewInfo = OperatorInfo { Pos = { 660, 940.5, }, },
  402.         },
  403.         Weld3D1 = Weld3D {
  404.             Inputs = {
  405.                 SceneInput = Input {
  406.                     SourceOp = "Displace3D1",
  407.                     Source = "Output",
  408.                 },
  409.                 AutoTolerance = Input { Value = 0, },
  410.                 Tolerance = Input { Value = 0.01972, },
  411.             },
  412.             ViewInfo = OperatorInfo { Pos = { 825, 940.5, }, },
  413.         },
  414.         ReplaceNormals3D1_1 = ReplaceNormals3D {
  415.             Inputs = {
  416.                 SceneInput = Input {
  417.                     SourceOp = "Weld3D1",
  418.                     Source = "Output",
  419.                 },
  420.                 ["Normals.SmoothingAngle"] = Input { Value = 90, },
  421.             },
  422.             ViewInfo = OperatorInfo { Pos = { 935, 940.5, }, },
  423.         },
  424.     },
  425. }


And the shader if you only want to see what that looks like by itself:
Spoiler:
  1. float4 Shade(inout FuFragment f)
  2. {
  3.  
  4. float4 ret = 1;
  5.  
  6. half3 blend = pow(abs(mul(EyeToModelIT, f.Normal)), Sharpness);
  7.  
  8. blend /= dot(blend, 1);
  9.  
  10. half3 position = mul(EyeToModel, float4(f.Position, 1)).xyz*Tiling;  
  11.  
  12. position += 0.5;
  13.  
  14. half3 oldUV = f.TexCoord0;
  15.  
  16. f.TexCoord0.xy = position.zy;
  17. half4 cx = ChildMtl.Shade(f);
  18.  
  19. f.TexCoord0.xy = position.xz;
  20. half4 cy = ChildMtl.Shade(f);
  21.  
  22. f.TexCoord0.xy = position.yx;  
  23. half4 cz = ChildMtl.Shade(f);
  24.  
  25. f.TexCoord0 = oldUV;
  26.  
  27. ret =  float4(cx * blend.x + cy * blend.y + cz * blend.z);
  28.  
  29. return ret;

Re: CustomShader3D: Cg shader editing in your comp

Posted: Thu Jun 02, 2016 3:42 am
by miaz3
Exemple, we can copy/paste some GLSL test from www.shadertoy.com.
And rocks on ?!

Re: CustomShader3D: Cg shader editing in your comp

Posted: Thu Jun 02, 2016 7:30 am
by Chad
miaz3 wrote:Exemple, we can copy/paste some GLSL test from www.shadertoy.com.
And rocks on ?!


Mostly. Some variables like iGlobalTime and iMouse are going to need to swap out, and ShaderToy uses GLSL, not HLSL, so for instance vec3 becomes float3. GLSL and HLSL are still really close though, so adapting shouldn't be too bad.

EDIT: Apparently you can use vec and float interchangeably with Cg. So float4 color = vec4(float2(.3,.5)vec2(.6,1.0)); is perfectly fine.

The biggest difference is that for ease of use, CustomShader3D treats materials, textures, and images as the same thing. This lets you swap out a material for an image without having to redo your shader code or have a bunch of if statements. Same thing that Fusion does, which really helps with usability.

And remember, a lot of the things on ShaderToy are torture tests for GLSL and OpenGL ES / WebGL. Sure you COULD convert a TrueType font to an array of vectors to evaluate, but why? Fusion gives you a ton of tools for doing lots of effects, so there's less of a need to do the really zany things. I've lifted things off ShaderToy, sure, and they are easy to convert, but I was mindful to only convert the things that made sense to do, and if there was a way for Fusion to make the inputs ahead of time, I let it.

Re: CustomShader3D: Cg shader editing in your comp

Posted: Thu Jun 02, 2016 8:18 am
by SecondMan
How about this?

http://developer.download.nvidia.com/sh ... brary.html

:)

Could you perhaps do a step by step example of how to take a shader from this library and put it in 3CuS?

Re: CustomShader3D: Cg shader editing in your comp

Posted: Thu Jun 02, 2016 9:37 am
by Chad
Ok, there's a few we can do that are straightforward (as opposed to clever tricks) and are actual things you would want to do that aren't already built into Fusion...


Image
Slice an object along any arbitrary plane. Gooch shading -- but the SLICE portion is important here. Slicing is across the Z axis of an attachable (spot)light xform.


Image
Simple color correction controls using a color matrix, as seen in the NVIDIA "Toys" demo. Controls are much like those on your TV: Brightness, Contrast, etc.


Image
Creates the illusion that the surface is covered with a thin film of transparent material, as in oily water, thin shellacs, dirty layered ice, etc.

Image
Emulation of Durer-style split-tone technique. Lines are drawn in black for shadow, then light-tone opaque lines are overlaid in a different direction for the highlights. This effect uses ANALYTICALLY ANTI-ALIASED strokes - that is, via shader math. An alternative uses textured strokes.


The .fx files there are whole "projects" for CgFX and the FXComposer application, which is a larger spec covering GUI's and different compilers and application specific modifications. Like whether you are running the shader in XSI or 3ds max. The actual fragment shaders are much simpler than the whole file would appear. But the GUI definitions we can use too, will tell us what slider ranges to use, etc. One other thing is that these all use vertex shaders, which Fusion doesn't let us play with. For the most part, though, it's not necessary since other than Position, the other channels we can pretty much process in the fragment shader. Doing it in the vertex shader is just an optimization (assuming you have fewer vertices than fragments). But GPU's today are fast enough to not need that, so rather than split our code over 2 shaders, we just do it all in the fragment shader.

I can't get started right now, but if you pick one to start with, I'll prioritize that one.

Re: CustomShader3D: Cg shader editing in your comp

Posted: Thu Jun 02, 2016 11:13 am
by Kristof
That's very generous of you, Chad. Slicing can be done with Krokodove and since I love NPR related things, I would like to vote for the Durer-style split-tone technique.

Re: CustomShader3D: Cg shader editing in your comp

Posted: Thu Jun 02, 2016 11:29 am
by Chad
Ok. The slicing in the nvidia image is solid, but it could just as easily be a soft clipping, or have a textured edge.

There is a dedicated clip() function, which has the benefit of completely killing the fragment, but if you just modulate the alpha, you can get softer effects.

Or use the mask to affect something else in the material. Like changing color or shininess based on the fragment being below the water level.

But yeah, the hatching is cool. It will help explain lighting and screenspace partial derivatives.

Re: CustomShader3D: Cg shader editing in your comp

Posted: Thu Jun 02, 2016 12:22 pm
by SecondMan
I wanted to vote for slicing, but maybe I'll be smart enough to do it myself one day :)

You know what would also be neat? If the area of the slice could be closed. Possible?

Re: CustomShader3D: Cg shader editing in your comp

Posted: Thu Jun 02, 2016 12:28 pm
by miaz3
Thanx chad,

So yes, on shadertoy found things well trotured. But i see this multipass, pathracing (estimator monte carlo)
https://www.shadertoy.com/view/4dtGWB

And I ask myself several questions concerning applications are in Fu.

Re: CustomShader3D: Cg shader editing in your comp

Posted: Thu Jun 02, 2016 12:30 pm
by Chad
Image


Spoiler:
Code: [Select all] [Expand/Collapse] [Download] (3CuS_SoftClip_Plane.setting)
  1. {
  2.     Tools = ordered() {
  3.         Shape3D_SlicePlaneGizmo = Shape3D {
  4.             NameSet = true,
  5.             Inputs = {
  6.                 ["Transform3DOp.Translate.X"] = Input {
  7.                     SourceOp = "Publish1",
  8.                     Source = "Value",
  9.                 },
  10.                 ["Transform3DOp.Translate.Y"] = Input {
  11.                     SourceOp = "Publish2",
  12.                     Source = "Value",
  13.                 },
  14.                 ["Transform3DOp.Translate.Z"] = Input {
  15.                     SourceOp = "Publish3",
  16.                     Source = "Value",
  17.                 },
  18.                 ["Transform3DOp.Rotate.X"] = Input {
  19.                     SourceOp = "Publish4",
  20.                     Source = "Value",
  21.                 },
  22.                 ["Transform3DOp.Rotate.Y"] = Input {
  23.                     SourceOp = "Publish5",
  24.                     Source = "Value",
  25.                 },
  26.                 ["Transform3DOp.Rotate.Z"] = Input {
  27.                     SourceOp = "Publish6",
  28.                     Source = "Value",
  29.                 },
  30.                 ["Transform3DOp.PivotNest"] = Input { Value = 1, },
  31.                 ["Transform3DOp.Pivot.X"] = Input {
  32.                     SourceOp = "Publish7",
  33.                     Source = "Value",
  34.                 },
  35.                 ["Transform3DOp.Pivot.Y"] = Input {
  36.                     SourceOp = "Publish8",
  37.                     Source = "Value",
  38.                 },
  39.                 ["Transform3DOp.Pivot.Z"] = Input {
  40.                     SourceOp = "Publish9",
  41.                     Source = "Value",
  42.                 },
  43.                 ["MtlStdInputs.Diffuse.Color.Red"] = Input { Value = 4.999999999999, },
  44.                 ["MtlStdInputs.Diffuse.Color.Green"] = Input { Value = 5, },
  45.                 ["MtlStdInputs.Diffuse.Color.Blue"] = Input { Value = 0, },
  46.                 ["MtlStdInputs.Specular.Intensity"] = Input { Value = 90, },
  47.                 ["MtlStdInputs.ReceivesLighting"] = Input { Value = 0, },
  48.                 ["MtlStdInputs.ReceivesShadows"] = Input { Value = 0, },
  49.                 ["MtlStdInputs.MaterialID"] = Input { Value = 3, },
  50.                 ["SurfacePlaneInputs.Width"] = Input { Value = 4.554007, },
  51.                 ["SurfacePlaneInputs.SubdivisionWidth"] = Input { Value = 1, },
  52.                 ["SurfacePlaneInputs.Wireframe"] = Input { Value = 1, },
  53.                 ["SurfacePlaneInputs.Visibility.Nest"] = Input { Value = 1, },
  54.                 ["SurfacePlaneInputs.Visibility.IsUnseenByCameras"] = Input { Value = 1, },
  55.                 ["SurfacePlaneInputs.Lighting.Nest"] = Input { Value = 1, },
  56.                 ["SurfacePlaneInputs.Lighting.IsAffectedByLights"] = Input { Value = 0, },
  57.                 ["SurfacePlaneInputs.ObjectID.ObjectID"] = Input { Value = 7, },
  58.             },
  59.             ViewInfo = OperatorInfo { Pos = { 440, 1666.5, }, },
  60.             Colors = { TileColor = { R = 1, G = 1, B = 0.435294117647059, }, },
  61.         },
  62.         Publish1 = PublishNumber {
  63.             Inputs = {
  64.                 Value = Input { Value = -0.180328594108098, },
  65.             },
  66.         },
  67.         Publish2 = PublishNumber {
  68.             Inputs = {
  69.                 Value = Input { Value = 0.220804216107328, },
  70.             },
  71.         },
  72.         Publish3 = PublishNumber {
  73.             Inputs = {
  74.                 Value = Input { Value = 0.285566719691794, },
  75.             },
  76.         },
  77.         Publish4 = PublishNumber {
  78.             Inputs = {
  79.                 Value = Input { Value = -26.921863864176, },
  80.             },
  81.         },
  82.         Publish5 = PublishNumber {
  83.         },
  84.         Publish6 = PublishNumber {
  85.         },
  86.         Publish7 = PublishNumber {
  87.         },
  88.         Publish8 = PublishNumber {
  89.         },
  90.         Publish9 = PublishNumber {
  91.         },
  92.         Group1 = GroupOperator {
  93.             Inputs = ordered() {
  94.                 Comments = Input { Value = "Set to passthrough to remove plane's shaded portion", },
  95.                 Input1 = InstanceInput {
  96.                     SourceOp = "Merge3D4",
  97.                     Source = "SceneInput1",
  98.                 },
  99.             },
  100.             Outputs = {
  101.                 Output1 = InstanceOutput {
  102.                     SourceOp = "Merge3D4",
  103.                     Source = "Output",
  104.                 },
  105.             },
  106.             ViewInfo = GroupInfo {
  107.                 Pos = { 550, 1666.5, },
  108.                 Flags = {
  109.                     GridSnap = true,
  110.                     ConnectedSnap = true,
  111.                     AutoSnap = true,
  112.                     FullIndicator = true,
  113.                     RemoveRouters = true,
  114.                 },
  115.                 Size = { 236, 64.2999, },
  116.                 Direction = "Horizontal",
  117.                 PipeStyle = "Direct",
  118.                 Scale = 1,
  119.                 Offset = { -495, -1688.8, },
  120.             },
  121.             Tools = ordered() {
  122.                 Merge3D4 = Merge3D {
  123.                     Inputs = {
  124.                         SceneInput1 = Input {
  125.                             SourceOp = "Shape3D_SlicePlaneGizmo",
  126.                             Source = "Output",
  127.                         },
  128.                         SceneInput2 = Input {
  129.                             SourceOp = "Instance_Shape3D_SlicePlaneGizmo",
  130.                             Source = "Output",
  131.                         },
  132.                     },
  133.                     ViewInfo = OperatorInfo { Pos = { 550, 1699.5, }, },
  134.                 },
  135.                 Instance_Shape3D_SlicePlaneGizmo = Shape3D {
  136.                     NameSet = true,
  137.                     SourceOp = "Shape3D_SlicePlaneGizmo",
  138.                     Inputs = {
  139.                         SceneInput = Input { },
  140.                         ["Transform3DOp.Translation"] = Input { },
  141.                         ["Transform3DOp.Rotation"] = Input { },
  142.                         ["Transform3DOp.PivotNest"] = Input { Value = 1, },
  143.                         ["Transform3DOp.ScaleNest"] = Input { },
  144.                         ["Transform3DOp.TargetNest"] = Input { },
  145.                         MaterialInput = Input { },
  146.                         ["MtlStdInputs.Diffuse.Nest"] = Input { },
  147.                         ["MtlStdInputs.Diffuse.Opacity"] = Input { Value = 0.13, },
  148.                         ["MtlStdInputs.Specular.Nest"] = Input { Value = 1, },
  149.                         ["MtlStdInputs.Transmittance.Nest"] = Input { },
  150.                         ["MtlStdInputs.MaterialIDNest"] = Input { Value = 1, },
  151.                         ["MtlStdInputs.MaterialID"] = Input { Value = 20, },
  152.                         StartEndRenderScripts = Input { },
  153.                         ["SurfacePlaneInputs.SubdivisionWidth"] = Input { },
  154.                         ["SurfacePlaneInputs.Wireframe"] = Input { Value = 1, },
  155.                         ["SurfacePlaneInputs.Visibility.Nest"] = Input { Value = 1, },
  156.                         ["SurfacePlaneInputs.Visibility.IsUnseenByCameras"] = Input { },
  157.                         ["SurfacePlaneInputs.Lighting.Nest"] = Input { Value = 1, },
  158.                         ["SurfacePlaneInputs.Matte.Nest"] = Input { },
  159.                         ["SurfacePlaneInputs.BlendMode.Nest"] = Input { },
  160.                         ["SurfacePlaneInputs.Controls.Nest"] = Input { },
  161.                         ["SurfacePlaneInputs.ObjectID.Nest"] = Input { Value = 1, },
  162.                         ["SurfacePlaneInputs.ObjectID.ObjectID"] = Input { Value = 800, },
  163.                     },
  164.                     ViewInfo = OperatorInfo { Pos = { 440, 1699.5, }, },
  165.                     Colors = { TileColor = { R = 1, G = 1, B = 0.435294117647059, }, },
  166.                 },
  167.             },
  168.         },
  169.         CustomShader3D_SoftClip_Plane = Indicated.CustomShaderOperator3D {
  170.             NameSet = true,
  171.             Inputs = {
  172.                 ShaderTextInputs = Input { Value = "FuFloat4 BaseMtl;\nfloat hardness;\nbool EdgeMaterialOnly;\nfloat4x4 ClipPlaneTransform;\nfloat4x4 ModelToEye;\nfloat4x4 EyeToModel;\nfloat4x4 EyeToWorld;\n\n", },
  173.                 ShaderTextBody = Input { Value = "float4 Shade(inout FuFragment f)\r\n{\r\n\r\nfloat4 ret = 1;\r\n\r\nfloat3 wp = mul(EyeToWorld, float4(f.Position, 1));\r\n\r\nfloat cliptest = mul(inverse(ClipPlaneTransform), float4(wp, 1)).z+.5;\r\n\r\nfloat clipscaled = saturate(1-(cliptest-.5) * hardness -.5);\r\n\r\n//clip(clipscaled);  // Not really needed in this case, as Fusion clips any fragment with very low alpha\r\n\r\nif (EdgeMaterialOnly) \r\n{\r\nret.a = smoothstep(0,1, clipscaled/BaseMtl.Shade(f).a);\r\n}\r\nelse\r\n{\r\nret.a = smoothstep(0,1, clipscaled) * BaseMtl.Shade(f).a;\r\n}\r\n\r\n//ret = clipscaled;  // For debugging\r\n\r\nreturn ret;\r\n\r\n}", },
  174.                 RCGroup = Input { Value = 1, },
  175.                 RCMatrices = Input { Value = 81, },
  176.                 MaterialGroup = Input { Value = 1, },
  177.                 FloatGroup = Input { Value = 1, },
  178.                 BoolGroup = Input { Value = 1, },
  179.                 MatrixGroup = Input { Value = 1, },
  180.                 MaterialIDNest = Input { Value = 1, },
  181.                 MaterialID = Input { Value = 1, },
  182.                 hardness = Input {
  183.                     Value = 3.3170732,
  184.                     CustomData = {
  185.                         Metadata = {
  186.                             Type = "Float",
  187.                             Set = "hardness",
  188.                         },
  189.                     },
  190.                 },
  191.                 ClipPlaneTransformTx = Input {
  192.                     SourceOp = "Publish1",
  193.                     Source = "Value",
  194.                     CustomData = {
  195.                         Metadata = {
  196.                             Type = "Matrix",
  197.                             Set = "ClipPlaneTransform",
  198.                             Input = "Tx",
  199.                         },
  200.                     },
  201.                 },
  202.                 ClipPlaneTransformTy = Input {
  203.                     SourceOp = "Publish2",
  204.                     Source = "Value",
  205.                     CustomData = {
  206.                         Metadata = {
  207.                             Type = "Matrix",
  208.                             Set = "ClipPlaneTransform",
  209.                             Input = "Ty",
  210.                         },
  211.                     },
  212.                 },
  213.                 ClipPlaneTransformTz = Input {
  214.                     SourceOp = "Publish3",
  215.                     Source = "Value",
  216.                     CustomData = {
  217.                         Metadata = {
  218.                             Type = "Matrix",
  219.                             Set = "ClipPlaneTransform",
  220.                             Input = "Tz",
  221.                         },
  222.                     },
  223.                 },
  224.                 ClipPlaneTransformRotationOrder = Input {
  225.                     CustomData = {
  226.                         Metadata = {
  227.                             Type = "Matrix",
  228.                             Set = "ClipPlaneTransform",
  229.                             Input = "RotationOrder",
  230.                         },
  231.                     },
  232.                 },
  233.                 ClipPlaneTransformRx = Input {
  234.                     SourceOp = "Publish4",
  235.                     Source = "Value",
  236.                     CustomData = {
  237.                         Metadata = {
  238.                             Type = "Matrix",
  239.                             Set = "ClipPlaneTransform",
  240.                             Input = "Rx",
  241.                         },
  242.                     },
  243.                 },
  244.                 ClipPlaneTransformRy = Input {
  245.                     SourceOp = "Publish5",
  246.                     Source = "Value",
  247.                     CustomData = {
  248.                         Metadata = {
  249.                             Type = "Matrix",
  250.                             Set = "ClipPlaneTransform",
  251.                             Input = "Ry",
  252.                         },
  253.                     },
  254.                 },
  255.                 ClipPlaneTransformRz = Input {
  256.                     SourceOp = "Publish6",
  257.                     Source = "Value",
  258.                     CustomData = {
  259.                         Metadata = {
  260.                             Type = "Matrix",
  261.                             Set = "ClipPlaneTransform",
  262.                             Input = "Rz",
  263.                         },
  264.                     },
  265.                 },
  266.                 ClipPlaneTransformSx = Input {
  267.                     CustomData = {
  268.                         Metadata = {
  269.                             Type = "Matrix",
  270.                             Set = "ClipPlaneTransform",
  271.                             Input = "Sx",
  272.                         },
  273.                     },
  274.                 },
  275.                 ClipPlaneTransformSy = Input {
  276.                     CustomData = {
  277.                         Metadata = {
  278.                             Type = "Matrix",
  279.                             Set = "ClipPlaneTransform",
  280.                             Input = "Sy",
  281.                         },
  282.                     },
  283.                 },
  284.                 ClipPlaneTransformSz = Input {
  285.                     CustomData = {
  286.                         Metadata = {
  287.                             Type = "Matrix",
  288.                             Set = "ClipPlaneTransform",
  289.                             Input = "Sz",
  290.                         },
  291.                     },
  292.                 },
  293.                 ClipPlaneTransformPx = Input {
  294.                     SourceOp = "Publish7",
  295.                     Source = "Value",
  296.                     CustomData = {
  297.                         Metadata = {
  298.                             Type = "Matrix",
  299.                             Set = "ClipPlaneTransform",
  300.                             Input = "Px",
  301.                         },
  302.                     },
  303.                 },
  304.                 ClipPlaneTransformPy = Input {
  305.                     SourceOp = "Publish8",
  306.                     Source = "Value",
  307.                     CustomData = {
  308.                         Metadata = {
  309.                             Type = "Matrix",
  310.                             Set = "ClipPlaneTransform",
  311.                             Input = "Py",
  312.                         },
  313.                     },
  314.                 },
  315.                 ClipPlaneTransformPz = Input {
  316.                     SourceOp = "Publish9",
  317.                     Source = "Value",
  318.                     CustomData = {
  319.                         Metadata = {
  320.                             Type = "Matrix",
  321.                             Set = "ClipPlaneTransform",
  322.                             Input = "Pz",
  323.                         },
  324.                     },
  325.                 },
  326.                 BaseMtl = Input {
  327.                     SourceOp = "FastNoise2",
  328.                     Source = "Output",
  329.                     CustomData = {
  330.                         Metadata = {
  331.                             Type = "Material",
  332.                             Set = "BaseMtl",
  333.                         },
  334.                     },
  335.                 },
  336.                 EdgeMaterialOnly = Input {
  337.                     Value = 1,
  338.                     CustomData = {
  339.                         Metadata = {
  340.                             Type = "Bool",
  341.                             Set = "EdgeMaterialOnly",
  342.                         },
  343.                     },
  344.                 },
  345.             },
  346.             ViewInfo = OperatorInfo {
  347.                 Pos = { 0, 1798.5, },
  348.                 Flags = {
  349.                     ShowPic = true,
  350.                 },
  351.             },
  352.             UserControls = ordered() {
  353.                 hardness = {
  354.                     LINKID_DataType = "Number",
  355.                     INPID_InputControl = "SliderControl",
  356.                     IC_ControlPage = 0,
  357.                 },
  358.                 ClipPlaneTransformTx = {
  359.                     LINKID_DataType = "Number",
  360.                     ICS_Name = "X Translation",
  361.                     INP_Default = 0,
  362.                     INP_MinScale = -0.5,
  363.                     INPID_InputControl = "ScrewControl",
  364.                     INP_MaxScale = 0.5,
  365.                     IC_ControlPage = 5,
  366.                 },
  367.                 ClipPlaneTransformTy = {
  368.                     LINKID_DataType = "Number",
  369.                     ICS_Name = "Y Translation",
  370.                     INP_Default = 0,
  371.                     INP_MinScale = -0.5,
  372.                     INPID_InputControl = "ScrewControl",
  373.                     INP_MaxScale = 0.5,
  374.                     IC_ControlPage = 5,
  375.                 },
  376.                 ClipPlaneTransformTz = {
  377.                     LINKID_DataType = "Number",
  378.                     ICS_Name = "Z Translation",
  379.                     INP_Default = 0,
  380.                     INP_MinScale = -0.5,
  381.                     INPID_InputControl = "ScrewControl",
  382.                     INP_MaxScale = 0.5,
  383.                     IC_ControlPage = 5,
  384.                 },
  385.                 ClipPlaneTransformRotationOrder = {
  386.                     {
  387.                         MBTNC_AddButton = "XYZ",
  388.                     },
  389.                     {
  390.                         MBTNC_AddButton = "XZY",
  391.                     },
  392.                     {
  393.                         MBTNC_AddButton = "YXZ",
  394.                     },
  395.                     {
  396.                         MBTNC_AddButton = "YZX",
  397.                     },
  398.                     {
  399.                         MBTNC_AddButton = "ZXY",
  400.                     },
  401.                     {
  402.                         MBTNC_AddButton = "ZYX",
  403.                     },
  404.                     LINKID_DataType = "FuID",
  405.                     ICS_Name = "Rotation order",
  406.                     MBTNC_StretchToFit = true,
  407.                     INPID_InputControl = "MultiButtonIDControl",
  408.                     INPID_DefaultID = "XYZ",
  409.                     IC_ControlPage = 5,
  410.                 },
  411.                 ClipPlaneTransformRx = {
  412.                     LINKID_DataType = "Number",
  413.                     ICS_Name = "X Rotation",
  414.                     INP_Default = 0,
  415.                     INP_MinScale = -180,
  416.                     IC_ControlPage = 5,
  417.                     INPID_InputControl = "ScrewControl",
  418.                     INP_MaxScale = 180,
  419.                     IC_Steps = 3601,
  420.                 },
  421.                 ClipPlaneTransformRy = {
  422.                     LINKID_DataType = "Number",
  423.                     ICS_Name = "Y Rotation",
  424.                     INP_Default = 0,
  425.                     INP_MinScale = -180,
  426.                     IC_ControlPage = 5,
  427.                     INPID_InputControl = "ScrewControl",
  428.                     INP_MaxScale = 180,
  429.                     IC_Steps = 3601,
  430.                 },
  431.                 ClipPlaneTransformRz = {
  432.                     LINKID_DataType = "Number",
  433.                     ICS_Name = "Z Rotation",
  434.                     INP_Default = 0,
  435.                     INP_MinScale = -180,
  436.                     IC_ControlPage = 5,
  437.                     INPID_InputControl = "ScrewControl",
  438.                     INP_MaxScale = 180,
  439.                     IC_Steps = 3601,
  440.                 },
  441.                 ClipPlaneTransformSx = {
  442.                     LINKID_DataType = "Number",
  443.                     ICS_Name = "X Scale",
  444.                     INP_Default = 1,
  445.                     INP_MinScale = -3,
  446.                     INPID_InputControl = "SliderControl",
  447.                     INP_MaxScale = 3,
  448.                     IC_ControlPage = 5,
  449.                 },
  450.                 ClipPlaneTransformSy = {
  451.                     LINKID_DataType = "Number",
  452.                     ICS_Name = "Y Scale",
  453.                     INP_Default = 1,
  454.                     INP_MinScale = -3,
  455.                     INPID_InputControl = "SliderControl",
  456.                     INP_MaxScale = 3,
  457.                     IC_ControlPage = 5,
  458.                 },
  459.                 ClipPlaneTransformSz = {
  460.                     LINKID_DataType = "Number",
  461.                     ICS_Name = "Z Scale",
  462.                     INP_Default = 1,
  463.                     INP_MinScale = -3,
  464.                     INPID_InputControl = "SliderControl",
  465.                     INP_MaxScale = 3,
  466.                     IC_ControlPage = 5,
  467.                 },
  468.                 ClipPlaneTransformPx = {
  469.                     LINKID_DataType = "Number",
  470.                     ICS_Name = "X Pivot",
  471.                     INP_Default = 0,
  472.                     INP_MinScale = -1,
  473.                     INPID_InputControl = "ScrewControl",
  474.                     INP_MaxScale = 1,
  475.                     IC_ControlPage = 5,
  476.                 },
  477.                 ClipPlaneTransformPy = {
  478.                     LINKID_DataType = "Number",
  479.                     ICS_Name = "Y Pivot",
  480.                     INP_Default = 0,
  481.                     INP_MinScale = -1,
  482.                     INPID_InputControl = "ScrewControl",
  483.                     INP_MaxScale = 1,
  484.                     IC_ControlPage = 5,
  485.                 },
  486.                 ClipPlaneTransformPz = {
  487.                     LINKID_DataType = "Number",
  488.                     ICS_Name = "Z Pivot",
  489.                     INP_Default = 0,
  490.                     INP_MinScale = -1,
  491.                     INPID_InputControl = "ScrewControl",
  492.                     INP_MaxScale = 1,
  493.                     IC_ControlPage = 5,
  494.                 },
  495.                 BaseMtl = {
  496.                     {
  497.                         LINKID_DataType = "MtlGraph3D",
  498.                     },
  499.                     {
  500.                         LINKID_DataType = "Image",
  501.                     },
  502.                     {
  503.                         LINKID_AllowedDataType = "Image",
  504.                     },
  505.                     {
  506.                         LINKID_AllowedDataType = "Mask",
  507.                     },
  508.                     INP_AcceptsGLImages = true,
  509.                     LINK_Main = 1,
  510.                     INP_AcceptsMasks = true,
  511.                     INPID_InputControl = "ImageControl",
  512.                     INP_Required = false,
  513.                     IC_ControlPage = 0,
  514.                 },
  515.                 EdgeMaterialOnly = {
  516.                     LINKID_DataType = "Number",
  517.                     INPID_InputControl = "CheckboxControl",
  518.                     IC_ControlPage = 0,
  519.                 },
  520.             },
  521.         },
  522.         ChannelBoolean1 = MtlChanBool {
  523.             Inputs = {
  524.                 OperationA = Input { Value = 2, },
  525.                 BackgroundMaterial = Input {
  526.                     SourceOp = "Phong1",
  527.                     Source = "MaterialOutput",
  528.                 },
  529.                 MaterialID = Input { Value = 3, },
  530.             },
  531.             ViewInfo = OperatorInfo { Pos = { 330, 1864.5, }, },
  532.         },
  533.         ReplaceMaterial3D1 = ReplaceMaterial3D {
  534.             Inputs = {
  535.                 SceneInput = Input {
  536.                     SourceOp = "Shape3D_Sphere",
  537.                     Source = "Output",
  538.                 },
  539.                 ["ReplaceMode.Nest"] = Input { Value = 1, },
  540.                 MaterialInput = Input {
  541.                     SourceOp = "ChannelBoolean1",
  542.                     Source = "MaterialOutput",
  543.                 },
  544.                 ["MtlStdInputs.MaterialID"] = Input { Value = 1, },
  545.             },
  546.             ViewInfo = OperatorInfo { Pos = { 495, 1864.5, }, },
  547.         },
  548.         Phong1 = MtlPhong {
  549.             Inputs = {
  550.                 ["Diffuse.Color.Green"] = Input { Value = 0.0985757676180934, },
  551.                 ["Diffuse.Color.Material"] = Input {
  552.                     SourceOp = "CustomShader3D_SoftClip_Plane",
  553.                     Source = "MaterialOutput",
  554.                 },
  555.                 ["Specular.Nest"] = Input { Value = 1, },
  556.                 ["Specular.Exponent"] = Input { Value = 17.8, },
  557.                 ["Bumpmap.Material"] = Input {
  558.                     SourceOp = "BumpMap1",
  559.                     Source = "MaterialOutput",
  560.                 },
  561.                 UseTwoSidedLighting = Input { Value = 1, },
  562.                 MaterialID = Input { Value = 2, },
  563.             },
  564.             ViewInfo = OperatorInfo { Pos = { 165, 1798.5, }, },
  565.         },
  566.         BumpMap1 = BumpMap {
  567.             Inputs = {
  568.                 Input = Input {
  569.                     SourceOp = "FastNoise2",
  570.                     Source = "Output",
  571.                 },
  572.                 HeightScale = Input { Value = 0.5, },
  573.                 MaterialID = Input { Value = 8, },
  574.             },
  575.             ViewInfo = OperatorInfo { Pos = { 165, 1732.5, }, },
  576.         },
  577.         Shape3D_Sphere = Shape3D {
  578.             NameSet = true,
  579.             CustomData = {
  580.                 Settings = {
  581.                     [1] = {
  582.                         Tools = ordered() {
  583.                             Shape3D1 = Shape3D {
  584.                                 CtrlWZoom = false,
  585.                                 CustomData = {
  586.                                 },
  587.                                 Inputs = {
  588.                                     Shape = Input { Value = FuID { "SurfaceCubeInputs", }, },
  589.                                     MaterialInput = Input {
  590.                                         SourceOp = "Blinn1",
  591.                                         Source = "MaterialOutput",
  592.                                     },
  593.                                     ["MtlStdInputs.MaterialID"] = Input { Value = 1, },
  594.                                     ["SurfacePlaneInputs.ObjectID.ObjectID"] = Input { Value = 1, },
  595.                                     ["SurfaceTorusInputs.Radius"] = Input { Value = 1.5853659, },
  596.                                     ["SurfaceTorusInputs.Section"] = Input { Value = 0.5749129, },
  597.                                     ["SurfaceTorusInputs.SubdivisionLevelBase"] = Input { Value = 44, },
  598.                                     ["SurfaceTorusInputs.SubdivisionLevelHeight"] = Input { Value = 51, },
  599.                                     ["SurfaceTorusInputs.BlendMode.Nest"] = Input { Value = 1, },
  600.                                     ["SurfaceTorusInputs.BlendMode.GL.BlendMode"] = Input { Value = FuID { "Subtractive", }, },
  601.                                     ["SurfaceTorusInputs.ObjectID.ObjectID"] = Input { Value = 2, },
  602.                                     ["SurfaceCubeInputs.Width"] = Input { Value = 2.3344948, },
  603.                                     ["SurfaceCubeInputs.Visibility.Nest"] = Input { Value = 1, },
  604.                                     ["SurfaceCubeInputs.BlendMode.Nest"] = Input { Value = 1, },
  605.                                     ["SurfaceCubeInputs.BlendMode.GL.BlendMode"] = Input { Value = FuID { "Subtractive", }, },
  606.                                     ["SurfaceCubeInputs.ObjectID.ObjectID"] = Input { Value = 3, },
  607.                                     ["SurfaceSphereInputs.ObjectID.ObjectID"] = Input { Value = 4, },
  608.                                     ["SurfaceIcoInputs.ObjectID.ObjectID"] = Input { Value = 5, },
  609.                                     ["SurfaceConeInputs.ObjectID.ObjectID"] = Input { Value = 6, },
  610.                                 },
  611.                                 ViewInfo = OperatorInfo { Pos = { 1210, 280.5, }, },
  612.                             },
  613.                         },
  614.                     },
  615.                 },
  616.             },
  617.             Inputs = {
  618.                 ["SurfacePlaneInputs.ObjectID.ObjectID"] = Input { Value = 1, },
  619.                 ["Transform3DOp.ScaleLock"] = Input { Value = 0, },
  620.                 ["Transform3DOp.Scale.Y"] = Input { Value = 0.9574874, },
  621.                 Shape = Input { Value = FuID { "SurfaceTorusInputs", }, },
  622.                 MaterialInput = Input {
  623.                     SourceOp = "Phong1",
  624.                     Source = "MaterialOutput",
  625.                 },
  626.                 ["MtlStdInputs.MaterialID"] = Input { Value = 1, },
  627.                 ["SurfaceIcoInputs.Size"] = Input { Value = 1.5679443, },
  628.                 ["SurfaceIcoInputs.SubdivisionLevel"] = Input { Value = 5, },
  629.                 ["SurfaceIcoInputs.BlendMode.Nest"] = Input { Value = 1, },
  630.                 ["SurfaceIcoInputs.BlendMode.GL.BlendMode"] = Input { Value = FuID { "Subtractive", }, },
  631.                 ["SurfaceIcoInputs.ObjectID.ObjectID"] = Input { Value = 5, },
  632.                 ["SurfaceCylinderInputs.ObjectID.ObjectID"] = Input { Value = 8, },
  633.                 ["SurfaceSphereInputs.ObjectID.ObjectID"] = Input { Value = 4, },
  634.                 ["SurfaceCubeInputs.Width"] = Input { Value = 2.3344948, },
  635.                 ["SurfaceCubeInputs.Visibility.Nest"] = Input { Value = 1, },
  636.                 ["SurfaceCubeInputs.BlendMode.Nest"] = Input { Value = 1, },
  637.                 ["SurfaceCubeInputs.BlendMode.GL.BlendMode"] = Input { Value = FuID { "Subtractive", }, },
  638.                 ["SurfaceCubeInputs.ObjectID.ObjectID"] = Input { Value = 3, },
  639.                 ["SurfaceConeInputs.ObjectID.ObjectID"] = Input { Value = 6, },
  640.                 ["SurfaceTorusInputs.Radius"] = Input { Value = 1.5853659, },
  641.                 ["SurfaceTorusInputs.Section"] = Input { Value = 0.5749129, },
  642.                 ["SurfaceTorusInputs.SubdivisionLevelBase"] = Input { Value = 34, },
  643.                 ["SurfaceTorusInputs.SubdivisionLevelHeight"] = Input { Value = 31, },
  644.                 ["SurfaceTorusInputs.BlendMode.Nest"] = Input { Value = 1, },
  645.                 ["SurfaceTorusInputs.BlendMode.GL.BlendMode"] = Input { Value = FuID { "Subtractive", }, },
  646.                 ["SurfaceTorusInputs.ObjectID.ObjectID"] = Input { Value = 2, },
  647.             },
  648.             ViewInfo = OperatorInfo { Pos = { 385, 1798.5, }, },
  649.         },
  650.         FastNoise2 = FastNoise {
  651.             Inputs = {
  652.                 Width = Input { Value = 2048, },
  653.                 Height = Input { Value = 512, },
  654.                 ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2", }, },
  655.                 Discontinuous = Input { Value = 1, },
  656.                 Inverted = Input { Value = 1, },
  657.                 Detail = Input { Value = 3.317757, },
  658.                 Contrast = Input { Value = 1.2429907, },
  659.                 XScale = Input { Value = 90, },
  660.                 Gradient = Input {
  661.                     Value = Gradient {
  662.                         Colors = {
  663.                             [0] = { 0, 0, 0, 1, },
  664.                             [1] = { 1, 1, 1, 1, },
  665.                         },
  666.                     },
  667.                 },
  668.             },
  669.             ViewInfo = OperatorInfo { Pos = { 0, 1699.5, }, },
  670.         },
  671.         Note10 = Note {
  672.             Inputs = {
  673.                 Comments = Input { Value = "Referencing another object to make a soft clip plane in a shader.", },
  674.             },
  675.             ViewInfo = StickyNoteInfo {
  676.                 Pos = { -220, 1765.5, },
  677.                 Flags = {
  678.                     Expanded = true,
  679.                 },
  680.                 Size = { 196, 179.3, },
  681.             },
  682.         },
  683.         Override3D1 = Override3D {
  684.             Inputs = {
  685.                 SceneInput = Input {
  686.                     SourceOp = "ReplaceMaterial3D1",
  687.                     Source = "Output",
  688.                 },
  689.                 ["Wireframe.DoWireframe"] = Input { Value = 1, },
  690.                 ["Wireframe.Wireframe"] = Input { Value = 1, },
  691.             },
  692.             ViewInfo = OperatorInfo { Pos = { 605, 1864.5, }, },
  693.         },
  694.         Merge3D1_1 = Merge3D {
  695.             Inputs = {
  696.                 SceneInput1 = Input {
  697.                     SourceOp = "Override3D1",
  698.                     Source = "Output",
  699.                 },
  700.                 SceneInput2 = Input {
  701.                     SourceOp = "Shape3D_Sphere",
  702.                     Source = "Output",
  703.                 },
  704.                 SceneInput3 = Input {
  705.                     SourceOp = "Merge3D4",
  706.                     Source = "Output",
  707.                 },
  708.             },
  709.             ViewInfo = OperatorInfo { Pos = { 715, 1798.5, }, },
  710.         },
  711.         DirectionalLight1 = LightDirectional {
  712.             Inputs = {
  713.                 ["Transform3DOp.Translate.X"] = Input { Value = 15, },
  714.                 ["Transform3DOp.Translate.Y"] = Input { Value = 15, },
  715.                 ["Transform3DOp.Translate.Z"] = Input { Value = 5, },
  716.                 ["Transform3DOp.Rotate.X"] = Input { Value = 45.8653846, },
  717.                 ["Transform3DOp.Rotate.Y"] = Input { Value = 147.9807692, },
  718.                 ["Transform3DOp.Rotate.Z"] = Input { Value = -166.1538462, },
  719.             },
  720.             ViewInfo = OperatorInfo { Pos = { 825, 1963.5, }, },
  721.         },
  722.         Camera3D3 = Camera3D {
  723.             Inputs = {
  724.                 ["Transform3DOp.Translate.X"] = Input { Value = -6.58001908383642, },
  725.                 ["Transform3DOp.Translate.Y"] = Input { Value = 1.63080772176951, },
  726.                 ["Transform3DOp.Translate.Z"] = Input { Value = 3.57666566713959, },
  727.                 ["Transform3DOp.Rotate.X"] = Input { Value = -12.0000057220459, },
  728.                 ["Transform3DOp.Rotate.Y"] = Input { Value = -60.8000030517578, },
  729.                 AovType = Input { Value = 1, },
  730.                 AoV = Input { Value = 35, },
  731.                 FLength = Input { Value = 31.9011691600901, },
  732.                 ["Stereo.Mode"] = Input { Value = FuID { "OffAxis", }, },
  733.                 ControlVis = Input { Value = 1, },
  734.                 ShowViewControls = Input { Value = 0, },
  735.                 ["SurfacePlaneInputs.ObjectID.ObjectID"] = Input { Value = 4, },
  736.                 ["MtlStdInputs.MaterialID"] = Input { Value = 5, },
  737.             },
  738.             ViewInfo = OperatorInfo { Pos = { 825, 1930.5, }, },
  739.         },
  740.         DirectionalLight1_1 = LightDirectional {
  741.             Inputs = {
  742.                 ["Transform3DOp.Translate.X"] = Input { Value = 15, },
  743.                 ["Transform3DOp.Translate.Y"] = Input { Value = 15, },
  744.                 ["Transform3DOp.Rotate.X"] = Input { Value = -15.5769231, },
  745.                 ["Transform3DOp.Rotate.Y"] = Input { Value = 434.4230769, },
  746.             },
  747.             ViewInfo = OperatorInfo { Pos = { 825, 1996.5, }, },
  748.         },
  749.         Merge3D3 = Merge3D {
  750.             Inputs = {
  751.                 SceneInput1 = Input {
  752.                     SourceOp = "Merge3D1_1",
  753.                     Source = "Output",
  754.                 },
  755.                 SceneInput2 = Input {
  756.                     SourceOp = "Camera3D3",
  757.                     Source = "Output",
  758.                 },
  759.                 SceneInput3 = Input {
  760.                     SourceOp = "DirectionalLight1",
  761.                     Source = "Output",
  762.                 },
  763.                 SceneInput4 = Input {
  764.                     SourceOp = "DirectionalLight1_1",
  765.                     Source = "Output",
  766.                 },
  767.             },
  768.             ViewInfo = OperatorInfo { Pos = { 935, 1864.5, }, },
  769.         },
  770.         Renderer3D3 = Renderer3D {
  771.             CtrlWZoom = false,
  772.             Inputs = {
  773.                 Width = Input { Value = 1280, },
  774.                 Height = Input { Value = 720, },
  775.                 Depth = Input { Value = 4, },
  776.                 ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2", }, },
  777.                 SceneInput = Input {
  778.                     SourceOp = "Merge3D3",
  779.                     Source = "Output",
  780.                 },
  781.                 RendererType = Input { Value = FuID { "RendererOpenGL", }, },
  782.                 ["RendererOpenGL.Channels.Nest"] = Input { Value = 1, },
  783.                 ["RendererOpenGL.Channels.RGBASS"] = Input { Value = 1, },
  784.                 ["RendererOpenGL.Supersampling"] = Input { Value = 1, },
  785.                 ["RendererOpenGL.SSRateX"] = Input { Value = 2, },
  786.                 ["RendererOpenGL.AccumulationEffects"] = Input { Value = 1, },
  787.                 ["RendererOpenGL.LightingEnabled"] = Input { Value = 1, },
  788.                 ["RendererOpenGL.Texturing"] = Input { Value = 1, },
  789.                 ["RendererOpenGL.TextureDepth"] = Input { Value = 4, },
  790.                 ["RendererOpenGL.TransparencySorting"] = Input { Value = 2, },
  791.             },
  792.             ViewInfo = OperatorInfo { Pos = { 1100, 1864.5, }, },
  793.         },
  794.     },
  795.     ActiveTool = "Renderer3D3",
  796. }




SecondMan wrote:You know what would also be neat? If the area of the slice could be closed. Possible?


Closed how?

Re: CustomShader3D: Cg shader editing in your comp

Posted: Thu Jun 02, 2016 12:36 pm
by SecondMan
Oh wow. Did you do that just now?

Closed as in you can't see inside the teapot in the above example.

Hmmm right, now that I think of it, probably not. Fragment shading , right.