Skocz do zawartości

Rekomendowane odpowiedzi

Napisano

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. toon_test.jpg

  • Odpowiedzi 15
  • Created
  • Ostatniej odpowiedzi

Top Posters In This Topic

Napisano (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 przez Ania
Napisano

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.

Napisano

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.

Napisano (edytowane)

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.

Edytowane przez Monio
Napisano
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/

Napisano

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.

Napisano

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?

Napisano

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.

Napisano

 

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ć. :)

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ę



×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Wykorzystujemy cookies. Przeczytaj więcej Polityka prywatności