Движок C3D Vision управляет отображением 3D-текстур «на лету» / Хабр

Движок C3D Vision управляет отображением 3D-текстур «на лету» / Хабр 3d печать
c3d, visualization, текстуры, шейдеры, шейдер, геометрическое ядро, 3d-графика

Движок C3D Vision управляет отображением 3D-текстур «на лету»

Движок визуализации C3D vision imaging engine был обновлен новыми функциями. Пользователи получили возможность создавать трехмерные текстуры и отображения и отображать их на сцене. Этот материал описывает объекты Vision API, которые работают непосредственно с текстурами, и показывает, как пользователи могут взаимодействовать с этими объектами на уровне кода.

Что нового в API Vision?

С новой функциональностью пользователи могут не только использовать трехмерные текстуры, и управлять атрибутируя их; для этих целей в Vision API предназначены два класса, Texture3D и RenderPostProcess. Давайте рассмотрим эти классы подробнее.

Texture3D является типичным классом C++ и используется для обработки 3D-текстур. Для внутренней работы Vision необходимо создать объект этого класса и инициализировать его данными текстуры. Такими данными может быть растровая карта текстуры или файл изображения. Другие свойства класса включают ширину, высоту, глубину загруженной текстуры, управление альфа-каналом, возможность установки крепежа и возможность получения функций итерации текстуры.

Класс Texture3d< public: /// \ru Конструктор по умолчанию. \en Default constructor. \~texture3d ();/// Copy maker. \ en copy maker. \ en производитель копий.~texture3d (const texture3d &amp; other) = delete;/// \ en Деструктор.~Виртуальный.~Texture3D(); >

RenderPostProcess также является типичным классом, который может выполнять финальную постобработку сцены. Входным параметром, создающим объект этого класса, является строковый поток, содержащий программный код, который должен быть выполнен процессором видеокарты (шейдер).RenderPostProcess вызывается после основной сцены и текстурирует экран изображением координаты пользователя при его выполнении. Такой подход позволяет пользователю создавать свои собственные текстурные управлять параметрами отображения текстуры во время полета. Кроме того, RenderPostProcesses включает матрицу со строковым параметром name и способ добавления объектов текстуры; Shadower необходим доступ к этим элементам при выполнении текстур.

Класс renderpostprocess< public: /// \ru Конструктор. \en Constructor. \~Explicit renderpostprocess (std :: istream &amp; pixelshader);/// \ ru maker. \ en constructor.}~Explicit renderpostprocess (std :: istream &amp; vertexhader, std :: istream &amp; pixelshader);/// \ en Destructor.~ ~RenderPostProcess(); >

Пример использования новых классов

Среди примеров, предоставляемых дистрибутивом C3D Vision, есть проект 10_Texture3D. Он демонстрирует использование 3D-текстуры в тестовом приложении для визуализации распределения теплового излучения в пространстве при нагреве частей материнской платы в замкнутом контуре. Давайте рассмотрим этот пример подробнее.

Первое, что необходимо сделать, — это открыть и создать модель в сцене, к которой приписывается текстура.

Движок C3D Vision управляет отображением 3D-текстур «на лету» / Хабр

Далее нам нужно создать std stringflow :: StringsTream PixelShader и передать GLSL-описание тени как переменную ShaderSRC.

std :: stringstream pixelshader (shadersrc); renderpostprocess* ppostprocess = new renderpostprocess (pixelshader),

Шейдеры могут храниться в таких переменных.

static const char shaderSrc[] = "#version 110\n" "varying vec2 VSN_TEXCOORD;" "uniform sampler2D VSN_SCENE_COLOR_TEXTURE;" "uniform sampler2D VSN_SCENE_DEPTH_TEXTURE;" "uniform mat4 VSN_INV_VIEW_PROJECTION;" "uniform sampler3D ValueTexture;" "uniform sampler1D CoverTexture;" "uniform mat4 WorldToTexture;" "vec3 ToWorld(vec2 texCoord, float depth)" "" " return position.xyz / position.w;" ">" "void main(void)" "" " vec4 colorTex = texture2D(VSN_SCENE_COLOR_TEXTURE, VSN_TEXCOORD);" " gl_FragColor = vec4(mix(colorTex.rgb, accum.rgb, accum.a / (colorTex.a + accum.a)), max(colorTex.a, accum.a));" ">";

Затем создается класс Texture3D и инициализируется в функции LoadTexture3D.

matrix3df transform- texture3d* tex3d = loadtexture3d (transform),

Эта функция использует объект Flow для чтения данных из файла текстуры fv_texture3d.dat. Полученные данные используются для инициализации вектора текстурных данных STD::vector TexData.

static texture3d* loadtexture3d (matrix3df &amp; conversion)< QFile file(":/fv_texture3d.dat"); QDataStream dataStream(fileData); // размер x-y-z сетки uint32_t sizeX, sizeY, sizeZ; dataStream >> sizeX; dataStream >> sizeY; dataStream >> sizeZ; // положение бокса Vector3DF origin; dataStream >> origin.x; dataStream >> origin.y; dataStream >>Origin: Z;// ось кадра vector3df axis[3]; for (int i = 0; i< 3; i++) < dataStream >> axis[i].x; dataStream >> axis[i].y; dataStream >> axis[i].z; >преобразование =.< axis[0].x, axis[0].y, axis[0].z, 0.0f, axis[1].x, axis[1].y, axis[1].z, 0.0f, axis[2].x, axis[2].y, axis[2].z, 0.0f, origin.x, origin.y, origin.z, 1.0f >;// z-y-y-auto линейная цена таблица размеров = sizex * sizey * sizez; std :: vector values (size); datastream: readRawdata (reinterpret_cast (values. data()), static_cast ()) values. size() * sizeof(float)); const size_t bgra = 4; auto count = sizex * sizey * bgra; std :: vector texdata; for (uint32_t z = 0; z< sizeZ; z++) < unsigned char* slice = new unsigned char[count]; for (uint32_t y = 0; y < sizeY; y++) < for (uint32_t x = 0; x < sizeX; x++) < int value_index = z + sizeZ * y + sizeY * sizeZ * x; float value = values[value_index]; auto sliceNum = (y * sizeX + x) * bgra; slice[sliceNum + 0] = 255; slice[sliceNum + 1] = 255; slice[sliceNum + 2] = 255; slice[sliceNum + 3] = 0; // 0 - отсутствие данных if (value != 0.0f) slice[sliceNum + 3] = value * 255; >> texData.push_back(slice); >

После завершения инициализации создается объект текстуры, а в качестве параметров передаются размер текстуры и данные текстуры. Если текстура превышает предел, также определяются режимы Rastic Filters и Repeat.

 auto texture3D = new Texture3D(); texture3D->Init(TextureFormat::BGRA, SizeI(sizeX, sizeY), texData); texture3D->SetFilters(TextureFilter::Linear, TextureFilter::Linear); texture3D->SetWrap(TextureWrap::NoRepeate, TextureWrap::NoRepeate, TextureWrap::NoRepeate); return texture3D; >

Добавьте полученный объект и его имя в RenderPostProcess* pPostProcess.

pPostProcess->AddTexture("ValueTexture", tex3d); pPostProcess->addmatrix("worldtotexture", transform.div()),

Добавьте палитру цветов для раскрашивания распределения.

ColorsArray* paletteColors = new ColorsArray< , , , , , , , , , , >; pPostProcess->addTexture ("CoverTexture", paletteColors),

Затем определите постобработку в сцене.

graphicsScene()->SetPostProcess (pPostProcess),

Ниже показано, как будет выглядеть сцена после выполнения всех команд.

Движок C3D Vision управляет отображением 3D-текстур «на лету» / Хабр

Мы продолжаем активно развивать видение C3D, разрабатывая новые методы и классы, чтобы сделать его проще и быстрее. Все это возможно не только для анализа текущих потребностей автоматизированных систем, но и для активных пользователей, например, в США, которые пытаются улучшить качество своих устройств визуализации.

Движок C3D Vision управляет отображением 3D-текстур «на лету» / Хабр

Артем Максименко

Менеджер по продуктам C3D Labs

Оцените статью