Ania Napisano 7 Czerwiec 2015 Napisano 7 Czerwiec 2015 Czy da się stworzyć w Cycles shader typu toon, który nie zmienia jasności (koloru) jeśli suwam Size i Smooth? Chciałabym korzystać z dwóch różnych tekstur dla cienia i dla światła, i chciałabym żeby wygląd i jasność tych tekstur była niezależna od parametrów shadera (ma się zmieniać tylko ich rozłożenie na obiekcie). Standardowo w shaderze toon powiększenie Size przyciemnia kolor, tak samo jak powiększenie Smooth. Na razie wykombinowałam shader OSL który to w pewnym zakresie koryguje, niestety korekcja Size działa tylko przy stałym Smooth=0.0, a korekcja Smooth jedynie przy stałym Size=0.5 (przy tych parametrach za pomocą serii pomiarów jasności wprowadziłam faktory korekcyjne, korzystając z oryginalnego shadera toon, to te przydługie arraye w kodzie). Więc mam prawidłowy wynik jedynie suwając jedną wartość na raz, i jedynie jeśli ta druga wartość równa się 0.0 w przypadku Smooth albo 0.5 w przypadku Size. Niestety jeśli zmienię obie wartości, np. Size=0.4 a Smooth=0.1 (faktory korekcyjne wtedy się mnożą), już się nie zgadza i na renderze obszary, które powinny być białe, są szare albo prześwietlone (RGB > 1,1,1). Ktoś ma na to jakiś pomysł? Wiem że w Internal się da, ale chciałabym równocześnie korzystać z innych dogodności Cyclesa dlatego wolałabym renderować całość w Cycles. Sam shader działa na tej zasadzie: shader = kolor_światła*faktory_korekcyjne*toonshader + kolor_cienia*emission - kolor_cienia*faktory_korekcyjne*toonshader (ale może ktoś ma lepszy pomysł jak do tego podejść, nie musi być OSL jeżeli dałoby się nodami). Dołączam plik testowy i kod. http://www.ania.xibo.at/tmp/toon.blend shader Toon( color ColLight = 1.0, color ColShad = .0, float Size = .5, float Sth = .0, float RayDepth = 1, output *color Test = 0.0, output closure color BSDF = 0 ) { // float corrSize = pow(Size,1.96784)/0.13891; // fitted with optimum at 0.5, Res.max. +- 0.05 float corrSpline[23]={9e10,9e9, //-0.05, 0.0 * * * * *correction (measured for smooth = 0), for -0.05 and 0 approx. (inf.), 51.62854,12.92719,5.7602,3.25181, //0.05,0.1,0.15,0.2 2.09083,1.46022,1.08004,0.83335, * //0.25,0.3,0.35,0.4 0.66427,0.54339, 0.45401, //0.45,0.5,0.55 0.3861, 0.33331,0.29149,0.25782, //0.6,0.65,0.7,0.75 0.23033, 0.20762,0.18867,0.17271, //0.8,0.85,0.9,0.95 0.15915,0.12619}; //1.0,1.05 last value calculated after fit float corrSize = 1.0/spline("catmull-rom", Size, corrSpline); //first and last point used, but not calculated for catmull-rom (stand over) float corrSth = 0.0;// 1.0;// 1/(0.2546+0.7454*exp(-4.90653*Sth)); //fitted with optimum at 0.0, Res. max. +- 0.02 float corrSth_01[13]={1.03749, //-0.01 correction (measured for size=0.5), smooth -0.01 to 0.11 in steps of 0.01, use for 0-0.1 1.000,0.96318,0.92848, //0,0.01,0.02 0.89573,0.86478,0.83552, //0.03,0.04,0.05 0.80781,0.78155,0.75665, //0.06,0.07,0.08 0.733,0.71053,0.68917}; //0.09,0.1,0.11 float corrSth_02[13]={0.75665, //0.08 correction, smooth 0.08 to 0.32 in steps of 0.02, use for 0.1-0.3 0.71053,0.66883,0.631, //0.1,0.12,0.14 0.59657,0.56516,0.53642, //0.16,0.18,0.2 0.51007,0.48584,0.46353, //0.22,0.24,0.26 0.44293,0.42388,0.40623}; //0.28,0.3,0.32 float corrSth_03[10]={0.53642, //0.2 correction, smooth 0.2 to 1.1 in steps of 0.1, use for 0.3-1.0 0.42388,0.34721,0.29289, //0.3,0.4,0.5 0.29289,0.29289,0.29289, //0.6,0.7,0.8 0.29289,0.29289}; //0.9,1.0.1.1 if (Sth {corrSth = 1.0/spline("catmull-rom", 10.0*Sth, corrSth_01);} else { if (Sth {corrSth = 1.0/spline("catmull-rom", (-0.5+5.0*Sth), corrSth_02);} else {corrSth = 1.0/spline("catmull-rom", (-3.0/7.0+(10.0/7.0)*Sth), corrSth_03);} } color ColShadRay = (1-RayDepth)*ColShad + RayDepth * color (0.0,0.0,0.0); BSDF = * ColLight*corrSize*corrSth*diffuse_toon(N,Size,Sth) //color in lit areas; becomes 0 in the shadow because toon(shadow)=0 + ColShadRay * emission() //shadow color; is everywhere (for now) +(-1*ColShadRay*corrSize*corrSth*diffuse_toon(N, Size, Sth)); // subtract the shadow color from lit areas } Dołączam jeszcze efekt końcowy który chciałabym uzyskać. Chcę podpinać pod cień i światło dwie tekstury, które nie zmieniają koloru jeśli suwam smooth i size.
uzumakishadow Napisano 7 Czerwiec 2015 Napisano 7 Czerwiec 2015 A gdyby to zrobić świecącym materiałem niegenerującym gi? (plus pass na cień)... dobra, głośno myślę. Myśl numer dwa. Nie ma już takich gdzieś shaderów? http://www.blendswap.com/blends/view/68518 ?
Ania Napisano 7 Czerwiec 2015 Autor Napisano 7 Czerwiec 2015 (edytowane) Myśl 1 - wtedy (chyba?) tekstury mogę wstawiać dopiero w compositingu na shadow passie, co przy bardziej złożonych scenach byłoby dość mozolne (ale traktuję tą opcję jako plan B). Tzn. musiałabym renderować na czarnobiało i dopiero potem kolory. Chyba że coś przeoczyłam? Myśl 2 - przetestuję. edit: X-Toon jest zależny wyłącznie od normali, nie ma cieni, więc mam to samo co przy pierwszej myśli - render na czarnobiało i dodawanie tekstur dopiero w compositingu na shadow passie. Wolałabym te tekstury dodać już w shaderach, scen będzie kilkadziesiąt i w każdej może z 10 materiałów, fajnie byłoby mieć na to jakiś podgląd viewportowy bez potrzeby compositingu. Edytowane 7 Czerwiec 2015 przez Ania
uzumakishadow Napisano 7 Czerwiec 2015 Napisano 7 Czerwiec 2015 Ok, a jest tam moze jakis node ktory zbiera informacje o tym czy powierzchnia jest zacieniona albo oswietlona (z mozliwoscia wwyboru ktorego swiatla sie ma to tyczyc). Mozna by takie cos uzyc jako maske. Maska by robila blend na dwoch teksturach a pozniej taki blend wpiety w swiecenie materialu(Zeby bylo plasko), ktory ma wylaczone oddzialywanie dla gi.
Ania Napisano 8 Czerwiec 2015 Autor Napisano 8 Czerwiec 2015 To by było idealne, ale takiego noda z tego co wiem nie ma.
uzumakishadow Napisano 8 Czerwiec 2015 Napisano 8 Czerwiec 2015 A light path? To taki raycastowy node zdaje się. Tam jest z tego co widzialem shadow ray (m.in.). Spróbowałbym.
Ania Napisano 8 Czerwiec 2015 Autor Napisano 8 Czerwiec 2015 Shadow Ray w Light Path node zmienia promienie cienia wychodzące od obiektu, nie da się modyfikować koloru na samym obiekcie (np. mogę tym nodem ustalić, że rzuca półprzezroczyste czerwonawe cienie na inne obiekty, ale nie mogę ustawić żeby cienie na samym obiekcie były czerwone). Nie o to mi chodzi.
uzumakishadow Napisano 8 Czerwiec 2015 Napisano 8 Czerwiec 2015 Hmm no to ja juz poza tym wpisem niewiele pomoge... :) Pewnie na to trafilas (A moze nie to wrzuce) https://nixart.wordpress.com/2012/05/19/blender-cycles-toon-material-node-setup/
uzumakishadow Napisano 8 Czerwiec 2015 Napisano 8 Czerwiec 2015 W ogóle to zabawne, że tylu zazwyczaj znawców blendka na całym forum a w Twoim wątku cisza.
Monio Napisano 8 Czerwiec 2015 Napisano 8 Czerwiec 2015 (edytowane) Znać blendera a potrafić pisać shadery w OSLu to raczej 2 inne rzeczy. https://nixart.wordpress.com/2012/05/19/blender-cycles-toon-material-node-setup/[/url] To nie zadziała w przypadku Ani. LayerWeight to odchylenie względem kamery a nie cieniowanie ze świateł. Wbudowane nody w ogóle tutaj nie zadziałają . Nie ma w cyclesie noda który może wypuścić shading materiału jako output dla innego noda. Cycles jest mocno oparty o OSLa. Shader przekazuje do renderera Closure czyli definicje interakcji światła z powierzchnią. Nie kolory pixeli jak to ma miejsce np w RSLu. Większość pathtracerów teraz tak działa. Edytowane 8 Czerwiec 2015 przez Monio
uzumakishadow Napisano 9 Czerwiec 2015 Napisano 9 Czerwiec 2015 Znać blendera a potrafić pisać shadery w OSLu to raczej 2 inne rzeczy. To nie zadziała w przypadku Ani. LayerWeight to odchylenie względem kamery a nie cieniowanie ze świateł. Wbudowane nody w ogóle tutaj nie zadziałają . Nie ma w cyclesie noda który może wypuścić shading materiału jako output dla innego noda. Cycles jest mocno oparty o OSLa. Shader przekazuje do renderera Closure czyli definicje interakcji światła z powierzchnią. Nie kolory pixeli jak to ma miejsce np w RSLu. Większość pathtracerów teraz tak działa. Pod koniec wpisu podaje on link do nowej wersji tego setupu. https://nixart.wordpress.com/2012/05/22/blender-cycles-toon-material-node-setup-update/
Monio Napisano 9 Czerwiec 2015 Napisano 9 Czerwiec 2015 Który nadal nie ma nic wspólnego ze światłem. ;) Gość po prostu przekręca ręcznie normale obiektu a nie oświetlenie. Nie da się zrobić tego co chce Ania na wbudowanych nodach Cyclesa. Trzeba to napisać w OSLu fejkując shading.
Ania Napisano 9 Czerwiec 2015 Autor Napisano 9 Czerwiec 2015 Monio - masz może jakieś dobre materiały, tutoriale, coś na wstęp jak się za to zabrać w OSL? Dotąd znalazłam tylko metody jak w OSL modyfikować gotowe Cyclesowe shadery (tak jak w moim poście za pomocą gotowych emission i toon), ale wygląda na to że nie tędy droga. Albo jakiś przykład shadera napisanego w OSL od zera?
Monio Napisano 9 Czerwiec 2015 Napisano 9 Czerwiec 2015 Ja w sumie ledwo liznąłem OSLa i skupiam się na proceduralnych teksturach a nie shadingu więc wiele ci nie pomogę. Niżej masz fajną prezentacje o OSLu. Opisuje elementarne podstawy. http://blog.selfshadow.com/publications/s2012-shading-course/martinez/s2012_pbs_osl_slides.pdf Jeśli będziesz chciała dłubać coś na własną rękę to powinnaś zapoznać się ze specyfikacją OSLa która jest na githubie projektu. https://github.com/imageworks/OpenShadingLanguage/blob/master/src/doc/osl-languagespec.pdf Nie ma w OSLu czegoś takiego jak shader napisany "od zera". ;) OSL nie funkcjonuje w ten sposób, on przekazuje rendererowi instrukcje (Closure) jak ma zachowywać się światło. Powiedzmy że działa jak taki mixshader który łączy w sobie wiele wbudowanych niskopoziomowych shaderów (diffuse) i ich poszczególnych parametrów (color, roughness). Tak w dużym uproszczeniu. OSL nie tworzy wynikowego koloru pocieniowanego pixela jak RSL. Sposób w jaki Closure jest interpretowany jest zależny od implementacji renderera więc komponent 'diffuse' czy "emmision" może być kalkulowany innymi metodami w zależności od silnika. To jest główna rzecz która odróżnia ten język i jego największa zaleta. Dzięki takiemu podejściu ciężar pisania zaawansowanych algorytmów renderingu jest przeniesiony na twórców renderera a nie osobę która pisze shader. Jednak ta prostota działa kosztem elastyczności. Problem jest taki że to język z natury przystosowany do rendererów PBR więc robienie w nim shaderów NPR wymaga bardzo mocnego kombinowania. Nie da się od tak nałożyć ColorRampy na gotowy shading i wymieszać go z teksturą. OSL nie obsługuje też staromodnych light loopów więc jeśli chcesz uwzględniać światło trzeba by było je sobie napisać własnoręcznie... Wyższa szkoła jazdy. ;) Na BlenderArtist jest trochę osób które bawią się OSLem. Opisz tam dokładnie swój problem to może ci coś doradzą. Tylko zaznacz że chodzi ci o teksturowanie względem oświetlenia wyginaniem Normali.
Monio Napisano 13 Czerwiec 2015 Napisano 13 Czerwiec 2015 Taka ciekawostka. Animacja i raytraceingowy renderer napisany w jako shader OSL. Tak więc nie poddawaj się Aniu, twój problem na pewno da się rozwiązać. :)
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się