QShaderDescription Class
描述着色器的界面。更多
头文件: | #include <QShaderDescription> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::Gui) |
qmake: | QT += gui |
自 | Qt 6.6 |
- 所有成员(包括继承成员)的列表
- QShaderDescription 是3D 渲染的一部分。
公共类型
(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 允许访问类似上述的数据结构。为简单起见,内部结构只包含公共数据成员,同时考虑到其布局在未来不太可能发生变化。
另请参见 QShaderBaker 和QShader 。
成员类型文档
enum QShaderDescription::BuiltinType
内置变量类型。
常数 | 值 |
---|---|
QShaderDescription::PositionBuiltin | 0 |
QShaderDescription::PointSizeBuiltin | 1 |
QShaderDescription::ClipDistanceBuiltin | 3 |
QShaderDescription::CullDistanceBuiltin | 4 |
QShaderDescription::VertexIdBuiltin | 5 |
QShaderDescription::InstanceIdBuiltin | 6 |
QShaderDescription::PrimitiveIdBuiltin | 7 |
QShaderDescription::InvocationIdBuiltin | 8 |
QShaderDescription::LayerBuiltin | 9 |
QShaderDescription::ViewportIndexBuiltin | 10 |
QShaderDescription::TessLevelOuterBuiltin | 11 |
QShaderDescription::TessLevelInnerBuiltin | 12 |
QShaderDescription::TessCoordBuiltin | 13 |
QShaderDescription::PatchVerticesBuiltin | 14 |
QShaderDescription::FragCoordBuiltin | 15 |
QShaderDescription::PointCoordBuiltin | 16 |
QShaderDescription::FrontFacingBuiltin | 17 |
QShaderDescription::SampleIdBuiltin | 18 |
QShaderDescription::SamplePositionBuiltin | 19 |
QShaderDescription::SampleMaskBuiltin | 20 |
QShaderDescription::FragDepthBuiltin | 22 |
QShaderDescription::NumWorkGroupsBuiltin | 24 |
QShaderDescription::WorkgroupSizeBuiltin | 25 |
QShaderDescription::WorkgroupIdBuiltin | 26 |
QShaderDescription::LocalInvocationIdBuiltin | 27 |
QShaderDescription::GlobalInvocationIdBuiltin | 28 |
QShaderDescription::LocalInvocationIndexBuiltin | 29 |
QShaderDescription::VertexIndexBuiltin | 42 |
QShaderDescription::InstanceIndexBuiltin | 43 |
枚举 QShaderDescription::ImageFlag
flags QShaderDescription::ImageFlags
图像标志。
常量 | 值 |
---|---|
QShaderDescription::ReadOnlyImage | 1 << 0 |
QShaderDescription::WriteOnlyImage | 1 << 1 |
ImageFlags 类型是QFlags<ImageFlag> 的类型定义。它存储 ImageFlag 值的 OR 组合。
enum QShaderDescription::ImageFormat
图像格式。
常数 | 值 |
---|---|
QShaderDescription::ImageFormatUnknown | 0 |
QShaderDescription::ImageFormatRgba32f | 1 |
QShaderDescription::ImageFormatRgba16f | 2 |
QShaderDescription::ImageFormatR32f | 3 |
QShaderDescription::ImageFormatRgba8 | 4 |
QShaderDescription::ImageFormatRgba8Snorm | 5 |
QShaderDescription::ImageFormatRg32f | 6 |
QShaderDescription::ImageFormatRg16f | 7 |
QShaderDescription::ImageFormatR11fG11fB10f | 8 |
QShaderDescription::ImageFormatR16f | 9 |
QShaderDescription::ImageFormatRgba16 | 10 |
QShaderDescription::ImageFormatRgb10A2 | 11 |
QShaderDescription::ImageFormatRg16 | 12 |
QShaderDescription::ImageFormatRg8 | 13 |
QShaderDescription::ImageFormatR16 | 14 |
QShaderDescription::ImageFormatR8 | 15 |
QShaderDescription::ImageFormatRgba16Snorm | 16 |
QShaderDescription::ImageFormatRg16Snorm | 17 |
QShaderDescription::ImageFormatRg8Snorm | 18 |
QShaderDescription::ImageFormatR16Snorm | 19 |
QShaderDescription::ImageFormatR8Snorm | 20 |
QShaderDescription::ImageFormatRgba32i | 21 |
QShaderDescription::ImageFormatRgba16i | 22 |
QShaderDescription::ImageFormatRgba8i | 23 |
QShaderDescription::ImageFormatR32i | 24 |
QShaderDescription::ImageFormatRg32i | 25 |
QShaderDescription::ImageFormatRg16i | 26 |
QShaderDescription::ImageFormatRg8i | 27 |
QShaderDescription::ImageFormatR16i | 28 |
QShaderDescription::ImageFormatR8i | 29 |
QShaderDescription::ImageFormatRgba32ui | 30 |
QShaderDescription::ImageFormatRgba16ui | 31 |
QShaderDescription::ImageFormatRgba8ui | 32 |
QShaderDescription::ImageFormatR32ui | 33 |
QShaderDescription::ImageFormatRgb10a2ui | 34 |
QShaderDescription::ImageFormatRg32ui | 35 |
QShaderDescription::ImageFormatRg16ui | 36 |
QShaderDescription::ImageFormatRg8ui | 37 |
QShaderDescription::ImageFormatR16ui | 38 |
QShaderDescription::ImageFormatR8ui | 39 |
枚举 QShaderDescription::QualifierFlag
flags QShaderDescription::QualifierFlags
限定符标志。
常量 | 值 |
---|---|
QShaderDescription::QualifierReadOnly | 1 << 0 |
QShaderDescription::QualifierWriteOnly | 1 << 1 |
QShaderDescription::QualifierCoherent | 1 << 2 |
QShaderDescription::QualifierVolatile | 1 << 3 |
QShaderDescription::QualifierRestrict | 1 << 4 |
QualifierFlags 类型是QFlags<QualifierFlag> 的类型定义。它存储 QualifierFlag 值的 OR 组合。
enum QShaderDescription::TessellationMode
常数 | 数值 |
---|---|
QShaderDescription::UnknownTessellationMode | 0 |
QShaderDescription::TrianglesTessellationMode | 1 |
QShaderDescription::QuadTessellationMode | 2 |
QShaderDescription::IsolineTessellationMode | 3 |
enum QShaderDescription::TessellationPartitioning
常数 | 数值 |
---|---|
QShaderDescription::UnknownTessellationPartitioning | 0 |
QShaderDescription::EqualTessellationPartitioning | 1 |
QShaderDescription::FractionalEvenTessellationPartitioning | 2 |
QShaderDescription::FractionalOddTessellationPartitioning | 3 |
enum QShaderDescription::TessellationWindingOrder
常数 | 数值 |
---|---|
QShaderDescription::UnknownTessellationWindingOrder | 0 |
QShaderDescription::CwTessellationWindingOrder | 1 |
QShaderDescription::CcwTessellationWindingOrder | 2 |
enum QShaderDescription::VariableType
代表变量或块成员的类型。
常量 | 值 | 说明 |
---|---|---|
QShaderDescription::Unknown | 0 | |
QShaderDescription::Float | 1 | |
QShaderDescription::Vec2 | 2 | |
QShaderDescription::Vec3 | 3 | |
QShaderDescription::Vec4 | 4 | |
QShaderDescription::Mat2 | 5 | |
QShaderDescription::Mat2x3 | 6 | |
QShaderDescription::Mat2x4 | 7 | |
QShaderDescription::Mat3 | 8 | |
QShaderDescription::Mat3x2 | 9 | |
QShaderDescription::Mat3x4 | 10 | |
QShaderDescription::Mat4 | 11 | |
QShaderDescription::Mat4x2 | 12 | |
QShaderDescription::Mat4x3 | 13 | |
QShaderDescription::Int | 14 | |
QShaderDescription::Int2 | 15 | |
QShaderDescription::Int3 | 16 | |
QShaderDescription::Int4 | 17 | |
QShaderDescription::Uint | 18 | |
QShaderDescription::Uint2 | 19 | |
QShaderDescription::Uint3 | 20 | |
QShaderDescription::Uint4 | 21 | |
QShaderDescription::Bool | 22 | |
QShaderDescription::Bool2 | 23 | |
QShaderDescription::Bool3 | 24 | |
QShaderDescription::Bool4 | 25 | |
QShaderDescription::Double | 26 | |
QShaderDescription::Double2 | 27 | |
QShaderDescription::Double3 | 28 | |
QShaderDescription::Double4 | 29 | |
QShaderDescription::DMat2 | 30 | |
QShaderDescription::DMat2x3 | 31 | |
QShaderDescription::DMat2x4 | 32 | |
QShaderDescription::DMat3 | 33 | |
QShaderDescription::DMat3x2 | 34 | |
QShaderDescription::DMat3x4 | 35 | |
QShaderDescription::DMat4 | 36 | |
QShaderDescription::DMat4x2 | 37 | |
QShaderDescription::DMat4x3 | 38 | |
QShaderDescription::Sampler1D | 39 | |
QShaderDescription::Sampler2D | 40 | |
QShaderDescription::Sampler2DMS | 41 | |
QShaderDescription::Sampler3D | 42 | |
QShaderDescription::SamplerCube | 43 | |
QShaderDescription::Sampler1DArray | 44 | |
QShaderDescription::Sampler2DArray | 45 | |
QShaderDescription::Sampler2DMSArray | 46 | |
QShaderDescription::Sampler3DArray | 47 | |
QShaderDescription::SamplerCubeArray | 48 | |
QShaderDescription::SamplerRect | 49 | |
QShaderDescription::SamplerBuffer | 50 | |
QShaderDescription::SamplerExternalOES | 51 | |
QShaderDescription::Sampler | 52 | 用于独立采样器。 |
QShaderDescription::Image1D | 53 | |
QShaderDescription::Image2D | 54 | |
QShaderDescription::Image2DMS | 55 | |
QShaderDescription::Image3D | 56 | |
QShaderDescription::ImageCube | 57 | |
QShaderDescription::Image1DArray | 58 | |
QShaderDescription::Image2DArray | 59 | |
QShaderDescription::Image2DMSArray | 60 | |
QShaderDescription::Image3DArray | 61 | |
QShaderDescription::ImageCubeArray | 62 | |
QShaderDescription::ImageRect | 63 | |
QShaderDescription::ImageBuffer | 64 | |
QShaderDescription::Struct | 65 | |
QShaderDescription::Half | 66 | |
QShaderDescription::Half2 | 67 | |
QShaderDescription::Half3 | 68 | |
QShaderDescription::Half4 | 69 |
成员函数文档
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 加载的新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 渲染硬件接口(Qt Rendering Hardware Interface)结合使用的着色器,应避免依赖推送常量块,因为该接口目前不支持推送常量块。
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]
存储块的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
。
© 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.