This example introduces compiled materials and highlights differences between different compilation modes.
#include <iomanip>
#include <iostream>
#include <sstream>
#include <string>
#include "example_shared.h"
void dump_compiled_material(
{
char buffer[36];
"%08x %08x %08x %08x", hash.m_id1, hash.m_id2, hash.m_id3, hash.m_id4);
s <<
" hash overall = " << buffer <<
std::endl;
"%08x %08x %08x %08x", hash.m_id1, hash.m_id2, hash.m_id3, hash.m_id4);
}
for(
mi::Size i = 0; i < parameter_count; ++i) {
name << i;
value_factory->dump( argument.get(), name.str().c_str(), 1));
s <<
" argument " << result->get_c_str() <<
std::endl;
}
for(
mi::Size i = 0; i < temporary_count; ++i) {
name << i;
expression_factory->
dump( temporary.get(), name.str().c_str(), 1));
s <<
" temporary " << result->get_c_str() <<
std::endl;
}
s <<
" body " << result->get_c_str() <<
std::endl;
}
void create_material_instance(
const char* instance_name)
{
transaction, "::nvidia::sdk_examples::tutorials", context) >= 0);
print_messages( context);
"mdl::nvidia::sdk_examples::tutorials::example_compilation"));
material_definition->create_material_instance( 0, &result));
check_success( result == 0);
transaction->
store( material_instance.get(), instance_name);
}
void compile_material_instance(
const char* instance_name,
const char* compiled_material_name,
bool class_compilation)
{
material_instance->create_compiled_material( flags, context));
check_success( print_messages( context));
std::cout <<
"Dumping compiled material (" << ( class_compilation ?
"class" :
"instance")
<< " compilation) for \"" << instance_name << "\":" << std::endl << std::endl;
dump_compiled_material( transaction, mdl_factory, compiled_material.get(),
std::cout);
transaction->
store( compiled_material.get(), compiled_material_name);
}
void change_arguments(
const char* instance_name)
{
check_success( material_instance.is_valid_interface());
value_factory->create_color( 0.0f, 1.0f, 0.0f));
check_success( material_instance->set_argument( "tint", tint_expr.get()) == 0);
}
void generate_llvm_ir(
const char* compiled_material_name,
const char* path,
const char* fname)
{
check_success( be_llvm_ir->set_option( "num_texture_spaces", "16") == 0);
check_success( be_llvm_ir->set_option( "enable_simd", "on") == 0);
be_llvm_ir->translate_material_expression(
transaction, compiled_material.get(), path, fname, context));
check_success( print_messages( context));
check_success( code_llvm_ir);
std::cout <<
"Dumping LLVM IR code for \"" << path <<
"\" of \"" << compiled_material_name
}
void generate_cuda_ptx(
const char* compiled_material_name,
const char* path,
const char* fname)
{
check_success( be_cuda_ptx->set_option( "num_texture_spaces", "16") == 0);
check_success( be_cuda_ptx->set_option( "sm_version", "50") == 0);
be_cuda_ptx->translate_material_expression(
transaction, compiled_material.get(), path, fname, context));
check_success( print_messages( context));
check_success( code_cuda_ptx);
std::cout <<
"Dumping CUDA PTX code for \"" << path <<
"\" of \"" << compiled_material_name
}
#ifndef MDL_SOURCE_RELEASE
void generate_glsl(
const char* compiled_material_name,
const char* path,
const char* fname)
{
check_success( be_glsl->set_option( "glsl_version", "450") == 0);
be_glsl->translate_material_expression(
transaction, compiled_material.get(), path, fname, context));
check_success( print_messages( context));
check_success( code_glsl);
std::cout <<
"Dumping GLSL code for \"" << path <<
"\" of \"" << compiled_material_name
}
#endif // MDL_SOURCE_RELEASE
int main( int , char* [])
{
check_success( neuray.is_valid_interface());
configure( neuray.get());
check_start_success( result);
{
{
std::string instance_name =
"instance of compilation_material";
create_material_instance( transaction.get(), mdl_compiler.get(), context.get(), instance_name.c_str());
=
std::string(
"instance compilation of ") + instance_name;
compile_material_instance(
transaction.get(), mdl_factory.get(), context.get(), instance_name.c_str(),
instance_compilation_name.c_str(), false);
=
std::string(
"class compilation of ") + instance_name;
compile_material_instance(
transaction.get(), mdl_factory.get(), context.get(), instance_name.c_str(),
class_compilation_name.c_str(), true);
change_arguments( transaction.get(), mdl_factory.get(), instance_name.c_str());
compile_material_instance(
transaction.get(), mdl_factory.get(), context.get(), instance_name.c_str(),
instance_compilation_name.c_str(), false);
compile_material_instance(
transaction.get(), mdl_factory.get(), context.get(), instance_name.c_str(),
class_compilation_name.c_str(), true);
generate_llvm_ir(
transaction.get(), mdl_compiler.get(), context.get(), instance_compilation_name.c_str(),
"backface.scattering.tint", "tint");
generate_cuda_ptx(
transaction.get(), mdl_compiler.get(), context.get(), instance_compilation_name.c_str(),
"backface.scattering.tint", "tint");
generate_cuda_ptx(
transaction.get(), mdl_compiler.get(), context.get(), class_compilation_name.c_str(),
"backface.scattering.tint", "tint");
#ifndef MDL_SOURCE_RELEASE
generate_glsl(
transaction.get(), mdl_compiler.get(), context.get(), instance_compilation_name.c_str(),
"backface.scattering.tint", "tint");
generate_glsl(
transaction.get(), mdl_compiler.get(), context.get(), class_compilation_name.c_str(),
"backface.scattering.tint", "tint");
#endif
}
}
check_success( neuray->shutdown() == 0);
neuray = 0;
check_success( unload());
keep_console_open();
return EXIT_SUCCESS;
}