mental ray makes a range of functions available to shaders that can be used
to access data, cast rays, looking up images, and perform standard mathematical
computations. The functions are grouped by the module that supplies them.
The shader writer may also use C library functions, but it is mandatory
to include <stdio.h>
and <math.h>
if printing functions such as fprintf
(use
mi_info or similar for console
debugging messages) or math functions such as sin
are used.
Not including these headers may abort rendering at runtime, even though the
compiler did not complain. All shaders must include the standard mental ray
header file, shader.h
.
Here is a summary of functions provided by mental ray. Section functype shows which functions can be used in which shaders.
type | name | arguments |
---|---|---|
miBoolean | mi_call_shader | *result, type, *state, tag |
miBoolean | mi_call_shader_x | *result, type, *state, tag, *arg |
miBoolean | mi_call_material | *result, *state |
miBoolean | mi_call_photon_material | *result, *state |
miBoolean | mi_call_shadow_material | *result, *state |
miBoolean | mi_call_environment_material | *result, *state |
miBoolean | mi_call_volume_material | *result, *state |
miBoolean | mi_call_photonvol_material | *result, *state |
miBoolean | mi_call_contour_material | *result, *void, *void, *state |
void * | mi_eval | *state, *param |
miBoolean * | mi_eval_boolean | *param |
miInteger * | mi_eval_integer | *param |
miScalar * | mi_eval_scalar | *param |
miVector * | mi_eval_vector | *param |
miScalar * | mi_eval_transform | *param |
miColor * | mi_eval_color | *param |
miTag * | mi_eval_tag | *param |
void | mi_flush_cache | *state |
type | name | arguments |
---|---|---|
int | mi_db_type | tag |
int | mi_db_size | tag |
void * | mi_db_access | tag |
void | mi_db_unpin | tag |
void | mi_db_flush | tag |
type | name | arguments |
---|---|---|
miBoolean | mi_trace_eye | *result, *state, *org, *dir |
miBoolean | mi_trace_reflection | *result, *state, *dir |
miBoolean | mi_trace_refraction | *result, *state, *dir |
miBoolean | mi_trace_transparent | *result, *state |
miBoolean | mi_trace_environment | *result, *state, *dir |
miBoolean | mi_trace_probe | *state, *dir, *org |
miBoolean | mi_trace_transparent | *result, *state |
miBoolean | mi_trace_continue | *result, *state |
miBoolean | mi_trace_light | *result, *dir, *nl, *st, i |
miBoolean | mi_sample_light | *result, *dir, *nl, *st,i,*s |
miBoolean | mi_trace_shadow | *result, *state |
miBoolean | mi_trace_shadow_seg | *result, *state |
miBoolean | mi_continue_shadow_seg | *result, *state |
miBoolean | mi_ray_offset | *state, *offset |
miBoolean | mi_ray_falloff | *state, *start, *stop |
miBoolean | mi_inclusive_lightlist | *n, **lights, *state |
miBoolean | mi_exclusive_lightlist | *n, **lights, *state |
miBoolean | mi_instance_lightlist | *n, **lights, *state |
miScalar | mi_lightprofile_value | *prof, phi, theta, *pos, rel |
miScalar | mi_lightprofile_sample | *state, proftag, rel |
miBoolean | mi_compute_irradiance | *result, *state |
miBoolean | mi_compute_irradiance_backside | *result, *state |
miBoolean | mi_compute_avg_radiance | *result, *state, face, irrad_options |
miBoolean | mi_compute_volume_irradiance | *result, *state |
miBoolean | mi_compute_directional_irradiance | *result, *state, r, g1, g2 |
miBoolean | mi_finalgather_store | *result, *state, mode |
miBoolean | mi_sample | *sample, *i, *state, dim, *n |
type | name | arguments |
---|---|---|
miBoolean | mi_photon_light | *energy, *state |
miBoolean | mi_photon_reflection_specular | *energy, *state, *dir |
miBoolean | mi_photon_reflection_glossy | *energy, *state, *dir |
miBoolean | mi_photon_reflection_diffuse | *energy, *state, *dir |
miBoolean | mi_photon_transmission_specular | *energy, *state, *dir |
miBoolean | mi_photon_transmission_glossy | *energy, *state, *dir |
miBoolean | mi_photon_transmission_diffuse | *energy, *state, *dir |
miBoolean | mi_photon_transparent | *energy, *state |
miBoolean | mi_photon_volume_scattering | *energy, *state, *dir |
void | mi_store_photon | *energy, *state |
void | mi_store_volume_photon | *energy, *state |
type | name | arguments |
---|---|---|
void | mi_reflection_dir | dir, state |
void | mi_reflection_dir_specular | *dir, *state |
void | mi_reflection_dir_glossy | *dir, *state, shiny |
void | mi_reflection_dir_glossy_x | *dir, *state, shiny, *sample |
void | mi_reflection_dir_anisglossy | *dir, *state, u, v, shiny_u, shiny_v |
void | mi_reflection_dir_anisglossy_x | *dir, *state, u, v, shiny_u, shiny_v, *sample |
void | mi_reflection_dir_diffuse | *dir, *state |
void | mi_reflection_dir_diffuse_x | *dir, *state, *sample |
miBoolean | mi_refraction_dir | dir, state, ior_in, ior_out |
miBoolean | mi_transmission_dir_specular | *dir, *state, *in, *out |
miBoolean | mi_transmission_dir_glossy | *dir, *state, *in, *out, shiny |
miBoolean | mi_transmission_dir_glossy_x | *dir, *state, *in, *out, shiny, *sample |
miBoolean | mi_transmission_dir_anisglossy | *dir, *state, *in, *out, u, v, shiny_u, shiny_v |
miBoolean | mi_transmission_dir_anisglossy_x | *dir, *state, *in, *out, u, v, shiny_u, shiny_v, *sample |
void | mi_transmission_dir_diffuse | *dir, *state |
void | mi_transmission_dir_diffuse_x | *dir, *state, *sample |
void | mi_scattering_dir_diffuse | *dir, *state |
void | mi_scattering_dir_directional | *dir, *state, directionality |
miScalar | mi_scattering_pathlength | *state, density |
type | name | arguments |
---|---|---|
void | mi_vector_neg | *r |
void | mi_vector_add | *r, *a, *b |
void | mi_vector_sub | *r, *a, *b |
void | mi_vector_mul | *r, f |
void | mi_vector_div | *r, f |
void | mi_vector_prod | *r, *a, *b |
miScalar | mi_vector_dot | *a, *b |
miScalar | mi_vector_norm | *a |
void | mi_vector_normalize | *r |
void | mi_vector_min | *r, *a, *b |
void | mi_vector_max | *r, *a, *b |
miScalar | mi_vector_det | *a, *b, *c |
miScalar | mi_vector_dist | *a, *b |
void | mi_matrix_null | r |
void | mi_matrix_ident | r |
miBoolean | mi_matrix_isident | a |
void | mi_matrix_copy | r, a |
miBoolean | mi_matrix_invert | r, a |
void | mi_matrix_prod | r, a, b |
void | mi_matrix_rot_det | a |
void | mi_matrix_rotate | a, x, y, z |
void | mi_matrix_rotate_axis | a, *v, r |
void | mi_matrix_solve | *x, a, *b, c |
type | name | arguments |
---|---|---|
void | mi_point_transform | *r, *v, m |
void | mi_vector_transform | *r, *v, m |
void | mi_vector_transform_T | *r, *v, m |
void | mi_point_to_world | *state, *r, *v |
void | mi_point_to_camera | *state, *r, *v |
void | mi_point_to_object | *state, *r, *v |
void | mi_point_to_light | *state, *r, *v |
void | mi_point_to_raster | *state, *r, *v |
void | mi_point_from_world | *state, *r, *v |
void | mi_point_from_camera | *state, *r, *v |
void | mi_point_from_object | *state, *r, *v |
void | mi_point_from_light | *state, *r, *v |
void | mi_vector_to_world | *state, *r, *v |
void | mi_vector_to_camera | *state, *r, *v |
void | mi_vector_to_object | *state, *r, *v |
void | mi_vector_to_light | *state, *r, *v |
void | mi_vector_from_world | *state, *r, *v |
void | mi_vector_from_camera | *state, *r, *v |
void | mi_vector_from_object | *state, *r, *v |
void | mi_vector_from_light | *state, *r, *v |
void | mi_normal_to_world | *state, *r, *v |
void | mi_normal_to_camera | *state, *r, *v |
void | mi_normal_to_object | *state, *r, *v |
void | mi_normal_to_light | *state, *r, *v |
void | mi_normal_from_world | *state, *r, *v |
void | mi_normal_from_camera | *state, *r, *v |
void | mi_normal_from_object | *state, *r, *v |
void | mi_normal_from_light | *state, *r, *v |
type | name | arguments |
---|---|---|
miScalar | mi_random | |
miScalar | mi_srandom | seed |
miScalar | mi_erandom | seed[3] |
double | mi_par_random | *state |
miScalar | mi_spline | t, n, *ctl |
miScalar | mi_noise_1d | p |
miScalar | mi_noise_2d | u, v |
miScalar | mi_noise_3d | *p |
miScalar | mi_noise_1d_grad | p, *g |
miScalar | mi_noise_2d_grad | u, v, *gu, *gv |
miScalar | mi_noise_3d_grad | *p, *g |
miScalar | mi_unoise_1d | p |
miScalar | mi_unoise_2d | u, v |
miScalar | mi_unoise_3d | *p |
miScalar | mi_unoise_1d_grad | p, *g |
miScalar | mi_unoise_2d_grad | u, v, *gu, *gv |
miScalar | mi_unoise_3d_grad | *p, *g |
type | name | arguments |
---|---|---|
void | mi_img_put_color | *image, *color, x, y |
void | mi_img_get_color | *image, *color, x, y |
void | mi_img_put_scalar | *image, scalar, x, y |
void | mi_img_get_scalar | *image, *scalar, x, y |
void | mi_img_put_vector | *image, *vector, x, y |
void | mi_img_get_vector | *image, *vector, x, y |
void | mi_img_put_depth | *image, depth, x, y |
void | mi_img_get_depth | *image, *depth, x, y |
void | mi_img_put_normal | *image, *normal, x, y |
void | mi_img_get_normal | *image, *normal, x, y |
void | mi_img_put_label | *image, label, x, y |
void | mi_img_get_label | *image, *label, x, y |
int | mi_img_get_width | *image |
int | mi_img_get_height | *image |
miImg_image* | mi_img_pyramid_get_level | *image, int |
miBoolean | mi_img_tonemap | *outimage, *inimage, *paras |
type | name | arguments |
---|---|---|
miUint1 | mi_colorprofile_renderspace_id | |
miUint1 | mi_colorprofile_internalspace_id | |
miUint1 | mi_colorprofile_ciexyz_id | |
miBoolean | mi_colorprofile_internal_to_render | *color |
miBoolean | mi_colorprofile_internal_to_ciexyz | *color |
miBoolean | mi_colorprofile_render_to_internal | *color |
miBoolean | mi_colorprofile_render_to_ciexyz | *color |
miBoolean | mi_colorprofile_ciexyz_to_render | *color |
miBoolean | mi_colorprofile_ciexyz_to_internal | *color |
type | name | arguments |
---|---|---|
miScalar | mi_fresnel | n1, n2, t1, t2 |
miScalar | mi_fresnel_reflection | *state, *i, *o |
miScalar | mi_phong_specular | spec, *state, *dir |
void | mi_fresnel_specular | *ns, *ks, s, *st, *dir, *in, *out |
miScalar | mi_blinn_specular | spec, *state, *dir |
miScalar | mi_blong_specular | spec, *state, *dir |
miBoolean | mi_cooktorr_specular | *result, *di, *dr, *n, roughness, *ior |
miScalar | mi_ward_glossy | *di, *dr, *n, shiny |
miScalar | mi_ward_anisglossy | *di, *dr, *n, *u, *v, shiny_u, shiny_v |
miScalar | mi_schlick_scatter | *di, *dr, directionality |
miRay_type | mi_choose_scatter_type | *state, transp, *specular, *glossy, *diffuse |
miRay_type | mi_choose_simple_scatter_type | *state, *rdiff, *rspec, *tdiff, *tspec |
miInteger | mi_choose_lobe | *state, r |
type | name | arguments |
---|---|---|
miBoolean | mi_lookup_color_texture | *col, *state, tag, *v |
miBoolean | mi_lookup_scalar_texture | *scal, *state, tag, *v |
miBoolean | mi_lookup_vector_texture | *vec, *state, tag, *v |
miBoolean | mi_lookup_filter_color_texture | *col, *state, tag, *paras, ST |
miBoolean | mi_texture_filter_project | p[3], t[3], *state, disc_r, space |
miBoolean | mi_texture_filter_transform | ST, p[3], t[3] |
miScalar | mi_luminance | *state, color |
miBoolean | mi_tri_vectors | *state, wh, nt, **a, **b, **c |
miBoolean | mi_texture_interpolate | *state, space, *result |
miBoolean | mi_raster_unit | *state, *x, *y |
miBoolean | mi_query | query, *state, tag, *result, ... |
miBoolean | mi_shaderstate_enumerate | *state, *cb, *arg |
miBoolean | mi_shaderstate_set | *state, *key, ks, *val, vs, t |
void * | mi_shaderstate_get | *state, *key, ks, *vs |
miBoolean | mi_fb_put | *state, fb, *data |
miBoolean | mi_fb_get | *state, fb, *data |
miImg_image * | mi_output_image_open | *state, idx |
void | mi_output_image_close | *state, idx |
miBoolean | mi_geoshader_add_result | query, *state, tag, *result, ... |
miBoolean | mi_geoshader_tesselate | *state, *leaves, source |
miBoolean | mi_geoshader_tesselate_end | leaves |
miBoolean | mi_geoshader_echo_tag | *fp, tag, *eopt |
char * | mi_string_substitute | *new, *old, size |
miInteger | mi_volume_num_shaders | *state |
miInteger | mi_volume_cur_shader | *state |
miColor * | mi_volume_tags | *state |
miTag * | mi_volume_user_color | *state |
void | mi_opacity_set | *state, *color |
miBoolean | mi_opacity_get | *state, *color |
type | name | arguments |
---|---|---|
void * | mi_renderpass_access | *state, pass, db |
miBoolean | mi_renderpass_sample_get | *result, sz, *state, fb, x, y |
miBoolean | mi_renderpass_sample_put | *result, sz, *state, fb, x, y |
miBoolean | mi_renderpass_samplerect_flush | *result, *state, x, y |
miBoolean | mi_renderpass_samplerect_black | *result, *state, x, y |
type | name | arguments |
---|---|---|
void | mi_light_info | tag, *org, *dir, **paras |
int | mi_global_lights_info | **tag |
void | mi_texture_info | tag, *xres, *yres, **paras |
void * | mi_shader_info | *state |
int | mi_instance_info | *state, **paras, **p1, **p2, **p3 |
type | name | arguments |
---|---|---|
miBoolean | mi_get_contour_line | *p1, *p2 |
void | mi_add_contour_lines | p1[], p2[], n |
type | name | arguments |
---|---|---|
miImg_image* | mi_lightmap_edit | **handle, tag |
void | mi_lightmap_edit_end | *handle |
type | name | arguments |
---|---|---|
void * | mi_mem_allocate | size |
void * | mi_mem_test_allocate | size |
void * | mi_mem_reallocate | mem, size |
void * | mi_mem_test_reallocate | mem, size |
void | mi_mem_release | mem |
void | mi_mem_check | |
void | mi_mem_dump | mod |
char * | mi_mem_strdup | *text |
type | name | arguments |
---|---|---|
void | mi_init_lock | *lock |
void | mi_delete_lock | *lock |
void | mi_lock | lock |
void | mi_unlock | lock |
int | mi_par_localvpu | |
int | mi_par_nthreads | |
int | mi_par_aborted |
type | name | arguments |
---|---|---|
void | mi_fatal | *message, ... |
void | mi_error | *message, ... |
void | mi_warning | *message, ... |
void | mi_info | *message, ... |
void | mi_progress | *message, ... |
void | mi_debug | *message, ... |
void | mi_vdebug | *message, ... |
miBoolean mi_call_shader( miColor * const result, miShader_type type, miState * const state, miTag shader)
miBoolean mi_call_shader_x( miColor * const result, miShader_type type, miState * const state, miTag shader, void *arg)
Call the shader specified by the tag shader.
The extended version passes an additional arg parameter as a fourth argument to the shader. The function mi_call_shader_x is slightly more efficient than mi_call_shader.
The shadertag is normally a texture
shader or light shader or some other
type of shader found in the calling shader's parameter list. The caller must
pass its own state and the shader type, which must be one of
miSHADER_LENS
, miSHADER_MATERIAL
,
miSHADER_LIGHT
, miSHADER_SHADOW
,
miSHADER_ENVIRONMENT
, miSHADER_VOLUME
, and
miSHADER_TEXTURE
.
The sequence of operations is:
state→shader
.state→shader
is restored to
its old value.The return value of the shader call is returned. The result value computed by the shader is returned in the variable pointed to by the result pointer. If the shader expects a result argument of a type other than miColor, the pointer must be cast to miColor when passed to mi_call_shader. Note, that the shader tag references an entire function call including shader parameters as defined in the scene, or in the .mi file with a texture, light, or some other statement, combining shading function and shader parameters to form a shader instance; it is not just a simple pointer or reference to a C function.
miBoolean mi_call_material( miColor *result, miState *state);
Call the material shader in
state→material
.
This works both for standard materials and Phenomenon materials.
miBoolean mi_call_photon_material( miColor *result, miState *state);
Call the photon shader in
state→material
.
This works both for standard materials and Phenomenon materials. It calls the photon shader of a material Phenomenon.
miBoolean mi_call_shadow_material( miColor *result, miState *state);
Call the shadow shader in
state→material
.
This works both for standard materials and Phenomenon materials. It calls the shadow shader of a material Phenomenon.
miBoolean mi_call_environment_material( miColor *result, miState *state);
Call the environment shader
in state→material
.
This works both for standard materials and Phenomenon materials. It calls the environment shader of a material Phenomenon.
miBoolean mi_call_volume_material( miColor *result, miState *state);
Call the volume shader in
state→material
.
This works both for standard materials and Phenomenon materials. It calls the volume shader of a material Phenomenon.
miBoolean mi_call_photonvol_material( miColor *result, miState *state);
Call the photonvol shader in state→material
.
This works both for standard materials and Phenomenon materials. It calls the photonvol shader of a material Phenomenon.
miBoolean mi_call_contour_material( miContour_endpoint *result, void *info_near, void *info_far, miState *state);
Call the contour shader in
state→material
.
This works both for standard materials and Phenomenon materials. It calls the contour shader of a material Phenomenon. mi_call_contour_material may only be called in contour mode, with a contour shader as parent of a shade tree. info_near and info_far must be passed from a parent contour shader. The contour contrast shader, the contour storage shader, and the contour shader itself must use matching info_near and info_far values. The info structures must have the same size and layout.
void *mi_eval( miState *state, void *param) miBoolean *mi_eval_boolean( miBoolean *param) miColor *mi_eval_color( miColor *param) miInteger *mi_eval_integer( miInteger *param) miScalar *mi_eval_scalar( miScalar *param) miScalar *mi_eval_transform( miScalar *param) miVector *mi_eval_vector( miVector *param) miTag *mi_eval_tag( miTag *param)
Return the value of a shader parameter.
If the shader parameter value is a constant, then mi_eval returns its argument. If the parameter is assigned to another shader, call that shader if needed and return a pointer to its return value. If the parameter is assigned to a Phenomenon interface, return a pointer to the value in the interface. The latter two cases let shaders operate in the contexts of shader assignments and phenomena without needing knowledge of the context, which is automatically handled. The pointer remains valid until the shader returns, which avoids the need to copy a large returned data structure such as a color or array to temporary variables. Shaders should always access their parameters with mi_eval. If parameters are accessed directly and the parameter is assigned to another shader or an interface, the shader will see garbage.
The typed variants of mi_eval are
convenient macros for shader writers to avoid explicit type casting.
They all make the assumption that the shader has a local variable state
of type miState* in scope. These typed variants make shader
source code look much cleaner. Note, that there is only one macro
mi_eval_tag that can be used for
parameters of type shader
, color texture
,
vector texture
, scalar texture
, light
,
material
, and geometry
. All typed variants have been
designed to return the same type they accept as an argument.
Always use the correct simple type. For example, if the parameter has type
color
, it must be evaluated as a single color using
mi_eval_color. It is not possible to use four scalar evaluations to
access the R, G, B, and A components separately. Also, by convention, arrays
should be evaluated as a unit, evaluating two integers for the i_
index, the n_ member count, and the array itself. However, structures
are not evaluated as a unit; a separate evaluation is necessary for every
simple member it contains.
Note, for performance reasons, the return value of a shader call or a phenomenon evaluation will be stored internally in a cache. The cached value will be returned from subsequent mi_eval calls on the same parameter of a shader during the current evaluation of the shading graph. Shaders which need to enforce a complete re-computation of a connected shader graph, for example to sample a texture shader at different texture coordinates set in the state, should use the corresponding mi_call functions.
void *mi_call( miState *state, void *param) miBoolean *mi_call_boolean( miBoolean *param) miColor *mi_call_color( miColor *param) miInteger *mi_call_integer( miInteger *param) miScalar *mi_call_scalar( miScalar *param) miScalar *mi_call_transform( miScalar *param) miVector *mi_call_vector( miVector *param) miTag *mi_call_tag( miTag *param)
Return the value of a shader parameter.
These functions are equivalent to mi_eval family of functions, but do not utilize the caching mechanism. If a shader calls this function on a parameter which is connected, then all shaders in the sub-shader chain (only) will be forced to re-compute and the result value will be returned. The original shader result cache is not affected nor destroyed by these functions, meaning, that any previous or following mi_eval call on the same parameter will use the original cache. These functions are intended for multiple evaluation of same shader parameter with temporary modifications to state variables, such as normal or texture coordinates for bump mapping.
Note, this is a performance critical operation, and these functions should be used with care, only in cases where shader result caching is explicitly not wanted. They are intended to be used as replacement for the mi_flush_cache function, since they allow to write advanced shaders with a more predictable performance impact.
void mi_flush_cache( miState *state)
Deprecated Invalidates the shader result cache from being used by future calls to mi_eval.
Future implementations should use the mi_call family of functions. since they offer a more predictable way to re-evaluate dedicated sub-shader graphs which are attached to a certain parameter.
If mi_eval calls another shader, the result value is stored in a cache, which is normally flushed only when the entire shader graph returns. This means that the other shader will only ever be called once during the evaluation of a shader graph, and all mi_evals are satisfied from the cache. Note, that flushing applies to the entire sub-graph of shaders evaluated by subsequent mi_evals; there is no way to flush the cache of individual shaders because that would leave their sub-shaders in a funny state. The result cache is still active for the shader which calls mi_flush_cache.
This is useful if the code calls a another shader more than once, such as a texture shader to sample a texture at different locations to compute bump mapping gradients. Even if a shader itself, if called with mi_call_shader or mi_lookup_color_texture, will get called each time again, its sub-shaders inside the same Phenomenon will not if these subshaders are called as the result of mi_eval (since those results are cached). However, if mi_flush_cache is used before the second and every subsequent shader call, the called shader's mi_eval calls will cause a fresh subshader call.
Copyright © 1986-2008 by mental images GmbH