Класс 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/archives/qt-5.11/qsgmaterialshader.html