Spec-Zone.ru › Qt 5.9

Класс QSGMaterialShader

Класс QSGMaterialShader представляет программу шейдеров OpenGL в рендере. Подробнее...

Заголовок: #include <QSGMaterialShader>
qmake: QT += quick
Наследуется от:

QSGSimpleMaterialShader

  • Список всех членов, включая наследуемые члены

Открытые типы

класс RenderState

Открытые функции

QSGMaterialShader()
virtual void activate()
virtual char const * const * attributeNames() const = 0
virtual void deactivate()
QOpenGLShaderProgram * program()
virtual void updateState(const RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial)

Защищенные функции

virtual void compile()
virtual const char * fragmentShader() const
virtual void initialize()
void setShaderSourceFile(QOpenGLShader::ShaderType type, const QString &sourceFile)
void setShaderSourceFiles(QOpenGLShader::ShaderType type, const QStringList &sourceFiles)
virtual 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() возвращает имена атрибутов, используемых в вершинном шейдере. Они используются в реализации по умолчанию функций 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] char const * 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 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.9/qsgmaterialshader.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API