Spec-Zone.ru › Qt 5.6

Класс 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() возвращает имена атрибутов, используемых в 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] 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/archives/qt-5.6/qsgmaterialshader.html

Spec-Zone.ru

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