QShaderProgram 类

class Qt3DRender::QShaderProgram

封装了着色器程序。 更多...

头文件 #include <QShaderProgram>
CMakefind_package(Qt6 REQUIRED COMPONENTS 3drender)
target_link_libraries(mytarget PRIVATE Qt6::3drender)
qmakeQT += 3drender
由以下实例生成 ShaderProgram
继承自 Qt3DCore::QNode

公共类型

enumFormat { GLSL, SPIRV }
enumShaderType { Vertex, Fragment, TessellationControl, TessellationEvaluation, Geometry, Compute }
enumStatus { NotReady, Ready, Error }

属性

公共函数

QByteArraycomputeShaderCode() const
Qt3DRender::QShaderProgram::Formatformat() const
QByteArrayfragmentShaderCode() const
QByteArraygeometryShaderCode() const
QStringlog() const
voidsetFormat(Qt3DRender::QShaderProgram::Format format)
voidsetShaderCode(Qt3DRender::QShaderProgram::ShaderType type, const QByteArray &shaderCode)
QByteArrayshaderCode(Qt3DRender::QShaderProgram::ShaderType type) const
Qt3DRender::QShaderProgram::Statusstatus() const
QByteArraytessellationControlShaderCode() const
QByteArraytessellationEvaluationShaderCode() const
QByteArrayvertexShaderCode() const

公共槽

voidsetComputeShaderCode(const QByteArray &computeShaderCode)
voidsetFragmentShaderCode(const QByteArray &fragmentShaderCode)
voidsetGeometryShaderCode(const QByteArray &geometryShaderCode)
voidsetTessellationControlShaderCode(const QByteArray &tessellationControlShaderCode)
voidsetTessellationEvaluationShaderCode(const QByteArray &tessellationEvaluationShaderCode)
voidsetVertexShaderCode(const QByteArray &vertexShaderCode)

信号

voidcomputeShaderCodeChanged(const QByteArray &computeShaderCode)
voidformatChanged(Qt3DRender::QShaderProgram::Format format)
voidfragmentShaderCodeChanged(const QByteArray &fragmentShaderCode)
voidgeometryShaderCodeChanged(const QByteArray &geometryShaderCode)
voidlogChanged(const QString &log)
voidstatusChanged(Qt3DRender::QShaderProgram::Status status)
voidtessellationControlShaderCodeChanged(const QByteArray &tessellationControlShaderCode)
voidtessellationEvaluationShaderCodeChanged(const QByteArray &tessellationEvaluationShaderCode)
voidvertexShaderCodeChanged(const QByteArray &vertexShaderCode)

静态公有成员

QByteArrayloadSource(const QUrl &sourceUrl)

详细说明

着色程序由多个不同的着色器组成,例如顶点着色器和片段着色器。

在着色器探测阶段,Qt3D会自动填充一组默认的统一变量。

默认统一变量关联的Qt3D参数名称GLSL声明
ModelMatrixmodelMatrixuniform mat4 modelMatrix;
ViewMatrixviewMatrixuniform mat4 viewMatrix;
ProjectionMatrixprojectionMatrixuniform mat4 projectionMatrix;
ModelViewMatrixmodelViewuniform mat4 modelView;
ViewProjectionMatrixviewProjectionMatrixuniform mat4 viewProjectionMatrix;
ModelViewProjectionMatrixmodelViewProjection
mvp
uniform mat4 modelViewProjection;
uniform mat4 mvp;
InverseModelMatrixinverseModelMatrixuniform mat4 inverseModelMatrix;
InverseViewMatrixinverseViewMatrixuniform mat4 inverseViewMatrix;
InverseProjectionMatrixinverseProjectionMatrixuniform mat4 inverseProjectionMatrix;
InverseModelViewMatrixinverseModelViewuniform mat4 inverseModelView;
InverseViewProjectionMatrixinverseViewProjectionMatrixuniform mat4 inverseViewProjectionMatrix;
InverseModelViewProjectionMatrixinverseModelViewProjectionuniform mat4 inverseModelViewProjection;
ModelNormalMatrixmodelNormalMatrixuniform mat3 modelNormalMatrix;
ModelViewNormalMatrixmodelViewNormaluniform mat3 modelViewNormal;
ViewportMatrixviewportMatrixuniform mat4 viewportMatrix;
InverseViewportMatrixinverseViewportMatrixuniform mat4 inverseViewportMatrix;
AspectRatio
(surface width / surface height)
aspectRatiouniform float aspectRatio;
Exposureexposureuniform float exposure;
Gammagammauniform float gamma;
Time
(in nano seconds)
timeuniform float time;
EyePositioneyePositionuniform vec3 eyePosition;
SkinningPaletteskinningPalette[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::GLSL0OpenGL
Qt3DRender::QShaderProgram::SPIRV1Vulkan, OpenGL 5

enum QShaderProgram::着色器类型

此枚举标识了使用的着色器类型。

常量描述
Qt3DRender::QShaderProgram::顶点0顶点着色器
Qt3DRender::QShaderProgram::片段1片段着色器
Qt3DRender::QShaderProgram::TessellationControl2细分控制着色器
Qt3DRender::QShaderProgram::TessellationEvaluation3细分评估着色器
Qt3DRender::QShaderProgram::Geometry4几何着色器
Qt3DRender::QShaderProgram::Compute5计算着色器

enum QShaderProgram::状态

此枚举标识了使用的着色器的状态。

常量描述
Qt3DRender::QShaderProgram::NotReady0着色器尚未编译和链接
Qt3DRender::QShaderProgram::Ready1着色器成功编译
Qt3DRender::QShaderProgram::Error2在编译着色器时发生错误

属性文档

computeShaderCode : QByteArray

保存此着色器程序使用的计算着色器代码。

访问函数

QByteArraycomputeShaderCode() const
voidsetComputeShaderCode(const QByteArray &computeShaderCode)

通知器信号

voidcomputeShaderCodeChanged(const QByteArray &computeShaderCode)

format : 格式

保存提供给ShaderProgram的代码的格式。默认为ShaderProgram.GLSL

访问函数

Qt3DRender::QShaderProgram::Formatformat() const
voidsetFormat(Qt3DRender::QShaderProgram::Format format)

通知器信号

voidformatChanged(Qt3DRender::QShaderProgram::Format format)

fragmentShaderCode : QByteArray

保存此着色器程序使用的片段着色器代码。

访问函数

QByteArrayfragmentShaderCode() const
voidsetFragmentShaderCode(const QByteArray &fragmentShaderCode)

通知器信号

voidfragmentShaderCodeChanged(const QByteArray &fragmentShaderCode)

geometryShaderCode : QByteArray

保存此着色器程序使用的几何着色器代码。

访问函数

QByteArraygeometryShaderCode() const
voidsetGeometryShaderCode(const QByteArray &geometryShaderCode)

通知器信号

voidgeometryShaderCodeChanged(const QByteArray &geometryShaderCode)

[只读] 日志 : const QString

持有当前着色器程序的日志。这对于诊断着色器程序的编译失败很有用。

访问函数

QStringlog() const

通知器信号

voidlogChanged(const QString &日志)

[只读] 状态 : const Status

持有当前着色器程序的状态。

访问函数

Qt3DRender::QShaderProgram::Status状态() const

通知器信号

voidstatusChanged(Qt3DRender::QShaderProgram::Status 状态)

tessellationControlShaderCode : QByteArray

持有由该着色器程序使用的细分控制着色器代码。

访问函数

QByteArraytessellationControlShaderCode() const
voidsetTessellationControlShaderCode(const QByteArray &细分控制着色器代码)

通知器信号

voidtessellationControlShaderCodeChanged(const QByteArray &细分控制着色器代码)

tessellationEvaluationShaderCode : QByteArray

持有由该着色器程序使用的细分评估着色器代码。

访问函数

QByteArraytessellationEvaluationShaderCode() const
voidsetTessellationEvaluationShaderCode(const QByteArray &细分评估着色器代码)

通知器信号

voidtessellationEvaluationShaderCodeChanged(const QByteArray &细分评估着色器代码)

vertexShaderCode : QByteArray

持有该着色器程序使用的顶点着色器代码。

访问函数

QByteArrayvertexShaderCode() const
voidsetVertexShaderCode(const QByteArray &顶点着色器代码)

通知器信号

voidvertexShaderCodeChanged(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公司有限公司的商标。所有其他商标均为各自所有者的财产。