講稿advanced renderman第三部分_第1頁
講稿advanced renderman第三部分_第2頁
講稿advanced renderman第三部分_第3頁
講稿advanced renderman第三部分_第4頁
講稿advanced renderman第三部分_第5頁
已閱讀5頁,還剩92頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第三部分材質(zhì)語言的介 材質(zhì)方法 材質(zhì)語言總 一個shader的快速向 材質(zhì)語言數(shù)據(jù)類 矩 Sl變 全局變 本地變 shader參 和區(qū) 語句和控制 表達(dá) 賦 判 Lather,Rinse, 簡單的內(nèi)置函 編寫Sl函 紋理貼圖與置 在材質(zhì)編輯語言中添加貼 貼圖返回類 選擇通 紋理坐 可選的texture()參 紋理坐標(biāo)和判斷條 創(chuàng)建紋理文 置換與凹凸貼 基礎(chǔ)置 凹凸貼 縮放置 置換邊 紋理映 s,t映射的選 紋理圖案樣式的生 程序紋理對抗文件紋 有規(guī)律的紋 閾 構(gòu)建周期函 任意的樣條內(nèi) 不規(guī)則圖案 cellnoise()一個偽隨機(jī)離散數(shù) 周期性噪 使用noise的想 分型與擾 細(xì)胞圖 程序材質(zhì)一 材質(zhì)方法 獨白:空間和參照網(wǎng) 不要在“current”空間里...........................................................紋理空間嚴(yán)格的和幾何體相關(guān) 變形和幾何 瓷 木質(zhì)紋 木地 煙:一積材 鏡頭光暈和“剪輯平面”材 卡通材 寫的指南,也不是《TheRenderManCompanion》或《RenderManInterface(4材質(zhì)方法LiCliiKa,Kd,Ks,n,Camb,Cdiff和Cspec使等式中用戶的參數(shù)。通N是表面的法線,R是由機(jī)視點的鏡面發(fā)射方這個特定的是非常普遍的,當(dāng)Cspec是白色的時候,會讓材質(zhì)看起來像CspecCdiff被設(shè)置為相同的顏色,那么看起來會像是金整表面法線N(就是法線貼圖。一些復(fù)雜的渲染器可能會允許圖像來調(diào)整任何 和這種體制相比較而言,RenderMan標(biāo)準(zhǔn)的渲染器不是使用單一的公式,而是使用編程語言來描述燈光和材質(zhì)之間的相互影響。這個想法是由RobCook(1984),并由RenderManSpecification里PatHanranhan和PRMan這個程序語言就是現(xiàn)在稱之為的材質(zhì)語言(ShadingLanguage。RenderManshadershader有它們的計Discementshaders:描述表面是如何褶皺或是凹凸的。Volumeshaders:描述當(dāng)光線穿過中間媒介的時候是如可被影響的,如煙和霧。持可編程的imagershaders,但是PRMan不支持。)就是implicit模式,和implicit模式相比,哪一個會更加有味道“在Y位置繪制特性X”。Surfaceshader的工作是計算表面上特定點的顏色和透明性。要做到這點,它可能會計算任何的函數(shù),使用紋理貼圖lookups,燈光等等。這個RenderManCsurface是和行為。材提供個shader的參數(shù),機(jī)箱是在shader里的一樣,或是作為選擇的關(guān)聯(lián)到幾何體使用這些信息,surfaceshader的目標(biāo)就是計算最終的色彩,透明,也可能有表面的法線或是特定點的位置。這一章的剩下部分將會給出RenderMan材質(zhì)語言的快速介紹,要強(qiáng)調(diào)基礎(chǔ)函數(shù),你需要編寫一些discement和surfaceshadervolumelightshaders也是非常重要的,它們要更加的深奧,并且列表7.1stic.sl:標(biāo)準(zhǔn)的塑料材質(zhì)。請注意一下,和RI規(guī)范里的shader相比我SL語法和編寫習(xí)慣。這里的數(shù)值只是參照,不是shader的一部分。 floatKa=1,Kd=1,Ks=0.5,roughness= colorspecularcolor= /*Simplestic-likereflectionmodel'~/normalNfvectorV=-Ci=Cs*(Ka*ambient()+ + Oi=Os;Ci*= 一個shader的列表7.1是一個surfaceshader的例子,它大致相當(dāng)于許多渲染器的一個單一內(nèi)置的。如果你是一名對C相當(dāng)熟悉的程序員,你將能夠快速的發(fā)現(xiàn)一些類似的概念。Shaders看起來稍微有點像是C函數(shù)。 shader的類型和名字。按照習(xí)慣,這個shader的源代碼將會按照名字stic.sl 到硬盤上,這就是簡單的帶有拓展名sl的shader名字。第二到四行列出了這個shader的參數(shù)和它們的默認(rèn)數(shù)值。這些默認(rèn)值可能會被輸入到RIB流中的數(shù)值所覆蓋。第五到十二行是這個shader的主體。七到八行里,我們計算了一個朝向前方的法線,和一個normalized后的視點向量,它會作為光照函數(shù)的成員參數(shù)。第9-10行調(diào)用幾個內(nèi)置函數(shù)來返回環(huán)境,漫反射,和Ci。因為surfaceshader必須設(shè)置相關(guān)聯(lián)的顏色和透明性,11行簡單的設(shè)置幾何 Oi為Os,并且使用Oi和Ci相乘,為了確保它能代表相關(guān)聯(lián) 。請注意,像是這種在材質(zhì)中沒有的變量N,I和Cs,它們就是所謂的渲染器為shader使用的全局變量。表格4*4字符型(像文件名材質(zhì)語言數(shù)據(jù)類內(nèi)置shader里的幾種用來計算的數(shù)據(jù)類型,如表格7.1.盡管材質(zhì)語言和C語言非常的相似,但這些數(shù)據(jù)類型和C里卻不一樣。這幾種提供的類型在C里float類型和C里的比較類似,材質(zhì)語言沒有double或int類型。另外,SL不支一個分離的類型,在SL環(huán)境里使用的float類型在C里你可能會使用int類型。浮點型常量的構(gòu)建和C里是一樣的。下面是浮點型常量的例子:1,2.48,-4.3e2.“rgbRGB或是一些渲染器能識別的顏色空間。下 /*黑色Color“rgb(.75,.5,.5) /*粉色 “hsv(.2,.5,.63)/*在“hsv”空間里空間的顏色,color的RGB數(shù)值等價于色彩0.2,飽和度0.5,亮度0.63.換7.27.2器能夠?qū)?yīng)你材質(zhì)所設(shè)置的顏色(如Ci,Oi和Cl)CIEXYZCIExyYolors用mp和 p置。一些olor的計算在一些色彩空間里計算會加簡單些,而不是在“b”空間。例如,在“hv”色彩空間里來降低一個顏色的飽和度將會更加的容易。olors可以使用rnfom材語會蹤個變在彩間這SL開發(fā)人的工作,同時要這材質(zhì)的最后確定下來,i和i是在標(biāo)準(zhǔn)的“b”空間內(nèi)。Points,VectorsNormals是擁有相同結(jié)構(gòu)的類似數(shù)據(jù)類型,但是稍微有不一個point是3D空間內(nèi)的一個位置。一個vector有一個長度和方向但是不存在一個特定的位置。一個normal是vector的一種特殊類型,它垂直與表面,我們會在這一章節(jié)進(jìn)行討論。這三種類型如圖7.1所示。7.2point“world“object”空間在第三章提到3D空間里特定的點在每一個坐標(biāo)系統(tǒng)中都會是由不同的三個浮點型數(shù)據(jù)來表示。所以你的points和vectors是在這所有的poins,vectors和normals的描述都和坐標(biāo)系統(tǒng)相關(guān)。所有提供給你可以使用一個構(gòu)造器通過三個浮點型數(shù)據(jù)來裝配一個類似pointpoint(0,2.3,vector(a,b,normal(0,0,這些表達(dá)式釋了pointvtr和nrm,和“urnt“相關(guān)聯(lián)。有些時候,當(dāng)我們真的需要進(jìn)入或是設(shè)置三個數(shù)值,SL這程xompompompomp, p, p, p,p(Q=point"object"(0,0,這個例子賦予了Q在“object”空間的原點。然而,這個并沒有設(shè)置Q(0,0,0來轉(zhuǎn)換到“current”空間,這種方式的構(gòu)造也能被vector和normal類型的數(shù)據(jù)空間一樣;BMRT中,“current”空間和“world”空間是一樣的。其他的渲染空間里會更加的方便。出于這些原因,SL提供了一些內(nèi)置的函數(shù)允許你沿著不同的坐標(biāo)系統(tǒng)轉(zhuǎn)換點。內(nèi)置的函數(shù)transform,vtransform和ntransform可以分別被用來轉(zhuǎn)換point,vector和normal。請注意,盡管如此,SL不會一直檢測哪些pointSL編程人員的責(zé)任。例如,光照的計算大誤的矩陣來變換會在你的代碼引起微小并且難以修改的錯誤。因此,為points使用transform,為vectors使用vtransforom,為normals使用ntransform是非常SL7.3總結(jié)了一些常用的。RIB狀態(tài)CoordinateSystem(或CAPIRiCoordinateSystem)被用來給用戶自定義的所有point所有point開始的坐標(biāo)系統(tǒng),也是所有光照計算所使用的坐標(biāo)空間。注意一要進(jìn)行的圖形圖元的本地坐標(biāo)系統(tǒng)(sphere,patch等等)在WorlBegin這個坐標(biāo)系統(tǒng)的原點在機(jī)鏡頭的中心,X軸指向右,Y軸指向上,Z軸機(jī)圖像平面的修正后的坐標(biāo)著“camera”空間的Z軸。當(dāng)shader被的時候被激活的坐標(biāo)系統(tǒng)(由Surface,DisLightSource所激活2D標(biāo)準(zhǔn)化設(shè)備坐標(biāo),類似raster空間,但01進(jìn)行增長。坐標(biāo)(0,0)在圖像的SL有一個matrix類型的變量用來代表在兩個坐標(biāo)系統(tǒng)內(nèi)需要變換point是的變換矩陣。Matrices默認(rèn)是使用16個浮點型數(shù)據(jù)表現(xiàn)的(一個4*4的同質(zhì)變換矩陣。如果你一個使用varying類型的matrix時請注意。這會有大量的數(shù)據(jù)!一個matrix可以由單個浮點或是16個浮點構(gòu)成。例如:matrixzero=0;/*makesamatrixwithall0components*/matrixident=1;/*makestheidentitymatrix*//*Constructamatrixfrom16floatsmatrixm=matrix(m00,m01,m02,m03,m10,m11,m12,m20,m21,m22,m23,m30,m31,m32,給一個矩陣分配一個單一浮點型數(shù)據(jù)x會導(dǎo)致這個矩陣的斜角組件都為x而其他的組件都是0(x和單位矩陣相乘。使用16個浮點構(gòu)成的矩陣會創(chuàng)建一個浮點poinmatrix/*Constructmatricesrelativetosomethingotherthan"current"*/matrixq=matrix"shader"1;matrixm=matrix"world"(m00,m01,m02,m03,m10,m11,m12,m20,m21,m22,m23,m30,m31,m32,第一種形式創(chuàng)建的matrixpoint從“current”空間轉(zhuǎn)換的“shader”空間。transform“shader.。第二種形式預(yù)制將current到world轉(zhuǎn)換舉帶有m0,0…..m3,3組件的4*4的矩陣上。注意一下,之間的*運算表示矩陣的相乘,m1/m2就可以表示為m1和m2的逆矩陣相乘。因此一個矩陣可以使用1/m來進(jìn)行倒置。另外,有些函數(shù)可以將matrix變量作參數(shù)成員。見章節(jié)7.5Sting類型可以字符串。String變量的主要運用是提供尋找紋理的文件常量有引號之間書寫字符來表示。如“Iamastringlil”。在SLstring或Sl變在SL內(nèi)有三種類型的變量:全局變量,本地變量和變量。這和C語言的一個子程序的全局,本地和參數(shù)非常的相似。不同的一點是在Sl內(nèi)的變量不僅僅只有一種數(shù)據(jù)類型(float,point等,但是也只有只用類型。類型可以是uniform或是varying(除了一些只能使用uuniform的地方。為uniform的變量在表面的任何地方都會有相同的數(shù)值。(uniform的變量,uniform和只讀的概念搞了)為varying的變量,在表面全局變所謂的全局變量(有的時候叫做圖形變量)包含渲染器關(guān)于被的基礎(chǔ)信息,比如位置,表面方向和默認(rèn)的表面材質(zhì)。你不需要這些變量:7.4表格7.4在surface和discement材質(zhì)中的全局變量。變量是只讀的,除了別 PN不同;可以使用多種方式來覆蓋N,包括凹凸貼圖和用戶提供的頂點法線,但是Ng P點的2D坐標(biāo)參數(shù)(在你將要的 P的2D紋理坐標(biāo)。這些數(shù)值可以默認(rèn) 表面P點的偏導(dǎo)數(shù)(即正切當(dāng)前采樣的時間 表面參數(shù)u,v在采樣點之間變化數(shù)值 能在illuminonce循環(huán)內(nèi)進(jìn)入。 在P點表面的最終顏色和。設(shè)這兩個變量是一個surface 本地變本地變量是你,材質(zhì)編寫者,為你自己使用而的。這和C語言的本地在SL內(nèi)變量的語法是(在括弧內(nèi)的成員是可選擇的[種類(class)]類型 變量名[=初始值這里class可以是uniform或是varying的一種。如果class沒有,type變量名是你變量的名稱Class 變量名[數(shù)組長度]_{0許一維的數(shù)組。盡管如此,在Sl內(nèi)數(shù)組的語法和C比較類似。一些變量的 /*沒有默認(rèn)的數(shù)值 /*uniform種類的b*/floatc=1; /*Declareandassign*/floatd=bra; /*Anotherdeclarationandassignment*/floata[10]; /*Thevariableaisanarray*/當(dāng)你本地變量的時候,你一般希望它們是varying的。但是在變量的(PRMan渲染器在處理uniformshader給你材質(zhì)的參數(shù)能夠讓你的材質(zhì)模擬出多種類似材質(zhì)的集合。例如,你給hdr代碼內(nèi)。shadershader話,排除你shader代碼中所有固定的常量。在編寫主角的表面材質(zhì)的時候經(jīng)常這里是一個shader的部分代碼,展示了幾個的參數(shù)surface floatKa=1,Kd=1,floatangle=radians(30);colorsplotcolor=0;colorstripecolor=color(.5,.5,.75);stringtexturename="";stringdispmapname="mydisp.tx";vectorup=vector"shader"(0,0,1);varyingpointPref=point(0,0,0);){}你會注意到這和C語言里函數(shù)的比較相似。參數(shù)的語法和普通的本地變量的比較類似,除了shader參數(shù)必須在的時候賦予一個默認(rèn)的數(shù)值,shader參數(shù)默認(rèn)是uniform種類的。在RIB文件中,你會看到類似這種代碼:Declare"Kd""float"Surface"pitted""Kd"[0.8]"stripecolor"[.2.3Sphere1-11Surface行給出的材質(zhì)需要成為屬性的一部分,因此會被隨后的幾何圖元相關(guān)聯(lián)。這一行不僅僅只了被使用shader的名字,同時也改寫些了這兩如果一個本地變量僅僅是一個普通的程序語句話沒有任何意義;一個可以放置在語句所允許的任何位置。尤其是,對你的shader進(jìn)行嚴(yán)格的分離使 floatx= /*outerdeclaration{floatx=1; /*innerdeclaration*/printf("%f\n",x);}printf("%f/n",換句話來說,在內(nèi)部區(qū)域的變量x隱藏了類似的名字,同時它和外部區(qū)域聲明的變量x是獨立的。語句和控制一個shader的主體是一堆獨立的語句序列。這一節(jié)會大致解釋語句的主要SL1.0,35eo)Point,vector,normal,matrixpoint“world”變量 - expr+ expr expr- expr/ (vectorcrossexpr. (vectordot(lr,crarx^和.vectornormal給matrix類型施加的運算符可能只有*和/,分別代表矩陣和矩陣的相乘和矩陣和矩陣的逆矩陣相乘。mtypecasts,簡單的將類型名稱放置在數(shù)值前來vector /*castapointtoavectorpoint /*castafloattoapoint /*castapointtoacolor!三組件類型(point,vector,normal,color)可以cast到其他的三組件類型。一許cast的,因為那樣說不通,比如把一個point類型cast為浮點型。C1變量=表達(dá)式;數(shù)組[表達(dá)式]=C一樣,你可以將賦值和使用+=,-=,*=和/=運算的算數(shù)運算相結(jié)合。a=b;d+=e[5]=c=e[2]C不同的是,SL沒有下面的運算:%,&,|,^,$=,|=,^=,++,--判SLC

if(condition)if(condition)if(s>Ci=s;Oi=}elseCi=};<,<=,>,>=.條件語句可能使用邏輯判斷的結(jié)合:&&(和)||或)(否。和C不同的是,SL不包含將floatcast到Boolean。就是,下面的語句是不合法的: f=if {/*Notlegal…}在SL內(nèi)是不行的,而必須這樣寫floatf=if(f!=0){/*OK…}在Cwhile機(jī)構(gòu)中while(condition)Cforfor(init;condition;loopstatement)在if語句中,循環(huán)判斷必須是相關(guān)聯(lián)的,不是浮點型。在C中,你可以使用break和continue分別來介紹循環(huán)和跳過重復(fù)。作為C功能的拓展break和continue語句可以使用一個可選的數(shù)字常量,來讓你從嵌套循環(huán)中調(diào)出,例如,for(i=0;I<10;i+=1)for(j=0;j<5;j+=1){continue2;}}在這個例子中,在continue后的數(shù)字2表示在適當(dāng)?shù)呐袛嘞?,?zhí)行將會跳i,外部循環(huán)。如果沒有數(shù)字來指明一個給出的嵌套級別,默認(rèn)的為1,就是只有當(dāng)前的循環(huán)被推出或是更高級別的。如第六章討論的那樣,PRMan通過模擬一個虛擬SIMD來一次對整個例子中的i和j),并且盡可能的為uniform。讓if,while和for語句的條件uniformshadersvarying類型surface產(chǎn)生鋸齒,甚至是得到錯誤的結(jié)果(11章有詳細(xì)介紹。簡單的內(nèi)置函C語言庫中的相同的,并且不會有詳細(xì)的介紹,這些簡單的函數(shù)會在TheRenderManConpanion和TheRenderManInterface3.1中有詳細(xì)的介紹。這一章節(jié)列舉了你每天編寫surfaceshaders會使用到的,但是不會非常的廣泛。有些內(nèi)置的函數(shù)在這本書的其他地方也能夠看到。在patterns使用到的函Derivative(Du(,Dv(,are()員。在有些情況下,我們使用縮寫ptype,來表示類似點類型poin,vector或是normal中的任何一類。(沒有ptype類型,這里我們只是使用了縮寫)floatradians(floatd)floatdegrees(floatr)floatsin(floatangle)floatcos(floatangle)floattan(floatangle)floatasin(floatf)floatacos(floatf)floatatan(floaty,x)floatatan(floatfloatpow(floatx,floaty)floatexp(floatx)floatlog(floatfloatlog(floatx,floatsqrt(floatx)floatinversesqrt(floatfloatabs(floatxfloatsign(floatx>0,1,如果x<0返回-1x=0返回floatfloor(floatx)floatcei1(floatx)floatround(float返回小于或等于x的最大整數(shù),距離x最近的整數(shù)。floatmod(floata,Cfmoda-floatmin(typea,b,..floatmax(typea,b,floatclamp(typex,minval,maxvalminmax函數(shù)分別返回最小和最大的數(shù)值,clamp(max(x,minval,maxval)normal或是color。對于多組件的數(shù)據(jù)就是基于對每個組件逐一進(jìn)行執(zhí)行。typemix(typex,y;floatfloatstep(floatedge,x<edge0x>=edgefloatsmoothstep(floatedge0,edge1,edge0<x<edge1)Hermite差值光滑,這但你需要一個有光滑過度的閾floatcomp(colorc;floati p(outputcolorc;floati,floatixcolorctransform(stringtospacename;colorcolorctransform(stringfromspacename,tospacename;colorc_rgb已經(jīng)是一個“rgb”顏色,同時把它轉(zhuǎn)換到另一個名為color的空間。第二個形式在兩個color空間內(nèi)轉(zhuǎn)換一個顏色。floatxcomp(ptypep)floatycomp(ptypep)floatzcomp(ptypep)floatcomp(ptypep;floati返回x,y,z,或是返回一個類似點數(shù)據(jù)變量的第i個組件。 p(outputptypep;floatx) p(outputptypep;float p(outputptypep;floatx) p(outputptypep;floati,x,y,zi個組件。這float1ength(vectorV)float1ength(normalfloatdistance(pointP0,floatptlined(pointP0,P1,P0P1Qvectornormalize(vectorV)vectornormalize(normalV)返回和向量V具有相同方向但是長度為1vectorfaceforward(vectorN,I,Nref)vectorfaceforward(vectorN,I)如果Nref*I<0,否者返回-N。只有兩個成員的版本,Nref是指N。為了更加清楚的解釋這種情況,這里有一個在SL表達(dá)朝向的例子:vectorfaceforward(vectorN,I,{return(I.Nref>0)?–N:}vectorfaceforward(vectorN,{externnormalreturnfaceforward(N,I,}vectorreflect(vectorI,*N。請注意,這里為了讓能夠正確工作,N必須是單位化的vectorrefract(vectorI,N;float向。eta參數(shù)是體積折射率的比值,由I除以進(jìn)入體積的折射率。pointtransform(stringtospacename;pointp_current)vectorvtransform(stringtospacename;vectorv_current)normalntransform(stringtospacename;normaln_current)pointtransform(stringfromspacename,tospacename;pointpfrom)vectorvtransform(stringfromspacename,tospacename;vectorvfrom)normalntransform(stringfromspacename,tospacename;normalnfrom)fromspace)pointtransform(matrixtospace;pointp_current)vectorvtransform(matrixtospace;vectorv_current)normalntransform(matrixtospace;normaln_current)pointtransform(stringfromspacename;matrixtospace;pointpfrom)vectorvtransform(stringfromspacename;matrixtospace;vectorvfrom)normalntransform(stringfromspacename;matrixtospace;normalnfrom)pointrotate(pointQ;floatangle;pointP0,QP0P1angle角度后的點。voidprintf(stringtemte,...)stringformat(stringtemte,...)和C很像,printf使用一個temte字符和一個成員列表。這里字符和員列表假定的順序分別是float,color,point-like,matrix和string)stringconcat(strings1,..,floatmatch(stringpattern,在物體上形成一個字符圖案。如果pattern在subject內(nèi)的任何地方存在返回1,如果不存在返回0.pattern可以是一個標(biāo)準(zhǔn)的Unix表達(dá)式。請注意,pattern不需要在subject字符中的第一個字符開始,除非pattern是floatdeterminant(matrixmmatrixtranslate(matrixm;pointmatrixrotate(matrixm;floatangle;vectoraxis)matrixscale(uniformmatrixm;uniformpoint中,這些函數(shù)的所有成員必須是uniform。這些函數(shù)和RIB的Translate,Rotate和Scale類似。除了在rotate()中旋轉(zhuǎn)角度使用的是弧度,而不是RIBRotate中使用的角度。沒有或是歪曲的函數(shù)。Sl函用其他語言編程一樣。定義自己的函數(shù)和在C語言中的做法類似:returntypefunctionname({..dosome.}SLC在每個函數(shù)中只允許一個返回語句。這個規(guī)則的例外是void函數(shù),它沒有你或許不能將函數(shù)在你的shader的代碼主體之行進(jìn)行編譯。函數(shù)必須置在一個文件里,并通過#include機(jī)制來使用。有效的返回類型和變量的一樣:float,color,point,vector,normal,matrix,string。你可以將函數(shù)為void,它表示不返回任何數(shù)據(jù)。你可能不會讓函數(shù)在C語言里,參數(shù)是通過數(shù)值來傳遞的,這意味著當(dāng)函數(shù)被調(diào)用的時候,SL函數(shù)是通過reference來傳遞的,這意味著,如果你想編輯它,它會實際去改變原始的被傳遞變量。這樣,所有你想對其進(jìn)行編輯的參數(shù)都必須使用output關(guān)鍵字來,如下面的例子:floatmyfunc(float /*youcan'tassigntofoutputfloat /*butyoucanassigntogPRManBMRTSL編譯器中,函數(shù)是一致進(jìn)行拓展的,不是分開編SLshader本身的外部進(jìn)行。就像你在C里所做的一樣。默認(rèn)情況下,SL函數(shù)可能只接受它們自己的為extern變量來進(jìn)入函數(shù)中。更新的SL編譯器同時也支持在shaders內(nèi)部來定floatx,floatmyfunc(floatfloatx; /*localhidestheoneintheouterscope*/externfloaty; /*referstotheyintheouterscope*/externpoint /*referstotheglobalP一種使得電腦制作的圖像更加真實的常用技術(shù)是為物體表面賦予一張像是貼一掃或繪而的這就夠表提很的彩節(jié)而不是一個單一的顏色。這就是紋理貼圖(見圖81。圖 給幾何物體提供一張圖像文件貼Listing8.1paintedstic.sl:thestandard“paintedstic”shader.paintedstic floatKa=1,Kd=.5,Ks=.5,roughnesscolorspecularcolor=1;{colorCt= (texturename!=Ct*=colortexture(texturename);normalNf=faceforward(normalize(N),I);vectorV=-normalize(I);Ci=Ct*(Ka*ambient()+Kd*diffuse(Nf))+specularcolor*Ks*Oi=Os;Ci*=}在材質(zhì)編輯語言中添加:Typetexture(filename{[firstchannel]}{,coords}{,params}filename,這是一個和硬盤中相關(guān)聯(lián)的貼圖的字符型文件名。使用texture()函數(shù)的例子中用到的材質(zhì)是paintedstic,見列表8.1.它很像列表7.1中的stic.sl材質(zhì)。那里是使用默認(rèn)的Cs表面色彩作為材質(zhì)的基礎(chǔ)顏色,paintedstic使用貼圖文件作為基礎(chǔ)色彩。Texturecolor型。返回類型應(yīng)該是使用三個通道的texturelookup,如:f=floattexture("foo.tex");/*explicitfloatlookupc=colortexture("bar.tex");/*explicitcolorlookup二者選一,如果你不明確的類型,SL編譯器會根據(jù)你如何使用最終數(shù)據(jù)來推斷類型。這是非常含糊,和很令人灰心的!例如,思考下面的代碼:Ci=Cs*texture道來過濾表面色彩呢?SL編譯器沒有辦法來得出你的目的是什么,所以,它的SL編譯器可能會推斷出不用的結(jié)果。出于這默認(rèn)情況下,texture()返回通道0(如果產(chǎn)生浮點型的話)或是通道0,1和2(如果是返回color型。讓texturelookup開始于貼圖文件的其他通道也是可能的??梢允褂镁o接著filename的方括號里通道號來完成。例如:f=texture四個通道是alpha。想象一下這種情況,當(dāng)你想把貼圖覆蓋已經(jīng)存在的基礎(chǔ)色彩。換句話來說,alpha為0的地方應(yīng)該表示為不會進(jìn)行上色,不是被涂上黑色。下面的一小段代碼用來實現(xiàn)使用alpha合成進(jìn)行的貼圖賦予(使用alpha的數(shù)值預(yù)乘/*AssumingCtcontainsthebasecoloroftheobject...C=texture(file);/*colorinchannels0-2*/a=texture(file[3]);/*alphainchannel3*/Ct=C+(1-a)*Ct;/*NowCtisthecoloroftheobjectwithpaintapplied你會注意到選擇貼圖通道的語法和數(shù)組元素的格式很相像。這是因為貼圖通道在語言中存在的時間要比數(shù)組更久,所以潛在的就被忽略了。當(dāng)數(shù)組被添加的時候,它會產(chǎn)生一個語法上模棱兩可的解釋。SL編譯器很擅長對差異stringfilenames[10];Ci=floattexture((filenames[i])[1],s,在在這個例子中,我們有一個字符型數(shù)組,并且會第i個文件的通道1。為了避的圖像文件貼圖根本上是2D的,因此是通過一對數(shù)字來進(jìn)行索引的:coordinates形式的texture()調(diào)用使用沒有增強(qiáng)的變量。texture(filename,q,當(dāng)兩個浮點型參數(shù)作為紋理坐標(biāo)使用的時候,這些數(shù)字作為貼圖的lookupar在材質(zhì)單位(像素,微多邊值,這樣將會給你一個過濾后的貼圖lookup。11章將會給出如何給你自己的材texture進(jìn)行更高優(yōu)先級的更改。在任何一個情況下,對于許多圖元s,t在圖元上已經(jīng)2D的貼紙一樣的貼圖繪制,這樣能夠當(dāng)做一個簡單的紋理上進(jìn)行貼圖。紋理濾鏡會根據(jù)我們按s,t描述的來提供。texture(filename,q0,r0,q1,r1,q2,r2,q3,心點合適的四個點,和它坐標(biāo)的導(dǎo)數(shù)texture()比一點版列表8.2 simpletexmap(floatKa=1,Kd=1,floatroughness=0.1;colorspecularcolor=1;stringtexturename="";floatsstart=0,sscale=1;floattstart=0,tscale=1;{/*Simplescaledandoffsets-tmap*/floatss=(s-sstart)/sscale;floattt=(t-tstart)//*Lookuptextureifafilenamewasgiven,otherwiseusethedefaultsurfacecolor.*/colorCt;if(texturename!=""floatopac=floattexture(texturename[3],ss,Ct=colortexture(texturename,ss,tt)+(1-}elseCt=/*Simplestic-likereflectionmodel*/vectorV=-Ci=Ct*(Ka*ambient()+Oi=Os;Ci*=Oi;}列表8.2展示了一個比列表8.1標(biāo)準(zhǔn)paintedstic.sl材質(zhì)要稍微更具靈活(1)相比簡單的濾鏡這里使用的是紋理顏色,它在紋理中使用一個alpha通道正確的需要沿著表面的s,t坐標(biāo)。8.2使用添加模糊的紋理貼圖(和圖8.1相比較:blur=0.02(左;s和t的材質(zhì)參數(shù),在表面旋轉(zhuǎn)紋理,或是甚至允許一個來自lookup成。例如,除了一個基礎(chǔ)顏色,紋理貼圖可以用來控制,高光,可選的texture()參lookups長寬比的而外參數(shù)。這些額外的參數(shù)使用額外的標(biāo)志值BlurredTexture實現(xiàn),根據(jù)紋理圖像的大小進(jìn)行斟酌(82。例如:texture(filename,s,t,"blur",1%kernal0,就是指不對紋理進(jìn)行模糊。FilterWidthMultiplier個四邊所有四個角)或是模糊的(給一對單獨的s,t坐標(biāo),并讓渲染器推斷出效果你可能想讓模糊的紋理lookups變得銳利,或是更見的模糊。通過使用texture(filename,s,t,"width",texture(filename,s,t,"width",texture(filename,s,t,"swidth",1,"twidth",第一個例子使得濾鏡寬度翻倍。紋理lookup的抗鋸齒結(jié)果近似等于將的分辨率減半(ShadingRate乘四0,實際上和“twidth”參數(shù)是怎樣被用作來為s和t坐標(biāo)設(shè)置不同的濾鏡寬度乘數(shù)。值得注意的是,默認(rèn)的寬度乘數(shù)是1,意味著原始的估算不會有任何的編輯。少在固定紋理的章節(jié),然而在后面是相對的,為了適應(yīng)shadingrate,間接的,我們已經(jīng)提到過紋理的過濾,但是我們么偶有過該使用哪種濾鏡。默認(rèn)情況下,渲染器會使用box濾鏡。然而,為了得到的精細(xì)控制,你能夠你為紋理lookup所使用到的率將:texture(filename,s,t,"filter","box");texture(filename,s,t,"filter",默認(rèn)的填充數(shù)值是0。如果你檢測simpletexmap.sl材質(zhì),你可能對于紋理文件沒有包含alpha通道會發(fā)生什么而感到困惑。在那種情況下,texture調(diào)用會返0.意味著紋理的任何地方都是透明的。和你想要的結(jié)果完全相反。對于丟失通floatopac=floattexture(texturename[3],ss,tt,"fill",單獨處理,會在章節(jié)8.1.6中進(jìn)行描述。if(varying-condition)}

ss=someformulatt=anotherformulaCi=texture("foo",ss,如果條件是變化的(可以在表面上不同的點上使用不用的ture/false數(shù)值,界的單位。變量ss和tt只在邊界的一側(cè)進(jìn)行了很好的定義,因為對ss和tt的賦值是在if語句中的“true”模塊中的,它們在邊界“false”一邊是沒有進(jìn)行可能的,同時紋理過濾也會發(fā)生不可預(yù)測。種解決方法是,在條件語句外簡單的移動紋理lookup坐標(biāo)的定義。例如:ss=someformulatt=anotherif(varying-condition)}

Ci=texture("foo",ss,如果條件僅僅由uniform的量(像是一個常數(shù)或是uniform變量)構(gòu)成的,是過濾,這樣將會有相同的限制。environment,Du(),Dv(),filterstep(),area(),和calculatenormal()varying條件或是循環(huán)中都應(yīng)該被避免(,9.2.111.2中會提到預(yù)處理步驟??梢允褂贸绦駻PI來完成,或是使用在章節(jié)3.7.1提到的RIBMakeTexture命令。二者任選其一,大多數(shù)的渲染器會使用一個獨立的程序來把普通的圖像文件(比如,TIFF格式)裝換成紋理文件。能夠?qū)⒏鞣N圖像文件轉(zhuǎn)換為PRMan紋理文件:txmake[arguments]inputfile-mode色。Clamp模式的modname,把范圍外的紋理lookup當(dāng)做剛剛好到達(dá)紋理的邊界,換句話來說,紋理將它的邊界擴(kuò)展到無窮。最終,periodic模式將把紋理處-mode標(biāo)識為s和t方向上包裹的行為,但是你也可以使用-smode-tmode來為它們單獨-resize這個標(biāo)識的使用會有一些難懂,但是我們強(qiáng)烈建議,你為up-(沒錯,就是“updash)使用resizemode。在PRMan文檔中有一個選項的解釋。 16須使用標(biāo)識-short,它將會創(chuàng)建一個32位浮點型紋理有幾個在txmake里已存在的選項,你應(yīng)該閱讀PRMan用戶手冊獲得的 0TIFFTIFF不是非常的高效和靈活。然而,BMRT使用一種叫做mkmip的工具,它的操作變?yōu)槎嘀胤直媛屎头较蛐云戒乀IFFBMRT來說非常高效。Mkmip程序同P+=offsetvectorN=圖8.3置換移動表面的位置P+=bumpheight*N=動網(wǎng)格的頂點,改變它們的位置,見圖8.3.實現(xiàn)。下面一行設(shè)置N給新的P上的法線:N=PRMan中,你實際上是在一個SIMD方法里網(wǎng)格的,這樣P+=foo模塊在所有地方執(zhí)行一次,然后,N=calculatenormal(P)模塊在每個地方上執(zhí)行。所以當(dāng)你調(diào)用calculatenormal()的時候,它的參數(shù)已經(jīng)知道每個地方了。不同的渲染器可能會使用不同的方法來讓它工作,但是你可以放心的是在任何RenderMan的N=calculatenormal(P+圖8.4滿是疙瘩的茶壺。上面一行:平坦的(左邊,凹凸貼圖(中間當(dāng)你已經(jīng)對P進(jìn)行偏移,但是實際上并不移動P的時候,你需要用這行代碼來圖8.4展示了凹凸貼圖和真實置換之間的區(qū)別。使用置換的物體的輪廓會是會更加的快速。另外,使用凹凸貼圖,你不需要擔(dān)心置換邊界的問題,在8.2.4對于使用一個圖像內(nèi)存的渲染器,RenderMan接口直接使用RIB的MakeBump和SL的bump()調(diào)用支持凹凸貼圖會覺得有些奇怪。這些在任何20/20的標(biāo)尺,我們會忽視MakeBump/bump。語法:Pamp*normalize(N)在N的方向上移動amp個單位,但是這些單間中表示。所以上面的代碼把表面向N的方向移動在當(dāng)前空間內(nèi)度量的amp個vectorNshad=vtransform("shader",N);pointPshad=transform("shader"Pshad+=amp*P=transform("shader","current",Pshad);N=calculatenormal(P);更加的簡潔與高效,分別思考一下下面在“shader”空間里個置換amp個單位vectorNn=P+=Nn*(amp/度的向量在“shaderm*e4shadernn/-e5、把這些放在一起,我們會看到上面的語句將會在N的方向上將P推進(jìn)“shader”空間里的amp個單位??偠灾?,表達(dá)式length()是一個在當(dāng)前空間單位和“shader體模型的縮放。同樣,你不必一定沿著N的方向就行置換,但是一般情況下你圖8.5使用浮雕標(biāo)空間相關(guān)聯(lián)。這個函數(shù)在列表8.3中展示了。列表8.3也展示了一個簡單的置代碼的每一個行進(jìn)行執(zhí)行。8.5展示這樣一個材質(zhì)的使用。置換邊剪。這些幾何體上丟失的裂片會趨向與掃描線對其(見圖86。圖圖8.6由于沒有正確的置換邊界框出現(xiàn)的幾何體表面丟失的碎過下面的RIB代碼實現(xiàn):Attribute"discementbound""sphere"這一行代碼表示出隨后的物體可能會在坐標(biāo)系統(tǒng)space下,置換出radius(當(dāng)時當(dāng)?shù)闹脫Q邊界框太小的時候(或是當(dāng)需要的時候沒有進(jìn)行,會導(dǎo)圖8.6。就好像是物體被一個方形的餅干模板印在上面一樣,置換并不是足夠大列表8.3結(jié)合置換和凹凸的Disce函數(shù),關(guān)于一個給定的坐標(biāo)系統(tǒng)和/*Combinediscementandbumpmap,withunitsrelativetoaparticulartruedisp!=0,thisfunctionmodifiesPasaside*dirdirectioninwhichtopushthesurface,assumedtoalreadybeinspaceandampamplitudeoftheactualdiscementorbumspacethenameofthecoordinatesystemagainstwhichtheamplitudeistruedispwhen1,trulydisce;when0,justReturnvalue:thenormalofthediscedandbumpedsurface,in"current"/normalDisce(vectordir;stringspace;floatamp;float{externpointfloatspacescale=length(vtransform(space,dir));vectorNdisp=dir*(amp/spacescale);P+=truedisp*returnnormalize(calculatenormal(P+(1-}disemboss(stringtexturename=” /*NameofimagefloatKm=1 /*Maxdiscementamt*/stringdispspace="shader"; /*Spacetomeasurein*/floattruedisp=1; /*Disceorbump?*/floatsstart=0,sscale=1;floattstart=0,tscale=1;floatblur=0;){/*Onlydisceifafilenameisprovided*/if(texturename!-""){/*Simplescaledandoffsets-tmap*/floatss=(s-sstart)/sscale;floattt=(t-tstart)//*Amplitudeischannel0ofthetexture,indexedbys,t.*/floatamp=floattexture(texturename[0],ss,tt,"blur",blur);/*Disceinwardparalleltothesurface*Km*ampunitsmeasuredindispspaceN=Disce(normalize(N),dispspace,-Km*amp,}}s,t映射的我們目前所見到的關(guān)于紋理和置換貼圖的例子中都是假設(shè)紋理是基于表面的(s,t)坐標(biāo)來索引的。例如,在列表8.2中的impltxmp材質(zhì)和列表8.3中的emboss材質(zhì)都是沿著幾何體表面s,t坐標(biāo)的紋理lookup,只允許單獨s和ts,t索引的紋理將會出現(xiàn)s,t映一些圖元(像是細(xì)分表面)s,t可能包括球形映射(像是地球儀上的,圓柱型,平面型(簡單的使用坐數(shù)。都是使用頂點,假設(shè)是在一個合適的空間,并且制作出ss和tt紋理索射而不可避免出現(xiàn)的接縫進(jìn)行記錄(倒數(shù)的背景與使用11章進(jìn)行的討括(st8.4ProjectTo2D3D頂點和2D紋理坐標(biāo)和它們的估計導(dǎo)數(shù)。為了靈活的增加,它也會使用計算映射的坐標(biāo)系的名字,以及給映射增加層級控制的4*4矩陣。ProjectTo2D函數(shù)支持下面的映射方式:“st”普通的(s,t)映“nar”將一個命名的(x,y)坐標(biāo)映射到(ss,tt)的數(shù)“”將(x,y,z)坐標(biāo)作為ss=x/z,tt=y/z映“spherical”將球形坐標(biāo)映射到(ss,tt)數(shù)“cylindrical”將圓柱形坐標(biāo)映射到(ss,tt)3.2紋理運用和現(xiàn)在,我們有一個普通的映射,我們可以使用ProjectTo2D程序來完成有用的紋理庫和列表8.5一樣。GetColorTextureAndAlpha()將映射輸入頂點,產(chǎn)生2D紋理坐標(biāo)和導(dǎo)數(shù),然后使用一個抗鋸齒紋理lookup來產(chǎn)生顏色和alpha通道。8.4為映射3D2D/*Project3Dpointsontoaunitspherecenteredattheorigin*/spherical-projection(pointp;outputfloatss,tt,ds,{externfloatdu,dv;/*Usedbythefilterwidthmacro*/vectorV=normalize(vectorp);ss=(-atan(ycomp(V),xcomp(V))+PI)/tt=0.5-acos(zcomp(V))/PI;ds=filterwidth(ss);if(ds>ds=max(1-ds,dt=filterwidth(tt);if(dt>0.5)dt=max(1-dt,}/*Project3Dpointsontoacylinderaboutthez-axisbetweenz=0andvoidcylindrical-projection(pointp;outputfloatss,tt,ds,{externfloatdu,dv;/*Usedbythefilterwidthmacro*/vectorV=normalize(vectorp);ss=(-atan(ycomp(V),xcomp(V))+PI)/tt=ds=filterwidth(ss);if(ds>0.5)ds=max(1-ds,dt=filterwidth}voidProjectTo2D(stringpointP;stringwhichspace;matrixxform;outputfloatss,tt,ds,dt;){pointexternfloatdu,dv;/*Usedbythefilterwidthmacro*/if(projection=="st"){externfloats,t;Pproj=point(s,t,0);}elsePproj=transform(whichspace,}Pproj=transform(xform,if(projection=="nar"||projection=="st")ss=tt=ycomp(Pproj);ds=filterwidth(ss);dt=filterwidth(tt);}}elseif(projection=="")floatz=max(zcomp(Pproj),1.Oe-6);/*avoidzerodivisionss=xcomp(Pproj)/tt=ycomp(Pproj)/z;ds=filterwidth(ss);dt=filterwidth(tt);}/*Specialcasesfortheprojectionsthatmaywrap*/elseif(projection=="spherical")elseif(projection=="cylindrical")cylindrical-projection(Pproj,ss,tt,ds,(alpha通道則默認(rèn)為完全不透明ApplyColorTextureOver調(diào)用GetColorTextureAndAlpha然后使用通常的alpha合成規(guī)則將紋理覆蓋到原有的基并且也允許簡單的紋理圖案的位移與縮放?,F(xiàn)在我們提供supertexmap.sl(列表當(dāng)使用supertexmap.sl,你通過操作紋理坐標(biāo)的名稱和/或提供的4*4變換矩陣來將紋理定位到表面上。注意這個4*4矩陣是一個有16個浮點型數(shù)據(jù)組成的(matrixcurrent(EdCatmull的博士中(Catmull,1974。當(dāng)時有無數(shù)個關(guān)于紋理映射的文獻(xiàn),一份紋理映射技術(shù)的優(yōu)秀總結(jié)可以在Heckbert(1986(1978Coo(1984Carpenter(1984程序紋理對抗文件紋同時你甚至可以不使用任何的紋理文件來計算生成整個圖案。這就是procedural的圖像紋理需要從一定的地方中得到,不是通過細(xì)致的繪制,就是從或是真水物體中掃描得到。繪制很明顯需要一位熟練的藝術(shù)家花類似的,對紋理進(jìn)行,由于它只覆蓋有限的空間最終會產(chǎn)生問題。繪制的紋理在其他情況下賦予別的物體(除非你要的是完全相同的。寫一個程序材質(zhì)所花費的時間要比一位藝術(shù)家繪制一張紋理所花的時間要長,或是簡單的使用paintedstic。一些圖案的重現(xiàn)甚至對一些經(jīng)驗豐富的材質(zhì)編寫人員來說都是非常的。尤其是對于一些隨機(jī)產(chǎn)生的圖案來說,制作出十分精確的外表是非常最終程序紋理和的對抗辯論是一場錯誤的。在Pixar里,我們以前我們?yōu)轫椖克鶎懙牟馁|(zhì)幾乎沒有一個就是簡單的RGB紋理貼圖或是單純的程序紋理經(jīng)常被用來控制程序紋理。考慮下創(chuàng)建一個生銹的金屬物體的任務(wù)家來說在整個表面上繪制銹跡跡跡(有些時候這對美感和故事情節(jié)來說是非常重要的??梢允褂没旌系姆椒?,通過藝術(shù)家來繪制一張簡單的灰度圖來控制物體表面銹跡的多少必須要無縫的覆蓋大面積區(qū)域的圖案,或者在縮放范圍內(nèi)呈現(xiàn)出足夠的細(xì)《ABug`sLife》中AntLand的地面材質(zhì),是由ChrisPerry使用幾個月的課程創(chuàng)有規(guī)律的紋floatstep(floatedge,step()x<dege,x>=edgefloatsmoothstep(floatedge0,edgel,smoothstep()函數(shù)如果x<=dege0返回0,如果x>=dege1返回1,并且在圖10.1step()和smoothstep()函數(shù)之間的對照,同時使用不同的函數(shù)可以通過兩個steps之間的區(qū)別構(gòu)建。mod(x,priod)函數(shù),返回x/peiodod()函數(shù)一個有意思的使用是創(chuàng)建周期函數(shù)。假如你有一個在[0,P]上定義的任意函數(shù)f(x。那么f(mod(x,p)f(x)P任何的不連續(xù)(見圖10.2)10.2mod() spline(floatx;type 由于x在0到1范圍內(nèi)變化,spline返回val1到valn的三次差值的數(shù)值。結(jié)點被假設(shè)為均勻的排列。Type可以是float,color,point或是vector中的任何一=valnTypespline(stringbasis;floatx;typeval1,val2,……linear(一種分段線性差值性差值的情況下,val1和valn實際上是被忽略的。換句話來說,當(dāng)x=0時,線性樣條返回val2x=1val(n-1。typespline(floatx;typevals[]不規(guī)則圖案函數(shù)來支持它。大部分都是基于noise()函數(shù)的變動得來的。noise()函noise(個由(正弦)10.31Dnoise的樣子。Noise有如下有用的特性:noise()是可重復(fù)的,在場景中使用相同的參數(shù)多次調(diào)用noisenoise()是多種類型的,他能在1D,2D,3D和4Dnoisenoise(float,noise(point)/*alsovectorornormal*/noise(point,float)noise()的返回數(shù)值在0到1的范圍內(nèi),也就是整體平均數(shù)是0.5。不論輸入的坐標(biāo)是不是整數(shù)數(shù)值,noise肯定會返回0.5的數(shù)值。Noise保證10.31Dnoise的地方它也是C2(比如,倒數(shù)平滑的變化)的,但是不是所有的地方。尤noise()0.51noise是近似有向性的(沒有優(yōu)先的方向(這并不是十分正確。我們知道noise()的差值有很小的短周期。雖然如此,這noise在三的變化通常佳作立體噪波,因為當(dāng)我們在表面上使用它的的使用一張2D的貼紙投射在上面的一樣。圖10.4展示了2Dnoise和3Dnoiseosipitflanoise也存在返回不同的返回值。我們目前討論的立體噪波總是返回float =floatnoisecolorC=colornoise(s,vectoroffset=vectornoise(P,是模糊不清的。因此最好經(jīng)常明確的分配noise(。圖10.4使用2D噪波的茶壺(左3D噪波的(右。使用3D噪波的cellnoise()等等。標(biāo)準(zhǔn)的noise()調(diào)用是不合適的,因為這是非常昂貴的(部分是由于對它的改寫,在這種情況下是必要的)并且它的數(shù)值太過靠近0.5.為了這個目的,有一個叫做cellnoise()的返回數(shù)值是在輸入整數(shù)型數(shù)值之間的constant類型,(比cellnoise(x)≡(恒等于)cellnoise(floor(x))cellnoise(x)范圍一致分布在(0,1)內(nèi),不同于noise(),0.5的趨勢point,和vector的返回類型:typecellnoise(floatx)typecellnoise(floatx,y)typecellnoise(pointp)typecellnoise(pointp,floattypefloat,color,pointvectorCellnoise()noise()pnoise()函數(shù)。Pnoise()noise一樣,有1到4個維度,并且它的范圍同樣可以是float,color,point或是vector中的typepnoise(floatf;uniformfloattypepnoise(floats,t;uniformfloatsperiod,tperiod)typepnoise(pointP;uniformpointPperiod)typepnoise(pointP;floatt;pointPperiod;uniformfloat怎樣操作和使用使用一個偏移將noise()推向一邊:noise(x+將noise()貼到(-1,1)的范圍,也叫做正負(fù)#definesnoise(x)(2*noise(x)-#definevsnoise(x)(2*(vectornoise(x))-0foo+=使用noise()Foo=func(x);變foo=func(x+或是foo=甚至是foo=func(x);foo+lookup,給出一個包裹外floatss=s+amp*floattt=t+amp*noise(freq*s-12.2,freq*t+100.63);colorC=colortexture(texturename,ss,tt);請注意這個例子通過使用分離的noise數(shù)值在s和t方向上對紋理lookup進(jìn)行偏noise()lookupst無約束的出現(xiàn)。Ct=mix(basecolor,P+=snoise(freq*P)*amp*N=noise(:step(thresh,noise(x會知道你應(yīng)該的使用filterstep(,而不是step)n=noise(x);f=step(iso-0.05,n)-step(iso+0.05,我們希望這些能夠給你對于如何使用noise有一些體會。我們在這里不會提noise出現(xiàn)鋸齒,并且我們不鼓勵你編寫據(jù)此材分型與擾增強(qiáng)?在圖10.5里你會看到,低頻率的波動加上高頻率小的,近處的波動,直形變得更加。會把noise層級的總和規(guī)范化為列表10.1中展示的圖10.5分形的求和層你可以看到fBm加入了幾個noise的,并且每個每個有一個不motion.(的)fBm僅僅產(chǎn)生一個美妙,復(fù)雜,自然的圖案,可以模范自然界的很多東西。lacunarity=2,=0.5。任何當(dāng)=1/lacunarity的時候,這個函數(shù)就是我展示了fBm函數(shù)的一些參數(shù)空間,一次改變一個參數(shù)。和fBm相關(guān)聯(lián)的一個函數(shù),Perlin稱作為turbulence。它倆之間唯一的區(qū)別結(jié)果會有些巨浪似的感覺,像是云(警告:由abs()產(chǎn)生的拐角也會引進(jìn)少量的任意高度的頻率,它可能是抗鋸齒的特別方法。)圖10.7展示了在2D里fBm和擾亂之間的對照。10.1fBm:fractionalBrownianmotionfloatfBm(pointp;uniformfloatoctaves,lacunarity,{varyingfloatsum=0,amp=1;varyingpointpp=p;uniformfloati;for(i=0;i<octaves;i+=1)sum+=amp*snoise(pp);amp*=;pp*=}return}vectorvfBm(pointp;uniformfloatoctaves,lacunarity,{uniformfloatamp=1;varyingpointpp=p;varyingvectorsum=0;uniformfloati;for(i=0;i<octaves;i+={sum+=amp*vsnoise(pp);amp*=;pp*=lacunarity;}return}floatturbulence(pointP;uniformfloatoctaves,lacunarity,{varyingfloatsum=0,amp=1;varyingpointpp=p;uniformfloati;for(i=0;i<octaves;i+=1){sum+=amp*abs(snoise(pp));amp*=;pp*=lacunarity;}return}lacunaritygain,左到右:0.2,0.5,0.75,1,1.5.gaingain會得到圖;turbulence(細(xì)胞圖是作為程序紋理的構(gòu)建模塊非常有用。SteveWorleyWorley(1996)介紹了另一個基礎(chǔ)函數(shù)。Worley的紋理函數(shù)可以產(chǎn)生類似分離的細(xì)胞或是鵝卵石,蜥蜴鱗片之類的圖案,Worley技術(shù)的主要思想是在空間里繪制隨機(jī)分布的“特征點”,因此,對于任何點P,細(xì)胞P的中心位于pointcellcenter=point(floor(xcomp(P))+0.5,pointfeaturepos=cellcenter(vectorcellnoise(cellcenter)-減去0.5,這樣偏移的范圍就會在(-0.5,0.5。并且將每個的距離和P相比較:pointthiscell=point(floor(xcomp(P))+0.5,distto_nearest=1000;/*initializetotoolarge*/for(i=-1;i<=1;i+=1){for(j=-1;j<=1;j+=1)for(k=-1;k<=1;k+=1)pointtestcell=thiscell+vector(i,j,k);pointpos=testcell+vectorcellnoise(testcell)-0.5;floatdist=distance(pos,P);if(dist<distto_nearest)distto_nearest=dist;nearestfeature=}}}}這段代碼在nearstfeature里離P最近的特征快的位置,并且將距離dist_to_nearest列表10.2使這段代碼正規(guī)化了,給出了完整的材質(zhì)函數(shù),并返回第一和第征塊的位置(pos1和pos2。注意你也能創(chuàng)建為2D情況下優(yōu)化的版本。因為每個特征塊在一個唯一的細(xì)胞內(nèi)存在,特征塊的cellnoise()voronoi_f1f2_3d(P,1,fl,posl,f2,pos2);Cicolorcellnoisepos1vector(10,0,0));“oroni查這些代碼將會揭示我們?yōu)槭裁床唤兴癢orly)cellnoiselookup添加了一個整數(shù)偏移,因為這些在細(xì)胞內(nèi)特征塊的位置是由基于那個點的cellnoise列表10.2voronoi_f1f2_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論