Класс 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 |
Подробное описание
Класс QSGMaterialShader представляет программу шейдеров OpenGL в отрисовщике.
API QSGMaterialShader очень низкого уровня. Более удобный API, предоставляющий почти те же функции, доступен через QSGSimpleMaterialShader.
Классы QSGMaterial и QSGMaterialShader тесно связаны. Для одной сцены (включая вложенные сцены) существует один уникальный экземпляр QSGMaterialShader, который инкапсулирует QOpenGLShaderProgram, используемый этой сценой для отрисовки материала, например, шейдер для плоской заливки геометрии. Каждый QSGGeometryNode может иметь уникальный QSGMaterial, содержащий информацию о том, как настроить шейдер при отрисовке данного узла, например, фактический цвет, используемый для отрисовки геометрии.
Экземпляр QSGMaterialShader никогда не создается явно пользователем; он создается по требованию сценой через QSGMaterial::createShader(). Сцена позаботится о том, чтобы существовал только один экземпляр каждой реализации шейдера в рамках сцены.
Исходный код, возвращаемый функцией vertexShader(), используется для управления тем, что материал делает с данными вершин, поступающими от геометрии. Исходный код, возвращаемый функцией fragmentShader(), используется для управления тем, как материал должен заполнять каждый отдельный пиксель в геометрии. Исходный код вершинного и фрагментного шейдеров запрашивается один раз во время инициализации; изменение возвращаемых значений этих функций позже не повлияет на поведение.
Функция activate() вызывается сценой, когда шейдер начинает использоваться. Функция 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.12/qsgmaterialshader.html