Spec-Zone.ru › Qt 5.13

Класс QSGMaterialShader

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

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

QSGSimpleMaterialShader

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

Публичные типы

класс 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.

Классы 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.13/qsgmaterialshader.html

Spec-Zone.ru

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