Weave - 图1

    1. // Making a simple Weave, can be used for carbon fiber, cloth, or similar
    2. // Weave.osl, by Zap Andersson
    3. // Modified: 2018-12-06
    4. // Modified: 2021-02-22 by Saul Espinosa for Redshift 3D
    5. // Copyright 2018 Autodesk Inc, All rights reserved. This file is licensed under Apache 2.0 license
    6. // https://github.com/ADN-DevTech/3dsMax-OSL-Shaders/blob/master/LICENSE.txt
    7. shader Weave
    8. [[ string help="<font size=+1><b>Weave</b></font><br>A simple threaded weave shader. Can be used for everything from cloth to carbon fiber.",
    9. string label = "Weave",
    10. string URL ="https://github.com/ADN-DevTech/3dsMax-OSL-Shaders" ]]
    11. (
    12. point UVW = point(u,v,0),
    13. float Scale = 0.2,
    14. // Inputs
    15. color U_Color = 0.2 [[ string label = "U Color"]],
    16. color V_Color = 0.5 [[ string label = "V Color"]],
    17. float Width = 0.5
    18. [[ float min = 0.0, float max = 1.0 ]],
    19. float Roundness = 1.0
    20. [[ float min = 0.0, float max = 1.0 ]],
    21. float RoundnessBump = 1.0
    22. [[ float min = 0.0, float max = 2.0 ]],
    23. float RoundShadow = 0.5
    24. [[ float min = 0.0, float max = 1.0 ]],
    25. float WeaveBump = 0.5
    26. [[ float min = 0.0, float max = 2.0 ]],
    27. float WeaveShadow = 0.4
    28. [[ float min = 0.0, float max = 1.0 ]],
    29. float Frizz = 0.0
    30. [[ float min = 0.0, float max = 1.0 ]],
    31. float FrizzBump = 0.0
    32. [[ float min = 0.0, float max = 2.0 ]],
    33. float FrizzScale = 0.1
    34. [[ float min = 0.0, float max = 10.0 ]],
    35. float Bendyness = 0.2
    36. [[ float min = 0.0, float max = 1.0 ]],
    37. float BendynessScale = 3.0
    38. [[ float min = 0.0, float max = 10.0 ]],
    39. float OpacityFade = 0.0
    40. [[ float min = 0.0, float max = 1.0 ]],
    41. // Outputs
    42. output color Col = 0.0,
    43. output float Bump = 0.5,
    44. output float ThreadID = 0,
    45. output float Opacity = 0.0,
    46. )
    47. {
    48. // Compute the scaled point
    49. point uvw = UVW / Scale;
    50. // Add frizz to the width
    51. float frizz = noise("perlin", uvw / FrizzScale) ;
    52. float w2 = Width + frizz * Frizz;
    53. float w = w2 * 0.5;
    54. int uf = int(floor(uvw[0]));
    55. int vf = int(floor(uvw[1]));
    56. // Compute an independent per-thread randomness for bending it
    57. float ubend = noise("perlin", uvw[1] / BendynessScale + uf) * Bendyness;
    58. float vbend = noise("perlin", uvw[0] / BendynessScale + vf) * Bendyness;
    59. // Compute the thread coordinates
    60. float sx = uvw[0] - uf + ubend;
    61. float sy = uvw[1] - vf + vbend;
    62. int onU = (sy > 0.5 - w && sy < 0.5 + w);
    63. int onV = (sx > 0.5 - w && sx < 0.5 + w);
    64. float uu = (sy - (0.5 - w)) / w2;
    65. float vv = (sx - (0.5 - w)) / w2;
    66. // Odd or even U / V ?
    67. int oddU = uf % 2;
    68. int oddV = vf % 2;
    69. // Are we on neither thread? Just return
    70. if (onU == 0 && onV == 0) return;
    71. int U_on_top = (oddU ^ oddV) == 0;
    72. // Both - disambiguate
    73. if (onU && onV)
    74. {
    75. onU = U_on_top;
    76. onV = onU == 0;
    77. }
    78. // Return a random ID for each thread
    79. ThreadID = 1 + float((cellnoise(uf) * onV + cellnoise(vf) * onU) * 1024.0) + onU;
    80. // Which color to return?
    81. if (onU)
    82. Col = U_Color;
    83. else
    84. Col = V_Color;
    85. // Compute the bump and fake "Shadowing"
    86. float r = Roundness;
    87. float weave = (onU) ? sin((uvw[0] + oddV) * M_PI) : sin((uvw[1] + oddU + 1.0) * M_PI);
    88. float ubulge = sin(uu * M_PI);
    89. float vbulge = sin(vv * M_PI);
    90. float bulge = pow((onU ? ubulge : vbulge), r);
    91. Opacity = max(pow(ubulge, OpacityFade), pow(vbulge, OpacityFade));
    92. Bump = 0.2 + weave * WeaveBump + bulge * RoundnessBump + frizz * FrizzBump;
    93. Col *= mix(1.0, bulge, RoundShadow);
    94. Col *= mix(1.0, weave, WeaveShadow);
    95. }