April 4-7, 2016 | Silicon Valley www.esi-group.com
Andreas Süßenbach, NVIDIA Andreas Mank, ESI Group
SIGGRAPH16 : NVIDIA BEST OF GTC MDL MATERIALS TO GLSL SHADERS - - PowerPoint PPT Presentation
April 4-7, 2016 | Silicon Valley SIGGRAPH16 : NVIDIA BEST OF GTC MDL MATERIALS TO GLSL SHADERS Andreas Senbach, NVIDIA Andreas Mank, ESI Group www.esi-group.com S6311 MDL Materials to GLSL Shaders . Theory and Practice.
April 4-7, 2016 | Silicon Valley www.esi-group.com
Andreas Süßenbach, NVIDIA Andreas Mank, ESI Group
2
3
7/20/2016 20.07.2016
MATERIAL TWEAKING MATERIAL CONSTRUCTION
MATERIAL SHARING (LIBRARY)
DEFINITION
IMPLEMENTATION
4
5
RAY TRACER RASTERIZER Shadows Reflections Walnut Silver Car paint
6
RAY TRACER RASTERIZER Shadows Reflections Walnut Silver Car paint
7
RAY TRACER RASTERIZER Shadows Reflections Walnut Silver Car paint
8
RAY TRACER RASTERIZER Shadows Reflections Walnut Silver Car paint
9
RAY TRACER RASTERIZER Shadows Reflections Walnut Silver Car paint
10
RAY TRACER RASTERIZER Shadows Reflections Walnut Silver Car paint
11
Measured Materials and Photometric Lights
by courtesy of X-RITE
12
13
14
export material tintedStuff( color parTint = color(.6,.2,.2) ) = material ( surface: material_surface( scattering: df::specular_bsdf( tint: parTint ) ) );
15
material_surface: surface material_surface: backface material_geometry material_volume bool: thin_walled color: ior bsdf: scattering material_emission: emission bsdf: scattering material_emission: emission float3: displacement float: cutout_opacity float3: normal vdf: scattering
absorption_coefficient scattering_coefficient
16
17
18
Initializing Material Compiling Material Parsing Expression Parsing Call Parsing
HINSTANCE dll = LoadLibrary("libmdl_sdk.dll"); INeuray_factory* factory = (INeuray_factory*)GetProcAddress(dll,"mi_neuray_factory"); mi::base::Handle<mi::neuraylib::INeuray> neuray = factory(0,MI_NEURAYLIB_API_VERSION ); mi::base::Handle<mi::neuraylib::IMdl_compiler> mdlCompiler = neuray->get_api_component<mi::neuraylib::IMdl_compiler>();
19
Initializing Material Compiling Material Parsing Expression Parsing Call Parsing
mi::Sint32 reason = mdlCompiler->load_module ("::nvidia::vMaterials::AEC::Concrete::concrete_blocks"); mi::base::Handle<const mi::neuraylib::IModule> module( mdlCompiler->access<mi::neuraylib::IModule>( "mdl::nvidia::vMaterials::AEC::Concrete::concrete_blocks")); for ( mi::Size i=0 ; i<module->get_material_count() ; i++ ) { mi::base::Handle<mi::neuraylib::IMaterial_definition const> materialDefinition(mdlCompiler->access <mi::neuraylib::IMaterial_definition>(module->get_material(i)); mi::base::Handle<mi::neuraylib::IMaterial_instance> materialInstance (materialDefinition->create_material_instance(0,&result)); mi::base::Handle<mi::neuraylib::ICompiled_material> compiledMaterial (materialInstance->create_compiled_material (mi::neuraylib::IMaterial_instance::CLASS_COMPILATION,1.0f ,&result); }
20
Initializing Material Compiling Material Parsing Expression Parsing Call Parsing
for (mi::Size i=0; i<compiledMaterial->get_parameter_count(); i++) { char const* parameterName = compiledMaterial-> get_parameter_name(i); mi::base::Handle<mi::neuraylib::IValue const> value (compiledMaterial->get_argument(i)); } for (mi::Size i=0; i<compiledMaterial->get_temporary_count(); i++) { mi::base::Handle<mi::neuraylib::IExpression const> expression (compiledMaterial->get_temporary(i)); } mi::base::Handle<mi::neuraylib::IExpression const> surfaceExpression (compiledMaterial->get_field("surface")); mi::base::Handle<mi::neuraylib::IExpression const> backfaceExpression (compiledMaterial->get_field(„backface"));
21
Initializing Material Compiling Material Parsing Expression Parsing Call Parsing
switch( expression->get_kind() ) { case mi::neuraylib::IExpression::EK_CONSTANT: ... break; case mi::neuraylib::IExpression::EK_PARAMETER: ... break; case mi::neuraylib::IExpression::EK_TEMPORARY: ... break; case mi::neuraylib::IExpression::EK_DIRECT_CALL: ... break; }
22
Initializing Material Compiling Material Parsing Expression Parsing Call Parsing
mi::base::Handle<mi::neuraylib::IType const> type(call-> get_type()); mi::base::Handle<mi::neuraylib::IExpression_list const> arguments (call->get_arguments()); for (mi::Size i=0; i<arguments->get_size(); i++) { char const* name = arguments->get_name(i); mi::base::Handle<mi::neuraylib::IExpression const> argument (arguments->get_expression(i)); }
23
MDL Material Expression Tree
export material tintedStuff( color parTint = color(.6,.2,.2) ) = material ( surface: material_surface( scattering: df::specular_bsdf( tint: parTint ) ) );
tintedStuff surface scattering emission backface scattering emission
24
25
26
27
float mdl_math_minValue( in vec3 a ) { return( min( min( a.x, a.y ), a.z ) ); }
vec4 mdl_df_weightedLayer( in float weight, in vec4 layer, in vec4 base ) { return( mix( base, layer, weight ) ); }
28
29
30
31
functionCall arg0 nextCall X Y z yetAnotherCall nestedCall x y
float functionCall(...) {...} int nextCall(...) {...} float yetAnotherCall(...) {...} int nextedCall(...) {...} ... functionCall(arg0,nextCall(x,y,z),yetAnotherCall(nestedCall(x),y));
32
33 void main(void) { stateNormal = normalize(varNormal); if (! gl_FrontFacing) { stateNormal = - stateNormal;
} texCoord0 = varTexCoord0; tangent = normalize(varTangent); binormal = normalize(varBinormal); viewDir = normalize(varEyePos - varWorldPos); vec4 rgba = vec4(0.0f, 0.0f, 0.0f, 0.0f); if (0.0f < evalCutoutOpacity(stateNormal)) { vec3 normal = evalNormal(normal); materialIOR = evalIOR(normal); vec3 materialEmissive = vec3(0.0f, 0.0f, 0.0f); bool useFront = gl_FrontFacing; if (useFront) { materialEmissive = evalMaterialEmissiveFront(normal); } else { // there's no emission on the back-side, unless thinWalled is true useFront = !evalThinWalled(); if (!useFront) { materialEmissive = evalMaterialEmissiveBack(normal); } materialIOR = 1.0f / materialIOR; } rgba = vec4(materialEmissive, 0.0f); if (0 < sys_NumLights) { vec3 lightAmbient; for (int i=0; i<sys_NumLights; i++) { sampleLight(sys_Lights[i], varWorldPos, lightDir, lightAmbient, lightDiffuse, lightSpecular); rgba += useFront ? evalColorFront(normal) : evalColorBack(normal); } rgba.a /= sys_NumLights; } else { rgba.a = 1.0f; } rgba.a *= alphaCutout; if (0.0f < rgba.a) { lightDir = reflect(-viewDir, normal); rgba.rgb += (useFront ? evalEnvironmentFront(normal) : evalEnvironmentBack(normal)).rgb; } } emitColor(rgba); }
34
float cutoutOpacity = evalCutoutOpacity(stateNormal); if (0.0f < cutoutOpacity) { vec3 normal = evalNormal(stateNormal); materialIOR = evalIOR(normal);
35
36
37
April 4-7, 2016 | Silicon Valley www.esi-group.com