Friday, November 11, 2011

Renderman RSL-3.3

 “Hello World Shader”
      Одоо анхны шэйдрээ бичиж эхлэе. Эхний кодоо “hello world” жишээгээр эхлүүлдэг уламжлалыг даган RSL дээр үүнийг хийе. Сценид байх гэрлийг тооцоололгүй орхиж биетийн бүх цэгүүд нь ижил өнгөтэй  байх тогтмол шэйдрийн жишээг hello world програмаар харуулна. Энэ шэйдр нь ямар ч ашиггүй мэт боловч шэйдрийн үйл ажиллагаатай танилцахад тус болно. Мөн композит хийхэд  маск болгож ашиглах боломжтой. Анхны шэйдрээ туршиж үзэхийн тулд өөрийн хүссэн текст засварлагчид доорхи кодыг оруулах хэрэгтэй.
   surface helloWorld()
     {
              Oi = Os;
              Ci = Oi * Cs;
     }
helloWorld.sl нэртэйгээр файлыг хадгал. Текст засварлагч нь файлыг ASCII форматаар сануулсан эсэхийг давхар шалгах хэрэгтэй. Бинари файл руу хөрвүүлсэн бол хөрвүүлэх боломжгүй болно. Эхний мөр нь гадаргын шэйдр гэдгийг зааж байна. Хаалтан дотор шэйдрийн параметрууд байрладаг боловч дээрхи жишээнд шаардлагагүй болохоор хоосон орхисон байна. Шэйдрийн их биеийн хэсэг нь тахир хаалтан дотор байрлана. Энэ хаалтын хооронд орших кодыг гүйцэтгэснээр биетийн өнгө ба тодролтыг тодорхойлдог. Дараагийн мөрөнд Oi (опасити гаралт)-ийн утгыг Os (RIB-ээс дамжуулсан опасити оролтын утга)-т оноож  байна. Ci (гаралтын өнгө)-ийн утгыг тодорхойлохдоо (Oi) тодролтыг  Cs (RIB-ээс дамжуулсан өнгөний оролтын утга ) -ийн утгаар үржүүлнэ.
 Pre-multiplied  альфа гэж нэрлэгдэх сүүлийн  үржвэр нь  тун элбэг тохиолддог. Учир нь композит хийхэд альфа маск болж ашиглагдана. Хэрэв энэ шийдлийг ашиглах бол бүх шэйдрүүд адил зарчимтай байх хэрэгтэй. Зарим шэйдрүүд нь  pre-multiply альфатай зарим нь өөр байвал эцэст нь асуудалтай тулгарна. Энэ шэйдрийн байршиж байгаа директорт ороод хөрвүүлэх командыг биелүүлье.
    Shadercmd helloWorld.sl
Хэрэв бүх зүйл алдаагүй зөв бичигдсэн бол шэйдрийг хөрвүүллээ гэсэн мессэж илгээж helloWorld.xxx гэсэн файлыг үүсгэнэ. xxx нь файлын өргөтгөл бөгөөд тухайн зурагчаас шалтгаалж төрөл бүр байна. sphere.rib файл доторхи гадаргын шэйдр дуудалтыг Surface "helloWorld"  гэж өөрчилнө. Өөрчилсөн файлаа helloWorld шэйдртэй нэг директорт хадгалаад дараахи командын тусламжтай зурна.
    rendercmd sphere.rib
Бүх зүйл амжилттай болвол доорхи зургийг харуулна. Энэ дугуй дүрс нь үнэндээ бөмбөлөг бөгөөд гэрэлтүүлэлтийг тооцоолоогүй болохоор хавтгай хэлбэртэй харагдана.

 Зураг 3-1
Adding Color and Opacity Control
         Өнгө болон тодролтын утгаа  RIB файлаас авдаг шэйдрийн жишээг авч үзье.  Өөрийн туршлагаас үзэхэд ийм аргыг практикт ховор хэрэглэдэг. Шэйдр ямар харагдахыг ихэвчлэн шэйдрийн параметраар тодорхойлох хэрэгтэй. Үгүй бол энд тэнд байрлах  параметруудыг тохируулж , дебаг хийхэд бөөн хүндрэл учирна. Өнгө болон тодролтын тохиргоог нэмэхийн тулд дараахи параметруудыг шэйдрт нэмж өгнө. Түрүүчийн кодыг доорхи шиг болгож өөрчилснөөр хэрэглэгч эдгээрийг гараар тохируулах боломжтой болно.
   surface helloWorld( color surfaceColor = color (1,1,1); color surfaceOpac = color (1,1,1);)
      {
              Oi = surfaceOpac;
              Ci = Oi * surfaceColor;
      }
Дээрхи жишээн дээр  Os, Cs-ийн утга нь surfaceColor болон surfaceOpacity гэсэн параметраар солигдсоныг харж байна. Шэйдрийг хөрвүүлсний дараа sphere.rib файл доторхи дуудалтыг дараахи маягаар өөрчилнө.
     Surface "helloWorld" "color surfaceColor" [1 0 0]
 Файлыг рендерлэсний дараа дараахи зураг харагдана. Учир нь  surfaceColor-т улаан өнгө оноосон.

Зураг 3-2

Ambient Illumination
 Шэйдрээ илүү үр дүнтэй болгохын тулд сценид байх гэрлүүдтэй харьцдаг  хэд хэдэн тохиргоог нэмж өгөх хэрэгтэй. Үүдий тулд RSL-д агуулагдах функцуудыг ашиглана. Шэйдрт нэмэх хамгийн эхний бөгөөд үндсэн гэрэлтүүлэг нь амбиент. Хэрвээ та нар мэдэж байвал амбиент гэрэл нь биетийн гадаргуугын бүх цэгийг нэгэн жигд гэрэлтүүлдэг билээ. Энэхүү арга нь гэрэлтүүлэлтийн ихэд хуучирсан, хялбархан шийдэл. Орчин үед амбиент гэрлийг occlusion-тай хамтатган хэрэглэх нь тун элбэг болсон. Энэ талаар сүүлд үзэцгээх болно. helloWorld.sl шэйдрийг дараахи маягаар өөрчилж амбиент гэрэл нэмнэ :
  surface helloWorld( uniform float Ka = 0.5; color surfaceColor = color (1,1,1); color surfaceOpac = color (1,1,1); )
      {
        Oi = surfaceOpac;
        Ci = Oi * surfaceColor * Ka * ambient();
      }
 Шэйдрт  Ka нэртэй параметр нэмэгдсэнийг харж байна. K нь амбиентийн коэффицент гэсэн үгийн товчлол. Германчууд анх энэ нэр томьёог  гаргаж ирсэн учраас К ( Coefficent биш Koefficient ) гэж нэрлэж заншсан. Зургаас харахад тод улаан өнгө бүдгэрсэн байна. Учир нь шэйдр сценид тодорхойлогдсон амбиент гэрлийн утгаар үржигдэж байна.
    Lightsource "ambient" "float intensity" [1]
 Ka нь 0.5 гэсэн утгатай учраас амбиент гэрлийн интенс, surfaceColor, опасити нарын үржвэрийн утга багасаж гэрэлтүүлэлт хагасаар буурч байна.

Зураг 3-3
Lambert Illumination
 Амбиент гэрэлтүүлэлт нь нэг хэвийн, хавтгай харагдаж байна. Биетийг орон зайтай харагдуулахын тулд диффуз гэрэлтүүлэлтийг нэмж өгөх хэрэгтэй. Диффуз гэрэлтүүлэлт  нь гэрэл туссан хэсгийг  тод, тусаагүй хэсгийг нь бүдэг, харанхуй харагдуулдаг. Ламберт гэрэлтүүлэлтийн загвар нь диффуз гэрлийг хэрэгжүүлэх хамгийн энгийн арга бөгөөд RSL нь эдгээрийн утгыг тооцоолдог диффуз функцыг өөртөө агуулдаг. Ламберт гэрэлтүүлэлтийн загварын ажиллах зарчмыг сүүлд дэлгэрүүлж үзэх болохоор одоо зөвхөн диффуз дуудалтыг ашиглаж үзье. Шэйдрт диффуз гэрэлтүүлэлтийг нэмж өгөхийн тулд helloWorld.sl файлд дараахи өөрчлөлт хийнэ.
surface helloWorld( uniform float Ka = 0.5; uniform float Kd = 0.85; color surfaceColor = color          (1,1,1); color surfaceOpac = color (1,1,1); )
      {
         /* Хувьсагчид */
        normal Nn = normalize(N);
        Oi = surfaceOpac;
        Ci = Oi * surfaceColor * (Ka * ambient() + Kd * Diffuse(Nn));
      }
 Биет дээр ойж байгаа гэрлийг хянах Kd (диффуз коэффицент) параметрийг шэйдрт нэмж оруулсаныг бид харж байна. Мөн нормалчлагдсан нормал утгыг хадгалах Nf нэртэй хувьсагчийг тодорхойлсон. Сүүлийн мөрөнд өнгө, опасити, амбиентийн үржвэр дээр диффуз нэмэгдсэн байхыг харлаа. Энэ шэйдрээ хөрвүүлэлт хийгээд sphere.rib файлыг ахин зурвал доорхи зураг харагдана. Бяцхан өөрчлөлт хийснээр RSL ашиглан төгс биш ч өмнөхөөс хавьгүй дээр ламберт шэйдрийг хийлээ.

Зураг 3-4

Specular Reflections
            Шэйдрийг бодит харагдуулахын тулд ойсон гэрэл буюу гялаан гэрлийг нэмж өгнө. Ингэснээр шэйдр нь хуванцар материал шиг харагддаг. Мөн гялаан гэрлийн өнгийг тохируулах параметр нэмж өгнө. Энэ бүх тохиргоог нэмснээр шэйдрийг энгийн метал, пластик гэх мэт материалтай төстэй болгох боломжтой. Яг метал шиг харагдуулахын тулд гэрлийн ойлтыг нэмэх хэрэгтэй. Ойлт болон туяа мөшгих raytrace аргыг ашигласан материалын талаар 14-р бүлэгт үзнэ.
                    Гялаан гэрлийг тооцоолох олон арга байдаг ба өргөн ашиглагддаг нь Phong ба Blinn юм. Зурагч болгон гялаан гэрлийг үүсгэх өөрийн гэсэн арга функцуудтай бөгөөд тэдгээрийн тооцоолох зарчим нь ялгаатай байдаг. Тэгэхээр үр дүн нь ч гэсэн ялгаатай. helloWorld.sl шэйдрт гялаан гэрэл нэмэхийн тулд дараахи параметрийг нэмнэ.
  surface helloWorld ( uniform float Ka = 0.5;uniform float Kd = 0.85;uniform float Ks = 1; uniform  float roughness = 0.2;color surfaceColor = color (1,1,1);color surfaceOpac = color (1,1,1);color specularColor = color (1,1,1); )
                             {
                                /* Variables */
                               normal Nn = normalize(N);
                               vector V = -normalize(N);
                               Oi = surfaceOpac;
                               Ci = Oi * surfaceColor * (Ka * ambient() + Kd * Diffuse(Nn)) +
                                specularColor * Ks * specular(Nn,V,roughness);
}
 Энэ шэйдрийг хөрвүүлсний дараа доорхи зургийг харуулна. Энэ хүрээд зогсоцгооё. Шэйдр TD болохыг хүсэж байгаа хүн болгон  компютер графикийн үндсэн суурь зарчмуудыг зайлшгүй мэдэж, толгойдоо хийсэн байх ёстой. Мөн шэйдр хөгжүүлэлтийг хийх тохиромжтой орчин болон продакшн чанартай шэйдр хэрхэн бүтээх аргачлалтай танилцацгаая.
Зураг 3-5 

No comments:

Post a Comment