Класс QSGMaterialShader
Класс QSGMaterialShader представляет программу шейдеров OpenGL в отрисовщике. Подробнее...
| Заголовок: | #include <QSGMaterialShader> |
| qmake: | QT += quick |
| Наследуется от: |
Типы публичного доступа
| класс | RenderState |
Функции публичного доступа
| QSGMaterialShader() | |
| виртуальный void | activate() |
| виртуальный const char *const * | attributeNames() const = 0 |
| виртуальный void | deactivate() |
| QOpenGLShaderProgram * | program() |
| виртуальный void | updateState(const QSGMaterialShader::RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) |
Защищенные функции
| виртуальный void | compile() |
| виртуальный const char * | fragmentShader() const |
| виртуальный void | initialize() |
| void | setShaderSourceFile(QOpenGLShader::ShaderType type, const QString &sourceFile) |
| void | setShaderSourceFiles(QOpenGLShader::ShaderType type, const QStringList &sourceFiles) |
| виртуальный const char * | vertexShader() const |
Подробное описание
API QSGMaterialShader относительно низкоуровневый. Более удобный API, который предоставляет почти все те же функции, доступен через QSGSimpleMaterialShader.
Предупреждение: Этот класс функционален только при работе с устаревённым рендерером OpenGL в графической системе Qt Quick.
Классы QSGMaterial и QSGMaterialShader образуют тесную связь. Для одной графической сцены (включая вложенные сцены) существует один уникальный экземпляр QSGMaterialShader, который инкапсулирует QOpenGLShaderProgram, используемый графической системой для отрисовки этого материала, например, шейдер для плоского заполнения геометрии. Каждый QSGGeometryNode может иметь уникальный QSGMaterial, содержащий информацию о том, как шейдер должен быть настроен при отрисовке узла, например, фактический цвет, используемый для отрисовки геометрии.
Экземпляр QSGMaterialShader никогда не создается явно пользователем, он создаётся по мере необходимости графической системой через QSGMaterial::createShader(). Графическая система обеспечит, что существует только один экземпляр каждого класса-шейдера через графическую систему.
Исходный код, возвращаемый функцией vertexShader(), используется для управления тем, что материал делает с данными вершин, поступающими из геометрии. Исходный код, возвращаемый функцией fragmentShader(), используется для управления тем, как материал должен заполнять каждый отдельный пиксель в геометрии. Исходный код вершинного и фрагментного шейдеров запрашивается один раз во время инициализации; изменение возвращаемого значения этих функций впоследствии не повлияет на результат.
Функция activate() вызывается графическим узлом (scene graph) при начале использования шейдера. Функция deactivate вызывается графическим узлом, когда шейдер больше не используется. Во время активности графический узел может вызвать одну или несколько функций updateState(), которая обновит состояние шейдера для каждой отдельной геометрии для рендеринга.
Функция attributeNames() возвращает имена атрибутов, используемых в шейдере вершин vertexShader(). Они используются в реализации по умолчанию для activate() и deactivate() для определения, какие регистры вершин включены.
Функция initialize() вызывается во время создания программы, чтобы позволить подклассам подготовиться к использованию, например, для разрешения имен униформ в шейдере вершин vertexShader() и шейдере фрагментов fragmentShader().
Пример минимальной реализации:
class Shader : public QSGMaterialShader
{
public:
const char *vertexShader() const {
return
"attribute highp vec4 vertex; \n"
"uniform highp mat4 matrix; \n"
"void main() { \n"
" gl_Position = matrix * vertex; \n"
"}";
}
const char *fragmentShader() const {
return
"uniform lowp float opacity; \n"
"void main() { \n"
" gl_FragColor = vec4(1, 0, 0, 1) * opacity; \n"
"}";
}
char const *const *attributeNames() const
{
static char const *const names[] = { "vertex", 0 };
return names;
}
void initialize()
{
QSGMaterialShader::initialize();
m_id_matrix = program()->uniformLocation("matrix");
m_id_opacity = program()->uniformLocation("opacity");
}
void updateState(const RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial)
{
Q_ASSERT(program()->isLinked());
if (state.isMatrixDirty())
program()->setUniformValue(m_id_matrix, state.combinedMatrix());
if (state.isOpacityDirty())
program()->setUniformValue(m_id_opacity, state.opacity());
}
private:
int m_id_matrix;
int m_id_opacity;
}; Примечание: Все классы с префиксом QSG должны использоваться только в потоке рендеринга графического узла. Подробнее см. Графический узел и рендеринг.
Документация по функциям-членам
QSGMaterialShader::QSGMaterialShader()
Создаёт новый QSGMaterialShader.
[virtual] void QSGMaterialShader::activate()
Эта функция вызывается графическим узлом для указания того, что геометрия собирается быть отрисована с помощью этого шейдера.
Состояние, которое является глобальным для всех применений шейдера, независимо от геометрии, которая отображается, может быть установлено в этой функции.
[pure virtual] const char *const *QSGMaterialShader::attributeNames() const
Возвращает массив с нулевым завершением, описывающий имена атрибутов, используемых в шейдере вершин.
Эта функция вызывается при компиляции шейдера для указания, какие атрибуты существуют. Порядок имён атрибутов определяет позицию регистра атрибута в шейдере вершин.
[virtual protected] void QSGMaterialShader::compile()
Эта функция вызывается при инициализации шейдера для компиляции фактического QOpenGLShaderProgram. Не вызывайте её явно.
Реализация по умолчанию извлечёт vertexShader() и fragmentShader() и свяжет имена, возвращённые из attributeNames(), с последовательными регистрами атрибутов вершин, начиная с 0.
[virtual] void QSGMaterialShader::deactivate()
Эта функция вызывается графическим узлом для указания того, что геометрия больше не будет рендериться с помощью этого шейдера.
[virtual protected] const char *QSGMaterialShader::fragmentShader() const
Вызывается при инициализации шейдера для получения исходного кода шейдера фрагментов.
Содержание, возвращённое этой функцией, никогда не должно изменяться.
[virtual protected] void QSGMaterialShader::initialize()
Переопределите эту функцию, чтобы выполнить однократную инициализацию при компиляции программы шейдера. Программа шейдера OpenGL компилируется и связывается, но не привязывается, когда вызывается эта функция.
QOpenGLShaderProgram *QSGMaterialShader::program()
Возвращает программу шейдера, используемую этим QSGMaterialShader.
[protected] void QSGMaterialShader::setShaderSourceFile(QOpenGLShader::ShaderType type, const QString &sourceFile)
Устанавливает файл исходного кода GLSL для стадии шейдера type на sourceFile. Реализация по умолчанию для функций vertexShader() и fragmentShader() загрузит файлы исходного кода, установленные этой функцией.
Эта функция полезна, когда у вас один файл исходного кода для данной стадии шейдера. Если ваш шейдер состоит из нескольких файлов исходного кода, используйте setShaderSourceFiles()
См. также setShaderSourceFiles(), vertexShader() и fragmentShader().
[protected] void QSGMaterialShader::setShaderSourceFiles(QOpenGLShader::ShaderType type, const QStringList &sourceFiles)
Устанавливает файлы исходного кода GLSL для стадии шейдера type в sourceFiles. По умолчанию реализация функций vertexShader() и fragmentShader() будет загружать файлы исходного кода, установленные этой функцией, в заданном порядке.
См. также setShaderSourceFile(), vertexShader() и fragmentShader().
[virtual] void QSGMaterialShader::updateState(const QSGMaterialShader::RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial)
Эта функция вызывается графическим деревом перед отрисовкой геометрии, чтобы убедиться, что шейдер находится в нужном состоянии.
Текущее состояние отрисовки state передается из графического дерева. Если состояние указывает, что какое-либо состояние изменено, реализация updateState должна соответствующим образом обновить его, чтобы геометрия отрисовывалась правильно.
Состояние, специфичное для подкласса, например, цвет однотонного материала, должно извлекаться из newMaterial для соответствующего обновления цветовых униформ.
oldMaterial можно использовать для минимизации изменений состояния при обновлении состояния материала. oldMaterial равен 0, если этот шейдер только что был активирован.
См. также activate() и deactivate().
[virtual protected] const char *QSGMaterialShader::vertexShader() const
Вызывается при инициализации шейдера для получения исходного кода вершинного шейдера.
Содержимое, возвращаемое этой функцией, никогда не должно меняться.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.15/qsgmaterialshader.html