本页内容

QShaderDescription Class

描述了着色器的接口。更多内容...

标题: #include <qshaderdescription.h>
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, …, ViewIndexBuiltin }
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> 。

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

对于顶点输入和统一缓冲区的布局(成员名称是什么?大小、偏移量等参数如何设定),应用程序和框架可能需要在运行时动态获取这些信息。当着色器并非内置而是由外部实体(如用户)提供时,这种情况尤为常见。

现代精简的图形 API 可能不再提供在运行时查询着色器反射信息的方法。因此,此类数据现在由 `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 处的 4x4 矩阵,名为mvp ;以及一个位于偏移量 64 处的浮点数opacity 。

所有这些都由一个 QShaderDescription 对象描述。QShaderDescription 可以通过QDataStream 序列化为 JSON 和二进制格式,也可以从该二进制格式反序列化。 实际上这很少有必要,因为QShader 会自动处理相关的QShaderDescription,但如果将上述着色器的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 允许访问类似于上述的数据结构。为简化起见,内部结构体仅包含公共数据成员,同时也考虑到其布局未来不太可能发生变化。

另请参阅 QShaderBaker 和QShader 。

成员类型文档

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::ViewIndexBuiltin4440

enum QShaderDescription::ImageFlag
flags QShaderDescription::ImageFlags

图像标记。

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

ImageFlags 类型是QFlags<ImageFlag> 的 typedef。它存储 ImageFlag 值的按“或”运算组合。

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

enum QShaderDescription::QualifierFlag
flags QShaderDescription::QualifierFlags

限定符标志。

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

QualifierFlags 类型是QFlags<QualifierFlag> 的 typedef 定义。它存储 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; 统一变量会生成以下内容:(此处以 JSON 文本形式展示)

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

这并不意味着其他语言版本的着色器也必须使用组合图像采样器,尤其是考虑到该概念并非在所有语言中都存在。例如,HLSL 版本很可能仅使用 Texture2D 和 SamplerState 对象,并分别将其注册为 t1 和 s1。

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 加载而来的新QShaderDescription 对象。version 指定了 qsb 的版本。

另请参阅 serialize()。

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

返回用作输入的活跃内置函数列表。例如,一个读取 gl_TessCoord 和 gl_Position 值的镶嵌计算着色器,其TessCoordBuiltin 和PositionBuiltin 将在此处列出。

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 渲染硬件接口结合使用的着色器中依赖“push constant”代码块,因为该接口目前尚不支持此类代码块。

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

将此QShaderDescription 序列化为stream 。version 指定了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,且数组维度为[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 对象lhs 和rhs 相等,则返回true 。

© 2026 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.