1,SimpleColorShader:
shader gamma(color cin = color(0,0,0),output color Cout=color(0,0,0)) { Cout = cin; }
Katana启动时候会自动编译:
Arnold里bin文件夹里有oslc编译osl文件。但是在centos的GLIB不是2.14,所以单独运行不行。 但是在Katana启动调用时候为何自动编译,猜测是Arnold bin文件夹里已经把GLIB2.14一些符号编译成静态库了。
如果需要手动编译osl.编译GLIBC2.14.
编译glibc2.14 放到/opt/glibc-2.14
cd build ../configure --prefix=/opt/glibc-2.14 make -j 56 make install #如果编译错误: cp /etc/ld.so.conf /opt/glibc-2.14/etc/
再创建个bash文件调用GLIBC2.14,然后执行oslc,起名为:run_oslc
#!/usr/bin/env bash GLIB_LIB_PATH=/opt/glibc-2.14/lib KTOA_ROOT=/opt/solidangle/KtoA-2.2.0.2-kat3.0-linux/ export LD_LIBRARY_PATH=${GLIB_LIB_PATH}:${LD_LIBRARY_PATH} exec "${KTOA_ROOT}/bin/oslc" "$@"
则编译shader是:./run_oslc gamma.osl
Katana要加载osl shader 必须:export ARNOLD_PLUGIN_PATH=/mnt/Proj_Lighting/RD/katana3_plugin/Arnold/OSL_Shaders 要指定这个环境变量,
把shader放到这个里面,Katana会自动编译这些oslshader, 不用自己去手动编译
2,添加辅助信息 :
shader gamma[[ string help = "Simple mat" ]] (color cin = color(0,0,0)[[string help="InputColor",float min = 0, float max = 1]],output color Cout=color(0,0,0)) { Cout = cin; }
3,Diffuse with noise
#include <stdosl.h> shader SimpleShader( color diffuse_color = color(0.6, 0.8, 0.6), float noise_factor = 0.5, output closure color bsdf = diffuse(N)) { color material_color = diffuse_color * mix(1.0, noise(P * 10.0), noise_factor); bsdf = material_color * diffuse(N); }
bsdf默认是个diffuse材质,下面只是乘以一些颜色
4,Metal Reflection
#include <stdosl.h> shader GOSL_Metal( color diffuse_color = color(0.6, 0.8, 0.6), output closure color bsdf =0) { bsdf = diffuse_color * reflection(N); }
diffuse(N):
5,Depth Color Channel:
#include <stdosl.h> shader GOSL_Metal( float divide_value = 10, output color bsdf =0[[float min=0,float max=1000000000]]) { point camera; camera = transform("camera","world",point(0,0,0)); bsdf = sqrt(dot(camera-P,camera-P))/divide_value; }
6,Noise shader:
#include <stdosl.h> /* Coding Time:2018/9/10 liuyangping207@qq.com */ vector getNoise(vector inputPos,float amp,vector offset,vector freq,int turbulence, float rough){ vector fp = 0; vector sum=0; vector sample_p = (inputPos + offset) * freq; float contrib = 1; for(int i=0;i<turbulence;i++) { vector ns = snoise(sample_p); sum += ns*contrib; sample_p *=2.6; contrib *= rough; } fp += sum*amp; return fp; } shader GOSL_Metal( vector inputPosition = 0, float amplitude = 1, float roughness = 0.55, int turbulence = 5, vector offset = 0, vector frequency = 1, int useRestNoise = 0, output color bsdf =0) { if(useRestNoise) bsdf = getNoise(inputPosition,amplitude,offset,frequency,turbulence,roughness); else{ bsdf = getNoise(P,amplitude,offset,frequency,turbulence,roughness); } }
7,metadata in katana
#include <stdosl.h> /* Coding Time:2018/9/10 liuyangping207@qq.com */ #define OPTION_A 0 #define OPTION_B 1 #define OPTION_C 2 shader TestCode( int booleanvalue = 0 [[ string widget = "boolean" ]], int enumvalue = 0 [[ string widget = "popup", string options = "OptionA|OptionB|OptionC" ]], output color cout=0 ) { if (booleanvalue) cout=color(1,0,0); if (enumvalue == OPTION_B) cout=color(0,1,0); }