发信人: yahoo(乡巴佬) 
整理人: avexdesign(2003-11-11 20:18:20), 站内信件
 | 
 
 
视乎你用什么渲染器,就用什么语言。
 MAX的默认渲染器我就不知道可不可以编程,
 但mental ray和renderman就肯定可以。
 还有bmrt也可以,语言是类似C++的。
 
 以下的就是bmrt渲染器的brick(砖墙)材质的程序,稍作修改应该也可在
 renderman下编译通过。
 我就看不明白了,希望mayaX能尽快写出编shade的教程。
 
 /*
  * brick.sl -- Surface shader for a bricks.
  *
  * DESCRIPTION:
  *   Makes a wall of bricks.  Need more be said?  OK.  It makes a good
  *   looking staggered brick masonry.  It is especially convincing when
  *   used in conjunction with the "brickbump" displacement shader (and
  *   identical parameters).  Every other row of bricks is staggered.
  *   The staggering isn't exact, however, and this variance is controlled
  *   by the "rowvary" parameter.
  * 
  * PARAMETERS:
  *    Ka, Kd			The usual
  *    brickcolor, mortarcolor	Pretty obvious (default is red bricks)
  *    brickvary                 How much does the brick color vary from
  *     				   brick to brick?
  *    brickwidth                Width of a brick (in st space)
  *    brickheight               Height of a brick (in st space)
  *    mortarthickness           Thickness of the mortar (in st space)
  *    rowvary                   How much does each row shift?
  *    jagged                    How much do bricks deviate from squares?
  *
  * The Blue Moon Rendering Tools (BMRT) are:
  * (c) Copyright 1990-2000 Exluna, Inc. and Larry Gritz. All rights reserved.
  */
 
 
 
 #include "noises.h"
 #include "patterns.h"
 
 surface
 brick ( float Ka = 1, Kd = 1;
 	color brickcolor = color "rgb" (.6,.1,.1);
 	color mortarcolor = color "rgb" (.6,.6,.6);
 	float raggedamp = 0.04, raggedfreq = 12;
         float jagged = 0.006, brickvary = 0.3;
         float brickwidth = .28, brickheight = .07;
         float mortarthickness = .014;
         float rowvary = .5;
 	float pitting = 0.01;
 	float pockfrequency = 10, groovedepth = 0.01;
     )
 {
 #define sqr(x) ((x)*(x))
     color bcolor, Ct;
     normal Nf;
     float sbrick, tbrick, w, h;
     float ss, tt;
     float swidth, twidth;
     uniform float BMWIDTH = (brickwidth+mortarthickness);
     uniform float BMHEIGHT = (brickheight+mortarthickness);
     uniform float MWF = (mortarthickness*0.5/BMWIDTH);
     uniform float MHF = (mortarthickness*0.5/BMHEIGHT);
     float whichbrick;
     float fact, disp;
 
     /* Determine how wide in s-t space one pixel projects to, relative
      * the the width and height of a brick.  Overestimate the filter
      * size by a bit -- it makes the transitions between brick and mortar
      * a bit smoother.
      */
     swidth = 1.5 * max (filterwidth(s), MINFILTWIDTH) / BMWIDTH;
     twidth = 1.5 * max (filterwidth(t), MINFILTWIDTH) / BMHEIGHT;
     
     basicbrick (s, t, BMWIDTH, BMHEIGHT, 0.5, 0.2, 1, jagged,
 		sbrick, tbrick, ss, tt);
 
     /* Make the edges ragged, but different for each brick */
     whichbrick = 103*sbrick + tbrick;
     ss += raggedamp * snoisexy ((s+tbrick*5.15)*raggedfreq,
 				(t+sbrick*23.8)*raggedfreq);
     tt += raggedamp * snoisexy ((s+tbrick*11.4)*raggedfreq,
 				(t+sbrick*7.2)*raggedfreq);
     ss += raggedamp/2 * snoisexy ((s+tbrick*5.15)*raggedfreq*2,
 				  (t+sbrick*23.8)*raggedfreq*2);
     tt += raggedamp/2 * snoisexy ((s+tbrick*11.4)*raggedfreq*2,
 				  (t+sbrick*7.2)*raggedfreq*2);
 
     /* Choose a color for the surface */
     if (swidth >= 1)
 	w = 1 - 2*MWF;
     else w = clamp (filteredpulse (MWF, 1-MWF, ss, swidth), max(1-MWF/swidth,0), 1);
     if (twidth >= 1)
 	h = 1 - 2*MHF;
     else h = clamp (filteredpulse (MHF, 1-MHF, tt, twidth), max(1-MHF/twidth,0), 1);
 
     fact = 1;
     disp = 0;
     if (tt < MHF) {
 	/* We're in the top horizontal groove */
 	disp = groovedepth * (sqr((tt)/MHF) - 1);
     }
     else if (tt > (1.0-MHF)) {
       /* Bottom horizontal groove */
 	disp = groovedepth * (sqr((1-tt)/MHF) - 1);
     }
     if (ss < MWF) {
 	disp = min (disp, 0.85 * groovedepth * (sqr(ss/MWF) - 1));
     }
     else if (ss > (1.0-MWF)) {
 	disp = min (disp, 0.85 * groovedepth * (sqr((1-ss)/MWF) - 1));
     }
 
     fact = smoothstep (0, 1.3*MHF, tt) - smoothstep (1.0-1.3*MHF, 1, tt);
     fact *= (smoothstep (0, 1.3*MWF, ss) - smoothstep (1.0-1.3*MWF, 1, ss));
     fact = pitting * (0.5 * fact + 0.5);
     disp -= fact * pow(noise ((ss+sbrick)*pockfrequency/BMHEIGHT,
 			      (tt+tbrick)*pockfrequency/BMWIDTH), 0.25);
 
     P += disp * normalize(N);
     N = calculatenormal (P);
     Nf = faceforward (normalize(N),I);
 
 
     /* Choose a brick color that varies from brick to brick */
     bcolor = brickcolor * (1 + (brickvary * snoise (whichbrick+0.5)));
 
     Ct = mix (mortarcolor, bcolor, w*h);
 
     Oi = Os;
     Ci = Os * Ct * (Ka * ambient() + Kd*diffuse(Nf));
 }
 
 
 【 在 zyg 的大作中提到:】
 :我记得你好像是说过这么回事吧?说国外的高手都是通过编程制作材质的,你能介绍一下那编程吗?是用什么语言写的?
 :......
   | 
 
 
 |