воскресенье, 16 декабря 2012 г.

The ray's intersection point.

Начал изучать программирование шейдеров в ментале. Вот, в результате визуализации всяких внутренних состояний ментала, получилась такая красивая картинка.







2 комментария:

  1. хочется больше подробностей.
    опубликуйте код, если не секретно.

    ОтветитьУдалить
  2. Ну я делаю по книжке(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;
    }
    }


    ОтветитьУдалить