В Qt я думаю, что они используют «материалы» в качестве абстракции своих предопределенных шейдеров.Вы создаете материал, такой как QPhongMaterial, для которого вы хотите визуализировать сущность, и задаете вещи для этого материала, которые будут передаваться в качестве аргументов шейдеру (униформы), такие как окружающий, зеркальный и рассеянный цвет освещения.
Поэтому вам нужен шейдер, который будет поддерживать цвета вершин для вашей модели.Таким образом, каждая вершина вашей модели будет иметь связанный с ней цвет, и эти значения передаются вершинному шейдеру и передаются фрагментному шейдеру.Это довольно просто сделать с OpenGL, но вы используете Qt3D, поэтому может быть проще использовать уже существующую инфраструктуру.
В Qt3D уже есть некоторые классы материалов, которые вы можете использовать для создания некоторых из этих шейдеров, чтобыприменить к вашей организации.Вместо этого вы можете попробовать использовать QPerVertexColorMaterial.
https://doc.qt.io/qt-5/qt3dextras-qpervertexcolormaterial.html
Qt3DExtras :: QPerVertexColorMaterial Реализация по умолчанию для отображения свойств цвета, установленных для каждой вершины
Очевидно, вам потребуется предоставить списокцветов вершин, чтобы по-разному раскрасить части модели.В дополнение к этому вам нужно будет предоставить цвета вершин для каждой вершины, даже если вы хотите покрасить каждую вершину треугольника в один и тот же цвет (цвета лица).
В качестве альтернативы вы можете создать свой собственный шейдер и передать его Qt3D для привязки к конвейеру: (из форума)
Qt3D не генерирует шейдеры во время выполнения.Для конвейера по умолчанию он поставляется с предопределенными шейдерами по умолчанию.Но вы можете изменять конвейер по своему усмотрению (в C ++, а также в QML) и использовать свои собственные шейдеры.
Для пользовательских материалов следующий пример выглядит многообещающим: https://doc.qt.io/qt-5/qt3d-simplecustommaterial-example.html
А для информации о шейдерах Qt3D: https://doc.qt.io/qt-5/qml-qt3d-render-shaderprogram.html
Класс ShaderProgram инкапсулирует шейдерную программу.Программа шейдеров состоит из нескольких различных шейдеров, таких как вершинные и фрагментные шейдеры.Qt3D автоматически заполняет набор униформ по умолчанию, если они встречаются на этапе интроспекции шейдера.
Если вы никогда не писали шейдер в GLSL и не скомпилировали его в программе OpenGL, вам может понадобиться сначалачтобы быстро понять, как это сделать, вам нужно понять, какие части играют все вершинные, геометрические и фрагментные шейдеры, а также роль атрибутов и униформ.Я полагаю, что вы все еще можете выполнить работу без этого, но я бы подумал, что это будет значительно сложнее
На шейдерах есть страницы и страницы, но ненадолго ...
Шейдер обычно состоит из трех частей;вершинный шейдер, геометрический шейдер и фрагментный шейдер, они написаны с использованием GLSL и обычно сохраняются в виде трех файлов.Как минимум, для компиляции шейдера вам понадобится источник вершинного шейдера и источник фрагментного шейдера.
Обычно людям нравится сохранять эти файлы с соответствующим расширением, например .frag, .vert или .vs / .fs, нов конечном итоге это просто текстовые файлы.Чтобы скомпилировать шейдер и связать его с конвейером рендеринга, вам нужно загрузить исходный код из соответствующих файлов и связать их для создания вашей шейдерной программы, которую вы затем сможете использовать, привязав его к конвейеру рендеринга и отрисовав вашу геометрию.У Lazy Foo есть замечательный учебник о том, как это сделать в OpenGL: http://lazyfoo.net/tutorials/SDL/51_SDL_and_modern_opengl/index.php
Если бы вы просто использовали OpenGL, вы сначала написали бы вершинный шейдер, а затем фрагментный шейдер с правильными входами / выходами для рендеринга геометрии.с вершинными цветами, вы бы прошли через этот процесс, чтобы создать свою шейдерную программу.
Что касается самой реализации шейдера, вот быстрая реализация того, как будет выглядеть ваш вершинный и фрагментный шейдер:
Вершинный шейдер (Color.vs)
#version 330
in vec3 position;
in vec4 vertexColor;
uniform mat4 WORLD_VIEW_PROJECTION_MATRIX;
out vec4 fragColor;
void main()
{
fragColor.x = vertexColor.x;
fragColor.y = vertexColor.y;
fragColor.z = vertexColor.z;
fragColor.w = vertexColor.w; //alpha
gl_Position = WORLD_VIEW_PROJECTION_MATRIX * vec4( position, 1 );
}
Фрагментный шейдер (Color.fs)
#version 330
out vec4 LFragment;
in vec4 fragColor;
void main()
{
LFragment = fragColor;
}