Начал изучать программирование шейдеров в ментале. Вот, в результате
визуализации всяких внутренних состояний ментала, получилась такая
красивая картинка.
Ну я делаю по книжке(http://ebookee.org/Writing-mental-ray-Shaders-A-Perceptual-Introduction_1088105.html), поэтому пока не секретно )). Код я не сохранил, т.к. это был просто эксперимент на базе другого шейдера и практической ценности я для себя не нашёл в нём, тем более я не очень понимаю что он делает. Вот шейдер, на базе которого я его делал я могу показать. Этот шейдер отображает нормали, судя по моим тестам, в мировых координатах. Чтоб получить то что у меня на картинке, нужно в одном месте вместо &state->normal написать &state->point. Кстати я не очень понял что делает этот intersection point, т.к. если изменить положение объекта или повернуть, он будет другим цветом отображаться, т.е. видимо сохранит какие-то локальные данные о себе. Чтоб было всё таким однородным, надо делать Reset XForm. Ну и сам шейдер.
#include "shader.h" #include "math.h"
struct Normals_as_color { miColor color; };
extern "C" { DLLEXPORT int TM_Normals_as_color_version(void) { return (1); }
DLLEXPORT miBoolean TM_Normals_as_color ( miColor *result, miState *state, struct Normals_as_color *params ) { miVector normal; mi_vector_to_object (state, &normal, &state->normal); // Только здесь вместо &state->normal стоит &state->point mi_vector_normalize (&normal);
хочется больше подробностей.
ОтветитьУдалитьопубликуйте код, если не секретно.
Ну я делаю по книжке(http://ebookee.org/Writing-mental-ray-Shaders-A-Perceptual-Introduction_1088105.html), поэтому пока не секретно )). Код я не сохранил, т.к. это был просто эксперимент на базе другого шейдера и практической ценности я для себя не нашёл в нём, тем более я не очень понимаю что он делает. Вот шейдер, на базе которого я его делал я могу показать. Этот шейдер отображает нормали, судя по моим тестам, в мировых координатах. Чтоб получить то что у меня на картинке, нужно в одном месте вместо &state->normal написать &state->point. Кстати я не очень понял что делает этот intersection point, т.к. если изменить положение объекта или повернуть, он будет другим цветом отображаться, т.е. видимо сохранит какие-то локальные данные о себе. Чтоб было всё таким однородным, надо делать Reset XForm. Ну и сам шейдер.
ОтветитьУдалить#include "shader.h"
#include "math.h"
struct Normals_as_color
{
miColor color;
};
extern "C"
{
DLLEXPORT int TM_Normals_as_color_version(void)
{
return (1);
}
DLLEXPORT miBoolean TM_Normals_as_color (
miColor *result, miState *state, struct Normals_as_color *params )
{
miVector normal;
mi_vector_to_object (state, &normal, &state->normal); // Только здесь вместо &state->normal стоит &state->point
mi_vector_normalize (&normal);
result->r = normal.x / 2.0 + 0.5;
result->g = normal.y / 2.0 + 0.5;
result->b = normal.z / 2.0 + 0.5;
result->a = 1.0;
return miTRUE;
}
}