QShaderDescription Class

描述着色器的界面。更多

头文件: #include <QShaderDescription>
CMake: find_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmake: QT += gui
Qt 6.6

公共类型

(since 6.6) struct BlockVariable
(since 6.6) struct BuiltinVariable
(since 6.6) struct InOutVariable
(since 6.6) struct PushConstantBlock
(since 6.6) struct StorageBlock
(since 6.6) struct UniformBlock
enum BuiltinType { PositionBuiltin, PointSizeBuiltin, ClipDistanceBuiltin, CullDistanceBuiltin, VertexIdBuiltin, …, InstanceIndexBuiltin }
enum ImageFlag { ReadOnlyImage, WriteOnlyImage }
flags ImageFlags
enum ImageFormat { ImageFormatUnknown, ImageFormatRgba32f, ImageFormatRgba16f, ImageFormatR32f, ImageFormatRgba8, …, ImageFormatR8ui }
enum QualifierFlag { QualifierReadOnly, QualifierWriteOnly, QualifierCoherent, QualifierVolatile, QualifierRestrict }
flags QualifierFlags
enum TessellationMode { UnknownTessellationMode, TrianglesTessellationMode, QuadTessellationMode, IsolineTessellationMode }
enum TessellationPartitioning { UnknownTessellationPartitioning, EqualTessellationPartitioning, FractionalEvenTessellationPartitioning, FractionalOddTessellationPartitioning }
enum TessellationWindingOrder { UnknownTessellationWindingOrder, CwTessellationWindingOrder, CcwTessellationWindingOrder }
enum VariableType { Unknown, Float, Vec2, Vec3, Vec4, …, Half4 }

公共函数

QShaderDescription()
QShaderDescription(const QShaderDescription &other)
~QShaderDescription()
QList<QShaderDescription::InOutVariable> combinedImageSamplers() const
std::array<uint, 3> computeShaderLocalSize() const
QList<QShaderDescription::BuiltinVariable> inputBuiltinVariables() const
QList<QShaderDescription::InOutVariable> inputVariables() const
bool isValid() const
QList<QShaderDescription::BuiltinVariable> outputBuiltinVariables() const
QList<QShaderDescription::InOutVariable> outputVariables() const
QList<QShaderDescription::PushConstantBlock> pushConstantBlocks() const
void serialize(QDataStream *stream, int version) const
QList<QShaderDescription::StorageBlock> storageBlocks() const
QList<QShaderDescription::InOutVariable> storageImages() const
QShaderDescription::TessellationMode tessellationMode() const
uint tessellationOutputVertexCount() const
QShaderDescription::TessellationPartitioning tessellationPartitioning() const
QShaderDescription::TessellationWindingOrder tessellationWindingOrder() const
QByteArray toJson() const
QList<QShaderDescription::UniformBlock> uniformBlocks() const
QShaderDescription &operator=(const QShaderDescription &other)

静态公共成员

QShaderDescription deserialize(QDataStream *stream, int version)
bool operator==(const QShaderDescription &lhs, const QShaderDescription &rhs)

详细描述

警告: Qt GUI 模块中的QRhi 系列类(包括QShader 和 QShaderDescription)提供有限的兼容性保证。这些类没有源代码或二进制兼容性保证,这意味着 API 只能保证与应用程序开发时所使用的 Qt 版本兼容。不过,源代码不兼容的更改将保持在最低水平,并且只会在次版本(6.7、6.8 等)中进行。要在应用程序中使用这些类,请链接到Qt::GuiPrivate (如果使用 CMake),并包含带有rhi 前缀的头文件,例如#include <rhi/qshaderdescription.h>

着色器通常有一组输入和输出。例如,顶点着色器有许多输入变量,并可能使用一个或多个统一缓冲区来访问应用程序提供的数据(如模型视图矩阵)。片段阶段的着色器从顶点阶段接收数据(在简单设置中),也可能依赖于来自统一缓冲区、图像和采样器的数据。

当涉及顶点输入和统一缓冲区的布局(成员的名称、大小、偏移量等)时,应用程序和框架可能需要在运行时动态发现。当着色器不是内置的,而是由用户等外部实体提供时,这种情况就比较典型。

现代精益图形应用程序接口可能不再提供在运行时查询着色器反射信息的方法。因此,这类数据现在由QShaderBaker 自动生成,并作为每个QShader 的 QShaderDescription 对象提供。

示例

以下面的顶点着色器为例:

#version 440

layout(location = 0) in vec4 position;
layout(location = 1) in vec3 color;
layout(location = 0) out vec3 v_color;

layout(std140, binding = 0) uniform buf {
    mat4 mvp;
    float opacity;
} ubuf;

void main()
{
    v_color = color;
    gl_Position = ubuf.mvp * position;
}

该着色器有两个输入:位置 0 的position (类型为vec4 )和位置 1 的color (类型为vec3 )。它有一个输出:v_color尽管这对应用来说通常并不重要。更重要的是,在绑定 0 处有一个大小为 68 字节的统一块,其中有两个成员,一个是偏移 0 处名为mvp 的 4x4 矩阵,另一个是偏移 64 处的浮点opacity

所有这些都由 QShaderDescription 对象描述。QShaderDescription 可以序列化为 JSON 格式,也可以通过QDataStream 序列化为二进制格式,还可以从二进制格式反序列化。实际上很少需要这样做,因为QShader 会自动处理相关的 QShaderDescription,但如果将上述 Shader 的 QShaderDescription 写成 JSON 格式(就像qsb 工具的-d 选项所做的那样),它看起来会如下所示:

{
    "inputs": [
        {
            "location": 1,
            "name": "color",
            "type": "vec3"
        },
        {
            "location": 0,
            "name": "position",
            "type": "vec4"
        }
    ],
    "outputs": [
        {
            "location": 0,
            "name": "v_color",
            "type": "vec3"
        }
    ],
    "uniformBlocks": [
        {
            "binding": 0,
            "blockName": "buf",
            "members": [
                {
                    "matrixStride": 16,
                    "name": "mvp",
                    "offset": 0,
                    "size": 64,
                    "type": "mat4"
                },
                {
                    "name": "opacity",
                    "offset": 64,
                    "size": 4,
                    "type": "float"
                }
            ],
            "set": 0,
            "size": 68,
            "structName": "ubuf"
        }
    ]
}

C++ API 允许访问类似上述的数据结构。为简单起见,内部结构只包含公共数据成员,同时考虑到其布局在未来不太可能发生变化。

另请参见 QShaderBakerQShader

成员类型文档

enum QShaderDescription::BuiltinType

内置变量类型。

常数
QShaderDescription::PositionBuiltin0
QShaderDescription::PointSizeBuiltin1
QShaderDescription::ClipDistanceBuiltin3
QShaderDescription::CullDistanceBuiltin4
QShaderDescription::VertexIdBuiltin5
QShaderDescription::InstanceIdBuiltin6
QShaderDescription::PrimitiveIdBuiltin7
QShaderDescription::InvocationIdBuiltin8
QShaderDescription::LayerBuiltin9
QShaderDescription::ViewportIndexBuiltin10
QShaderDescription::TessLevelOuterBuiltin11
QShaderDescription::TessLevelInnerBuiltin12
QShaderDescription::TessCoordBuiltin13
QShaderDescription::PatchVerticesBuiltin14
QShaderDescription::FragCoordBuiltin15
QShaderDescription::PointCoordBuiltin16
QShaderDescription::FrontFacingBuiltin17
QShaderDescription::SampleIdBuiltin18
QShaderDescription::SamplePositionBuiltin19
QShaderDescription::SampleMaskBuiltin20
QShaderDescription::FragDepthBuiltin22
QShaderDescription::NumWorkGroupsBuiltin24
QShaderDescription::WorkgroupSizeBuiltin25
QShaderDescription::WorkgroupIdBuiltin26
QShaderDescription::LocalInvocationIdBuiltin27
QShaderDescription::GlobalInvocationIdBuiltin28
QShaderDescription::LocalInvocationIndexBuiltin29
QShaderDescription::VertexIndexBuiltin42
QShaderDescription::InstanceIndexBuiltin43

枚举 QShaderDescription::ImageFlag
flags QShaderDescription::ImageFlags

图像标志。

常量
QShaderDescription::ReadOnlyImage1 << 0
QShaderDescription::WriteOnlyImage1 << 1

ImageFlags 类型是QFlags<ImageFlag> 的类型定义。它存储 ImageFlag 值的 OR 组合。

enum QShaderDescription::ImageFormat

图像格式。

常数
QShaderDescription::ImageFormatUnknown0
QShaderDescription::ImageFormatRgba32f1
QShaderDescription::ImageFormatRgba16f2
QShaderDescription::ImageFormatR32f3
QShaderDescription::ImageFormatRgba84
QShaderDescription::ImageFormatRgba8Snorm5
QShaderDescription::ImageFormatRg32f6
QShaderDescription::ImageFormatRg16f7
QShaderDescription::ImageFormatR11fG11fB10f8
QShaderDescription::ImageFormatR16f9
QShaderDescription::ImageFormatRgba1610
QShaderDescription::ImageFormatRgb10A211
QShaderDescription::ImageFormatRg1612
QShaderDescription::ImageFormatRg813
QShaderDescription::ImageFormatR1614
QShaderDescription::ImageFormatR815
QShaderDescription::ImageFormatRgba16Snorm16
QShaderDescription::ImageFormatRg16Snorm17
QShaderDescription::ImageFormatRg8Snorm18
QShaderDescription::ImageFormatR16Snorm19
QShaderDescription::ImageFormatR8Snorm20
QShaderDescription::ImageFormatRgba32i21
QShaderDescription::ImageFormatRgba16i22
QShaderDescription::ImageFormatRgba8i23
QShaderDescription::ImageFormatR32i24
QShaderDescription::ImageFormatRg32i25
QShaderDescription::ImageFormatRg16i26
QShaderDescription::ImageFormatRg8i27
QShaderDescription::ImageFormatR16i28
QShaderDescription::ImageFormatR8i29
QShaderDescription::ImageFormatRgba32ui30
QShaderDescription::ImageFormatRgba16ui31
QShaderDescription::ImageFormatRgba8ui32
QShaderDescription::ImageFormatR32ui33
QShaderDescription::ImageFormatRgb10a2ui34
QShaderDescription::ImageFormatRg32ui35
QShaderDescription::ImageFormatRg16ui36
QShaderDescription::ImageFormatRg8ui37
QShaderDescription::ImageFormatR16ui38
QShaderDescription::ImageFormatR8ui39

枚举 QShaderDescription::QualifierFlag
flags QShaderDescription::QualifierFlags

限定符标志。

常量
QShaderDescription::QualifierReadOnly1 << 0
QShaderDescription::QualifierWriteOnly1 << 1
QShaderDescription::QualifierCoherent1 << 2
QShaderDescription::QualifierVolatile1 << 3
QShaderDescription::QualifierRestrict1 << 4

QualifierFlags 类型是QFlags<QualifierFlag> 的类型定义。它存储 QualifierFlag 值的 OR 组合。

enum QShaderDescription::TessellationMode

常数数值
QShaderDescription::UnknownTessellationMode0
QShaderDescription::TrianglesTessellationMode1
QShaderDescription::QuadTessellationMode2
QShaderDescription::IsolineTessellationMode3

enum QShaderDescription::TessellationPartitioning

常数数值
QShaderDescription::UnknownTessellationPartitioning0
QShaderDescription::EqualTessellationPartitioning1
QShaderDescription::FractionalEvenTessellationPartitioning2
QShaderDescription::FractionalOddTessellationPartitioning3

enum QShaderDescription::TessellationWindingOrder

常数数值
QShaderDescription::UnknownTessellationWindingOrder0
QShaderDescription::CwTessellationWindingOrder1
QShaderDescription::CcwTessellationWindingOrder2

enum QShaderDescription::VariableType

代表变量或块成员的类型。

常量说明
QShaderDescription::Unknown0
QShaderDescription::Float1
QShaderDescription::Vec22
QShaderDescription::Vec33
QShaderDescription::Vec44
QShaderDescription::Mat25
QShaderDescription::Mat2x36
QShaderDescription::Mat2x47
QShaderDescription::Mat38
QShaderDescription::Mat3x29
QShaderDescription::Mat3x410
QShaderDescription::Mat411
QShaderDescription::Mat4x212
QShaderDescription::Mat4x313
QShaderDescription::Int14
QShaderDescription::Int215
QShaderDescription::Int316
QShaderDescription::Int417
QShaderDescription::Uint18
QShaderDescription::Uint219
QShaderDescription::Uint320
QShaderDescription::Uint421
QShaderDescription::Bool22
QShaderDescription::Bool223
QShaderDescription::Bool324
QShaderDescription::Bool425
QShaderDescription::Double26
QShaderDescription::Double227
QShaderDescription::Double328
QShaderDescription::Double429
QShaderDescription::DMat230
QShaderDescription::DMat2x331
QShaderDescription::DMat2x432
QShaderDescription::DMat333
QShaderDescription::DMat3x234
QShaderDescription::DMat3x435
QShaderDescription::DMat436
QShaderDescription::DMat4x237
QShaderDescription::DMat4x338
QShaderDescription::Sampler1D39
QShaderDescription::Sampler2D40
QShaderDescription::Sampler2DMS41
QShaderDescription::Sampler3D42
QShaderDescription::SamplerCube43
QShaderDescription::Sampler1DArray44
QShaderDescription::Sampler2DArray45
QShaderDescription::Sampler2DMSArray46
QShaderDescription::Sampler3DArray47
QShaderDescription::SamplerCubeArray48
QShaderDescription::SamplerRect49
QShaderDescription::SamplerBuffer50
QShaderDescription::SamplerExternalOES51
QShaderDescription::Sampler52用于独立采样器。
QShaderDescription::Image1D53
QShaderDescription::Image2D54
QShaderDescription::Image2DMS55
QShaderDescription::Image3D56
QShaderDescription::ImageCube57
QShaderDescription::Image1DArray58
QShaderDescription::Image2DArray59
QShaderDescription::Image2DMSArray60
QShaderDescription::Image3DArray61
QShaderDescription::ImageCubeArray62
QShaderDescription::ImageRect63
QShaderDescription::ImageBuffer64
QShaderDescription::Struct65
QShaderDescription::Half66
QShaderDescription::Half267
QShaderDescription::Half368
QShaderDescription::Half469

成员函数文档

QShaderDescription::QShaderDescription()

构造一个新的、空的 QShaderDescription。

注: 空意味着isValid() 会返回新建实例的false

QShaderDescription::QShaderDescription(const QShaderDescription &other)

构造other 的副本。

[noexcept] QShaderDescription::~QShaderDescription()

毁灭者

QList<QShaderDescription::InOutVariable> QShaderDescription::combinedImageSamplers() const

返回组合图像采样器列表

使用 GLSL/Vulkan 着色器作为源,layout(binding = 1) uniform sampler2D tex; uniform 会生成以下内容:(此处显示为文本 JSON)

"combinedImageSamplers": [
     {
         "binding": 1,
         "name": "tex",
         "set": 0,
         "type": "sampler2D"
     }
 ]

这并不意味着其他语言版本的着色器也必须使用组合图像采样器,尤其是考虑到这一概念可能并不普遍存在。例如,HLSL 版本很可能只使用分别带有寄存器 t1 和 s1 的 Texture2D 和 SamplerState 对象。

std::array<uint, 3> QShaderDescription::computeShaderLocalSize() const

返回计算着色器的局部大小。

例如,对于声明如下的计算着色器,函数返回 { 256, 16, 1}。

layout(local_size_x = 256, local_size_y = 16, local_size_z = 1) in;

[static] QShaderDescription QShaderDescription::deserialize(QDataStream *stream, int version)

返回从stream 加载的新QShaderDescriptionversion 指定 qsb 版本。

另请参见 serialize().

QList<QShaderDescription::BuiltinVariable> QShaderDescription::inputBuiltinVariables() const

返回用作输入的活动内置程序列表。例如,读取 gl_TessCoord 和 gl_Position 值的细分曲面评估着色器将在此处列出TessCoordBuiltinPositionBuiltin

QList<QShaderDescription::InOutVariable> QShaderDescription::inputVariables() const

返回输入变量列表。这包括顶点阶段的顶点输入(有时称为属性)和其他阶段的输入(有时称为变化)。

bool QShaderDescription::isValid() const

如果QShaderDescription 包含变量和区块列表中的至少一个条目,则返回 true。

QList<QShaderDescription::BuiltinVariable> QShaderDescription::outputBuiltinVariables() const

返回用作输入的活动内置变量列表。例如,顶点着色器通常会将PositionBuiltin 作为输出内置变量。

QList<QShaderDescription::InOutVariable> QShaderDescription::outputVariables() const

返回输出变量列表。

QList<QShaderDescription::PushConstantBlock> QShaderDescription::pushConstantBlocks() const

返回推送常量块列表。

注意: 对于要与 Qt 渲染硬件接口(Qt Rendering Hardware Interface)结合使用的着色器,应避免依赖推送常量块,因为该接口目前不支持推送常量块。

void QShaderDescription::serialize(QDataStream *stream, int version) const

QShaderDescription 序列化为streamversion 指定 qsb 版本。

另请参阅 deserialize() 和toJson()。

QList<QShaderDescription::StorageBlock> QShaderDescription::storageBlocks() const

返回着色器存储块列表。

例如,以 GLSL/Vulkan 着色器为源,声明

struct Stuff {
    vec2 a;
    vec2 b;
};
layout(std140, binding = 0) buffer StuffSsbo {
    vec4 whatever;
    Stuff stuff[];
} buf;

会生成以下内容:(此处显示为文本 JSON)

"storageBlocks": [ {
    "binding": 0,
    "blockName": "StuffSsbo",
    "instanceName": "buf",
    "knownSize": 16,
    "runtimeArrayStride": 16
    "members": [
        {
            "name": "whatever",
            "offset": 0,
            "size": 16,
            "type": "vec4"
        },
        {
            "arrayDims": [
                0
            ],
            "name": "stuff",
            "offset": 16,
            "size": 0,
            "structMembers": [
                {
                    "name": "a",
                    "offset": 0,
                    "size": 8,
                    "type": "vec2"
                },
                {
                    "name": "b",
                    "offset": 8,
                    "size": 8,
                    "type": "vec2"
                }
            ],
            "type": "struct"
        }
    ],
    "set": 0
} ]

注意: 存储块中最后一个成员的大小未定义。size [0]存储块的knownSize 不包括最后一个成员的大小,因为只有在运行时才能知道。对于未定义数组大小的最后一个成员,数组项之间以字节为单位的跨距为runtimeArrayStride 。该值根据指定的缓冲存储器布局标准(std140、std430)规则确定。

注意: 某些图形 API(如 OpenGL 2.x 或 3.1 以上的 OpenGL ES)无法使用 SSBO。

QList<QShaderDescription::InOutVariable> QShaderDescription::storageImages() const

返回图像变量列表。

这些变量很可能出现在计算着色器中。例如,layout (binding = 0, rgba8) uniform readonly image2D inputImage; 会生成以下内容:(此处显示为文本 JSON)

"storageImages": [
     {
         "binding": 0,
         "imageFormat": "rgba8",
         "name": "inputImage",
         "set": 0,
         "type": "image2D"
     }
 ]

注意: 单独的图像对象与某些图形 API 不兼容,例如 OpenGL 2.x 或 3.1 以上的 OpenGL ES。

QShaderDescription::TessellationMode QShaderDescription::tessellationMode() const

返回细分控制或评估着色器的细分执行模式。

未设置时,返回值为UnknownTessellationMode

例如,对于具有以下声明的细分评估着色器,函数返回TrianglesTessellationMode

layout(triangles) in;

uint QShaderDescription::tessellationOutputVertexCount() const

返回输出顶点的数量。

例如,对于具有以下声明的细分控制着色器,函数返回 3。

layout(vertices = 3) out;

QShaderDescription::TessellationPartitioning QShaderDescription::tessellationPartitioning() const

返回细分控制或评估着色器的细分分割模式。

未设置时,返回值为UnknownTessellationPartitioning

例如,对于具有以下声明的细分评估着色器,函数返回FractionalOddTessellationPartitioning

layout(triangles, fractional_odd_spacing, ccw) in;

QShaderDescription::TessellationWindingOrder QShaderDescription::tessellationWindingOrder() const

返回细分控制或评估着色器的细分卷绕顺序。

未设置时,返回值为UnknownTessellationWindingOrder

例如,对于具有以下声明的细分评估着色器,函数返回CcwTessellationWindingOrder

layout(triangles, fractional_odd_spacing, ccw) in;

QByteArray QShaderDescription::toJson() const

返回数据的序列化 JSON 文本版本。

注意: 没有为 JSON 文本提供反序列化方法。

另请参阅 serialize()。

QList<QShaderDescription::UniformBlock> QShaderDescription::uniformBlocks() const

返回统一区块列表。

QShaderDescription &QShaderDescription::operator=(const QShaderDescription &other)

为该对象指定other

相关非会员

[noexcept] bool operator==(const QShaderDescription &lhs, const QShaderDescription &rhs)

如果两个QShaderDescription 对象lhsrhs 相等,则返回true

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.