Qt3DRender::QShaderProgram Class

class Qt3DRender::QShaderProgram

封装着色器程序。更多

头文件: #include <QShaderProgram>
CMake: find_package(Qt6 REQUIRED COMPONENTS 3drender)
target_link_libraries(mytarget PRIVATE Qt6::3drender)
qmake: QT += 3drender
在 QML 中: 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 声明
模型矩阵模型矩阵统一 mat4 modelMatrix;
视图矩阵viewMatrixuniform mat4 viewMatrix;
投影矩阵projectionMatrixuniform mat4 projectionMatrix;
模型视图矩阵模型视图统一 mat4 modelView.ViewProjectionMatrix
视图投影矩阵viewProjectionMatrixuniform mat4 viewProjectionMatrix;
模型视图投影矩阵modelViewProjection
mvp
uniform mat4 modelViewProjection;
uniform mat4 mvp;
反向模型矩阵inverseModelMatrixuniform mat4 inverseModelMatrix;
inverseViewMatrixinverseViewMatrixuniform mat4 inverseViewMatrix;
反向投影矩阵inverseProjectionMatrixuniform mat4 inverseProjectionMatrix;
反向模型视图矩阵逆模型视图矩阵uniform mat4 inverseModelView;
InverseViewProjectionMatrixinverseViewProjectionMatrixuniform mat4 inverseViewProjectionMatrix;
反向模型视图投影矩阵inverseModelViewProjectionuniform mat4 inverseModelViewProjection;
模型正态矩阵modelNormalMatrixuniform mat3 modelNormalMatrix;
模型视图正态矩阵modelViewNormaluniform mat3 modelViewNormal;
视口矩阵viewportMatrixuniform mat4 viewportMatrix;
反向视口矩阵inverseViewportMatrixuniform mat4 inverseViewportMatrix;
宽高比
(曲面宽/曲面高
宽高比uniform float aspectRatio;
曝光曝光统一浮点曝光;
伽玛gamma均匀浮动伽马值;
时间
(纳秒
时间统一浮点时间;
眼睛位置eyePositionuniform vec3 eyePosition;
蒙皮调色板skinningPalette[0]const int maxJoints = 100;
uniform mat4 skinningPalette[maxJoints];

支持 RHI

在编写与Qt 3D 的 RHI 后端一起使用的 GLSL 450 着色器代码时,默认制服将作为 2 个制服缓冲区对象提供。

这些对象的绑定位置设置为:RenderView 统一对象的绑定位置为 0,Command 统一对象的绑定位置为 1。

#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;
}

在向制服输入值时,不涉及任何更改。

在上述示例中,只需设置 myColor 即可:

QParameter *parameter = new QParameter();
parameter->setName("myColor");
parameter->setValue(QVariant::fromValue(QColor(Qt::blue)));

纹理仍需定义为独立的制服。

#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::Format

该枚举用于确定着色器代码的格式。

常量说明
Qt3DRender::QShaderProgram::GLSL0OpenGL
Qt3DRender::QShaderProgram::SPIRV1Vulkan、OpenGL 5

enum QShaderProgram::ShaderType

该枚举用于标识所使用的着色器类型。

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

enum QShaderProgram::Status

该枚举用于确定所使用着色器的状态。

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

属性文档

computeShaderCode : QByteArray

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

访问功能:

QByteArray computeShaderCode() const
void setComputeShaderCode(const QByteArray &computeShaderCode)

通知信号:

void computeShaderCodeChanged(const QByteArray &computeShaderCode)

format : 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)

[read-only] log : const QString

保存当前着色器程序的日志。这有助于诊断着色器程序的编译故障。

访问功能:

QString log() const

通知信号

void logChanged(const QString &log)

[read-only] status : const Status

保存当前着色器程序的状态。

访问功能:

Qt3DRender::QShaderProgram::Status status() const

通知信号:

void statusChanged(Qt3DRender::QShaderProgram::Status status)

tessellationControlShaderCode : QByteArray

保存此着色器程序使用的细分控制着色器代码。

访问功能:

QByteArray tessellationControlShaderCode() const
void setTessellationControlShaderCode(const QByteArray &tessellationControlShaderCode)

通知信号

void tessellationControlShaderCodeChanged(const QByteArray &tessellationControlShaderCode)

tessellationEvaluationShaderCode : QByteArray

保存此着色器程序使用的细分评估着色器代码。

访问功能:

QByteArray tessellationEvaluationShaderCode() const
void setTessellationEvaluationShaderCode(const QByteArray &tessellationEvaluationShaderCode)

通知信号

void tessellationEvaluationShaderCodeChanged(const QByteArray &tessellationEvaluationShaderCode)

vertexShaderCode : QByteArray

保存此着色器程序使用的顶点着色器代码。

访问功能:

QByteArray vertexShaderCode() const
void setVertexShaderCode(const QByteArray &vertexShaderCode)

Notifier 信号:

void vertexShaderCodeChanged(const QByteArray &vertexShaderCode)

成员函数 文档

[static invokable] QByteArray QShaderProgram::loadSource(const QUrl &sourceUrl)

返回从sourceUrl 加载的着色器代码。

注: 可通过元对象系统和 QML 调用此函数。请参见Q_INVOKABLE

void QShaderProgram::setShaderCode(Qt3DRender::QShaderProgram::ShaderType type, const QByteArray &shaderCode)

type 的着色器代码设置为shaderCode

另请参阅 shaderCode() 。

QByteArray QShaderProgram::shaderCode(Qt3DRender::QShaderProgram::ShaderType type) const

返回type 的着色器代码。

另请参见 setShaderCode().

Qt3DRender::QShaderProgram::Status QShaderProgram::status() const

返回当前着色器程序的状态。

注: 属性状态的获取函数。

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