OSL

1,SimpleColorShader:

 

shader gamma(color cin = color(0,0,0),output color Cout=color(0,0,0))
{
    Cout = cin;
}

 

Katana启动时候会自动编译:

OSL

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);
}

OSL

 

diffuse(N):

OSL

 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;
   
}

OSL

 

 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);
   }

}

OSL

 

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);
}
View Code

相关文章:

猜你喜欢
  • 2021-11-17
  • 2021-06-17
相关资源
相似解决方案