QShaderProgram 类
class Qt3DRender::QShaderProgram封装了着色器程序。 更多...
头文件 | #include <QShaderProgram> |
CMake | find_package(Qt6 REQUIRED COMPONENTS 3drender) target_link_libraries(mytarget PRIVATE Qt6::3drender) |
qmake | QT += 3drender |
由以下实例生成 | ShaderProgram |
继承自 | Qt3DCore::QNode |
公共类型
enum | Format { GLSL, SPIRV } |
enum | ShaderType { Vertex, Fragment, TessellationControl, TessellationEvaluation, Geometry, Compute } |
enum | Status { NotReady, Ready, Error } |
属性
|
|
公共函数
QByteArray | computeShaderCode() const |
Qt3DRender::QShaderProgram::Format | format() const |
QByteArray | fragmentShaderCode() const |
QByteArray | geometryShaderCode() const |
QString | log() const |
void | setFormat(Qt3DRender::QShaderProgram::Format format) |
void | setShaderCode(Qt3DRender::QShaderProgram::ShaderType type, const QByteArray &shaderCode) |
QByteArray | shaderCode(Qt3DRender::QShaderProgram::ShaderType type) const |
Qt3DRender::QShaderProgram::Status | status() const |
QByteArray | tessellationControlShaderCode() const |
QByteArray | tessellationEvaluationShaderCode() const |
QByteArray | vertexShaderCode() const |
公共槽
void | setComputeShaderCode(const QByteArray &computeShaderCode) |
void | setFragmentShaderCode(const QByteArray &fragmentShaderCode) |
void | setGeometryShaderCode(const QByteArray &geometryShaderCode) |
void | setTessellationControlShaderCode(const QByteArray &tessellationControlShaderCode) |
void | setTessellationEvaluationShaderCode(const QByteArray &tessellationEvaluationShaderCode) |
void | setVertexShaderCode(const QByteArray &vertexShaderCode) |
信号
void | computeShaderCodeChanged(const QByteArray &computeShaderCode) |
void | formatChanged(Qt3DRender::QShaderProgram::Format format) |
void | fragmentShaderCodeChanged(const QByteArray &fragmentShaderCode) |
void | geometryShaderCodeChanged(const QByteArray &geometryShaderCode) |
void | logChanged(const QString &log) |
void | statusChanged(Qt3DRender::QShaderProgram::Status status) |
void | tessellationControlShaderCodeChanged(const QByteArray &tessellationControlShaderCode) |
void | tessellationEvaluationShaderCodeChanged(const QByteArray &tessellationEvaluationShaderCode) |
void | vertexShaderCodeChanged(const QByteArray &vertexShaderCode) |
静态公有成员
QByteArray | loadSource(const QUrl &sourceUrl) |
详细说明
着色程序由多个不同的着色器组成,例如顶点着色器和片段着色器。
在着色器探测阶段,Qt3D会自动填充一组默认的统一变量。
默认统一变量 | 关联的Qt3D参数名称 | GLSL声明 |
---|---|---|
ModelMatrix | modelMatrix | uniform mat4 modelMatrix; |
ViewMatrix | viewMatrix | uniform mat4 viewMatrix; |
ProjectionMatrix | projectionMatrix | uniform mat4 projectionMatrix; |
ModelViewMatrix | modelView | uniform mat4 modelView; |
ViewProjectionMatrix | viewProjectionMatrix | uniform mat4 viewProjectionMatrix; |
ModelViewProjectionMatrix | modelViewProjection mvp | uniform mat4 modelViewProjection; uniform mat4 mvp; |
InverseModelMatrix | inverseModelMatrix | uniform mat4 inverseModelMatrix; |
InverseViewMatrix | inverseViewMatrix | uniform mat4 inverseViewMatrix; |
InverseProjectionMatrix | inverseProjectionMatrix | uniform mat4 inverseProjectionMatrix; |
InverseModelViewMatrix | inverseModelView | uniform mat4 inverseModelView; |
InverseViewProjectionMatrix | inverseViewProjectionMatrix | uniform mat4 inverseViewProjectionMatrix; |
InverseModelViewProjectionMatrix | inverseModelViewProjection | uniform mat4 inverseModelViewProjection; |
ModelNormalMatrix | modelNormalMatrix | uniform mat3 modelNormalMatrix; |
ModelViewNormalMatrix | modelViewNormal | uniform mat3 modelViewNormal; |
ViewportMatrix | viewportMatrix | uniform mat4 viewportMatrix; |
InverseViewportMatrix | inverseViewportMatrix | uniform mat4 inverseViewportMatrix; |
AspectRatio (surface width / surface height) | aspectRatio | uniform float aspectRatio; |
Exposure | exposure | uniform float exposure; |
Gamma | gamma | uniform float gamma; |
Time (in nano seconds) | time | uniform float time; |
EyePosition | eyePosition | uniform vec3 eyePosition; |
SkinningPalette | skinningPalette[0] | 定义常量int maxJoints = 100; uniform mat4 skinningPalette[maxJoints]; |
RHI支持
当编写与Qt 3D的RHI后端一起使用的GLSL 450着色器代码时,默认的uniform将被提供为两个uniform缓冲区对象。
这些绑定的位置设置为0绑定到RenderView uniform和1绑定到Command uniform。
#version 450 core layout(location = 0) in vec3 vertexPosition; layout(std140, binding = 0) uniform qt3d_render_view_uniforms { mat4 viewMatrix; mat4 projectionMatrix; mat4 uncorrectedProjectionMatrix; mat4 clipCorrectionMatrix; mat4 viewProjectionMatrix; mat4 inverseViewMatrix; mat4 inverseProjectionMatrix; mat4 inverseViewProjectionMatrix; mat4 viewportMatrix; mat4 inverseViewportMatrix; vec4 textureTransformMatrix; vec3 eyePosition; float aspectRatio; float gamma; float exposure; float time; float yUpInNDC; float yUpInFBO; }; layout(std140, binding = 1) uniform qt3d_command_uniforms { mat4 modelMatrix; mat4 inverseModelMatrix; mat4 modelViewMatrix; mat3 modelNormalMatrix; mat4 inverseModelViewMatrix; mat4 modelViewProjection; mat4 inverseModelViewProjectionMatrix; }; void main() { gl_Position = (projectionMatrix * viewMatrix * modelMatrix * vertexPosition); }
对于用户定义的均匀缓冲区对象,请使用从2开始的绑定或自动绑定,让Qt 3D自动确定绑定。请确保在不同着色器阶段之间保持一致性。
#version 450 core layout(std140, binding = auto) uniform my_uniforms { vec4 myColor; }; layout(location=0) out vec4 fragColor; void main() { fragColor = myColor; }
向uniform喂值时没有变化。
对于上面的示例,可以设置myColor如下
QParameter *parameter = new QParameter(); parameter->setName("myColor"); parameter->setValue(QVariant::fromValue(QColor(Qt::blue)));
纹理仍然需要定义为独立uniform。
#version 450 core layout(binding=0) uniform sampler2D source; layout(location=0) out vec4 fragColor; void main() { fragColor = texture(source, vec2(0.5, 0.5)); }
成员类型文档
enum QShaderProgram::格式
此枚举标识了使用的着色器代码的格式。
常量 | 值 | 描述 |
---|---|---|
Qt3DRender::QShaderProgram::GLSL | 0 | OpenGL |
Qt3DRender::QShaderProgram::SPIRV | 1 | Vulkan, OpenGL 5 |
enum QShaderProgram::着色器类型
此枚举标识了使用的着色器类型。
常量 | 值 | 描述 |
---|---|---|
Qt3DRender::QShaderProgram::顶点 | 0 | 顶点着色器 |
Qt3DRender::QShaderProgram::片段 | 1 | 片段着色器 |
Qt3DRender::QShaderProgram::TessellationControl | 2 | 细分控制着色器 |
Qt3DRender::QShaderProgram::TessellationEvaluation | 3 | 细分评估着色器 |
Qt3DRender::QShaderProgram::Geometry | 4 | 几何着色器 |
Qt3DRender::QShaderProgram::Compute | 5 | 计算着色器 |
enum QShaderProgram::状态
此枚举标识了使用的着色器的状态。
常量 | 值 | 描述 |
---|---|---|
Qt3DRender::QShaderProgram::NotReady | 0 | 着色器尚未编译和链接 |
Qt3DRender::QShaderProgram::Ready | 1 | 着色器成功编译 |
Qt3DRender::QShaderProgram::Error | 2 | 在编译着色器时发生错误 |
属性文档
computeShaderCode : QByteArray
保存此着色器程序使用的计算着色器代码。
访问函数
QByteArray | computeShaderCode() const |
void | setComputeShaderCode(const QByteArray &computeShaderCode) |
通知器信号
void | computeShaderCodeChanged(const QByteArray &computeShaderCode) |
format : 格式
保存提供给ShaderProgram的代码的格式。默认为ShaderProgram.GLSL
访问函数
Qt3DRender::QShaderProgram::Format | format() const |
void | setFormat(Qt3DRender::QShaderProgram::Format format) |
通知器信号
void | formatChanged(Qt3DRender::QShaderProgram::Format format) |
fragmentShaderCode : QByteArray
保存此着色器程序使用的片段着色器代码。
访问函数
QByteArray | fragmentShaderCode() const |
void | setFragmentShaderCode(const QByteArray &fragmentShaderCode) |
通知器信号
void | fragmentShaderCodeChanged(const QByteArray &fragmentShaderCode) |
geometryShaderCode : QByteArray
保存此着色器程序使用的几何着色器代码。
访问函数
QByteArray | geometryShaderCode() const |
void | setGeometryShaderCode(const QByteArray &geometryShaderCode) |
通知器信号
void | geometryShaderCodeChanged(const QByteArray &geometryShaderCode) |
[只读]
日志 : const QString
持有当前着色器程序的日志。这对于诊断着色器程序的编译失败很有用。
访问函数
QString | log() const |
通知器信号
void | logChanged(const QString &日志) |
[只读]
状态 : const Status
持有当前着色器程序的状态。
访问函数
Qt3DRender::QShaderProgram::Status | 状态() const |
通知器信号
void | statusChanged(Qt3DRender::QShaderProgram::Status 状态) |
tessellationControlShaderCode : QByteArray
持有由该着色器程序使用的细分控制着色器代码。
访问函数
QByteArray | tessellationControlShaderCode() const |
void | setTessellationControlShaderCode(const QByteArray &细分控制着色器代码) |
通知器信号
void | tessellationControlShaderCodeChanged(const QByteArray &细分控制着色器代码) |
tessellationEvaluationShaderCode : QByteArray
持有由该着色器程序使用的细分评估着色器代码。
访问函数
QByteArray | tessellationEvaluationShaderCode() const |
void | setTessellationEvaluationShaderCode(const QByteArray &细分评估着色器代码) |
通知器信号
void | tessellationEvaluationShaderCodeChanged(const QByteArray &细分评估着色器代码) |
vertexShaderCode : QByteArray
持有该着色器程序使用的顶点着色器代码。
访问函数
QByteArray | vertexShaderCode() const |
void | setVertexShaderCode(const QByteArray &顶点着色器代码) |
通知器信号
void | vertexShaderCodeChanged(const QByteArray &顶点着色器代码) |
成员函数文档
[静态可调用]
QByteArray QShaderProgram::loadSource(const QUrl &sourceUrl)
从 sourceUrl 加载着色器代码。
注意:此函数可以通过元对象系统和从 QML 调用。参见 Q_INVOKABLE。
void QShaderProgram::setShaderCode(Qt3DRender::QShaderProgram::ShaderType 类型, const QByteArray &着色器代码)
将着色器代码设置为 类型 的着色器。
另请参见 着色器代码。
QByteArray QShaderProgram::shaderCode(Qt3DRender::QShaderProgram::ShaderType 类型) const
返回 类型 的着色器代码。
另请参见 setShaderCode。
Qt3DRender::QShaderProgram::Status QShaderProgram::status() const
返回当前着色器程序的状态。
注意:属性状态获取器函数。
© 2024 Qt公司有限公司。本文件中包含的文档贡献均为各自所有者的版权。本提供的文档根据自由软件基金会发布的GNU自由文档许可协议版本1.3许可条款发布。Qt及其相关标识为芬兰及世界其他地区的Qt公司有限公司的商标。所有其他商标均为各自所有者的财产。