Qt3d中的材质--PBR材质

Qt自带PBR材质的例子

qt中带了一个qml写的PBR材质的例子。
在这里插入图片描述

PBR材质是什么

PBR材质的概念

PBR(Physically Based Rendering)材质是一种基于物理的渲染技术,旨在模拟光线与物体表面的真实交互。PBR材质通过物理属性(如金属度、粗糙度)描述表面特性,使渲染结果更接近现实。

PBR材质的核心属性

  • 基础色(Albedo) 定义材质的固有颜色,通常使用RGB值表示。金属材质的基础色直接影响反射颜色,而非金属材质的基础色为漫反射颜色。

  • 金属度(Metallic) 控制材质是金属(1)还是非金属(0)。金属材质具有高反射率,非金属材质则依赖漫反射和次表面散射。

  • 粗糙度(Roughness) 描述表面的微观凹凸程度,影响反射的清晰度。粗糙度为0时表面完全光滑,为1时反射模糊。

  • 法线贴图(Normal Map) 模拟表面微观几何细节,通过RGB通道存储切线空间法线方向,增强视觉细节而不增加多边形数量。

  • 高度贴图(Displacement Map) 实际改变几何形状的贴图,提供更真实的凹凸效果,但计算成本较高。

  • 环境光遮蔽(AO) 模拟表面因几何遮挡产生的阴影,通常与其他贴图结合使用以增强深度感。

PBR材质的实现流程

贴图准备 准备上述核心属性的贴图,确保分辨率一致且符合PBR标准。基础色贴图需去除光照信息,避免双重计算。

材质设置 在3D软件或游戏引擎中创建PBR材质,将贴图分配到对应通道。例如在Unity中,使用Standard Shader或HDRP/LWRP的Lit Shader。

光照环境 PBR依赖精确的光照模型。使用HDR环境贴图或全局光照(GI)系统,确保反射和间接光照符合物理规律。

常见PBR材质错误与修复

  • 基础色过亮 基础色贴图应避免过高的亮度值(>0.8),否则会导致材质不真实。非金属的常见基础色亮度范围为0.03-0.7。

  • 金属度与粗糙度冲突 避免金属度和粗糙度贴图的极端值同时出现(如金属度1且粗糙度1),此类组合在现实中不存在。

  • 法线贴图错误 确保法线贴图的Y轴方向与引擎一致(OpenGL vs DirectX)。错误方向会导致凹凸效果反向。

总结

PBR是基于物理的渲染,材质是模拟真实世界物体表面光影效果的3d材质技术。
参数主要是:

  • 基础色(Base Color) :定义了材质的表面颜色和反射特性。
  • 金属度(Metallic):用于控制材质表面是金属还是非金属。其值通常介于0(非金属)到1(纯金属)之间,直接影响材质的反射属性和外观表现。
  • 粗糙度(Roughness):用于描述物体表面的微观几何细节对光的散射影响。数值范围通常在0(完全光滑)到1(完全粗糙)之间,直接影响材质的高光反射表现。
  • 法线纹理(normal) :用于模拟表面细节的凹凸效果,通过改变表面法线方向实现光影变化,而非实际几何变形。
  • 环境遮蔽Ambient Occlusion(AO):用于模拟物体表面因自遮挡产生的阴影,增强细节的深度感和真实感。

改写Qt自带的例子,用C++实现

在这里插入图片描述
上面的图片中,是用C++改写Qt中qml带的实现的PBR材质的渲染的例子。
并通过qt自带的正方体的mesh给附上跟第三号一样的材质。

PbrQt3DWindow .h

#ifndef PBRQT3DWINDOW_H
#define PBRQT3DWINDOW_H

#include <Qt3DExtras/Qt3DWindow>
#include <Qt3DRender/QCamera>

class PbrQt3DWindow : public Qt3DExtras::Qt3DWindow
{
    Q_OBJECT
public:
    PbrQt3DWindow();
};

#endif // PBRQT3DWINDOW_H

TrefoilKnot 和 ShowSphereEntity 头文件

#ifndef TREFOILKNOT_H
#define TREFOILKNOT_H

#include <Qt3DCore/QEntity>
#include <Qt3DCore/QTransform>

QT_BEGIN_NAMESPACE

namespace Qt3DCore {
class QEntity;
class QTransform;
}

namespace  Qt3DExtras{
class QMetalRoughMaterial;
}

namespace Qt3DRender {
class QMesh;
}

// 自定义 TrefoilKnot 实体类(继承自 QEntity)
class TrefoilKnot : public Qt3DCore::QEntity {
    Q_OBJECT
    // 声明属性(与QML中的属性对应)
    Q_PROPERTY(float x READ x WRITE setX NOTIFY xChanged)
    Q_PROPERTY(float y READ y WRITE setY NOTIFY yChanged)
    Q_PROPERTY(float z READ z WRITE setZ NOTIFY zChanged)
    Q_PROPERTY(float scale READ scale WRITE setScale NOTIFY scaleChanged)
    Q_PROPERTY(float theta READ theta WRITE setTheta NOTIFY thetaChanged)
    Q_PROPERTY(float phi READ phi WRITE setPhi NOTIFY phiChanged)

public:
    explicit TrefoilKnot(Qt3DCore::QEntity *parent = nullptr);


    // 属性访问器
    float x() const { return m_x; }
    float y() const { return m_y; }
    float z() const { return m_z; }
    float scale() const { return m_scale; }
    float theta() const { return m_theta; }
    float phi() const { return m_phi; }

public slots:
    void setX(float x) ;
    void setY(float y) ;
    void setZ(float z) ;
    void setScale(float scale) ;
    void setTheta(float theta) ;
    void setPhi(float phi) ;

private:
    // 更新变换矩阵
    void updateTransform();

signals:
    void xChanged();
    void yChanged();
    void zChanged();
    void scaleChanged();
    void thetaChanged();
    void phiChanged();

private:
    // 属性变量
    float m_x = 0.0f;
    float m_y = 0.0f;
    float m_z = 0.0f;
    float m_scale = 1.0f;
    float m_theta = 0.0f;
    float m_phi = 0.0f;

    // 组件指针
    Qt3DCore::QTransform *m_transform;
    Qt3DExtras::QMetalRoughMaterial *m_material;
    Qt3DRender::QMesh *m_mesh;

public:
    static void setupRotationAnimation(TrefoilKnot *knot);
};

class ShowSphereEntity : public Qt3DCore::QEntity {
public:
    ShowSphereEntity(QStringList list,Qt3DCore::QEntity* parent = nullptr);

public:
    void setTranslation(const QVector3D &translation){
        m_transform->setTranslation(translation);
    }

    void setRotationY(float rotationY)
    {
        m_transform->setRotationY(rotationY);
    }

    void setMesh(Qt3DRender::QMesh* mesh);
private:
    Qt3DCore::QTransform* m_transform;

};


QT_END_NAMESPACE

#endif // TREFOILKNOT_H

3D图形中使用PBR(物理基础渲染材质是现代渲染技术的重要组成部分,它能够模拟真实世界中材质与光线之间的复杂交互,从而提升视觉效果的真实性。以下是在不同3D引擎或框架中使用PBR材质的通用方法和具体实现步骤。 ### 在Unity中使用PBR材质 Unity作为广泛使用的3D引擎之一,内置了对PBR材质的全面支持。以下是使用PBR材质的基本流程: - **导入材质库**:将PBR材质库(如Allegorithmic、CC0 Textures等)的文件夹拖入Unity的Project面板,系统会自动识别并导入所有纹理和材质预设。 - **创建材质**:在Assets面板中选择所需的PBR纹理集(通常包含基础颜色、法线贴图、金属度、粗糙度等通道),然后在Inspector面板中点击“Create > Material”来创建一个PBR材质- **配置材质属性**:根据纹理集的内容,将各个贴图分别分配给材质的Base Map、Normal Map、Metallic、Smoothness等属性。 - **应用材质**:将创建好的材质直接拖放到场景中的3D模型上,即可看到基于物理的渲染效果。 Unity的标准着色器(Standard Shader)和高清渲染管线(HDRP)均支持PBR材质,开发者还可以通过Shader Graph等工具自定义PBR材质的行为。 ### 在Unreal Engine中使用PBR材质 Unreal Engine同样对PBR材质提供了强大的支持: - **导入纹理资源**:将PBR纹理集导入到Content Browser中,确保每张贴图(如Base Color、Roughness、Metallic、Normal等)都被正确识别。 - **创建材质**:在Material Editor中创建新材质,将导入的纹理连接到对应的输入节点,如Base Color、Metallic、Roughness等。 - **调整材质参数**:可以进一步调整材质的Shading Model(如Default Lit、Subsurface、Anisotropic等),以匹配实际材质的物理特性。 - **应用并测试**:将材质应用到3D模型上,并在不同光照条件下测试其表现,以确保符合预期。 Unreal Engine的材质系统非常灵活,支持节点式编辑,便于实现复杂的PBR材质效果。 ### 在Qt3D中使用PBR材质 Qt3D是一个基于Qt框架的3D渲染引擎,也支持PBR材质的加载和渲染。以下是使用C++代码实现PBR材质的基本方式: - **加载纹理资源**:通过Qt3D的`QTextureLoader`类加载PBR材质所需的各个贴图文件。 - **构建材质组件**:使用`QPhongMaterial`或自定义的PBR材质类(如基于`QEffect`和`QTechnique`)来组合基础颜色、法线、金属度、粗糙度等贴图。 - **应用到3D对象**:将构建好的材质组件附加到3D模型的`QEntity`对象上,使其在场景中正确渲染。 示例代码如下: ```cpp Qt3DCore::QEntity *createPBRObject(Qt3DCore::QNode *parent) { Qt3DCore::QEntity *entity = new Qt3DCore::QEntity(parent); Qt3DRender::QMesh *mesh = new Qt3DRender::QMesh(); mesh->setSource(QUrl::fromLocalFile("path/to/model.obj")); entity->addComponent(mesh); Qt3DRender::QTextureLoader *baseColorMap = new Qt3DRender::QTextureLoader(); baseColorMap->setSource(QUrl::fromLocalFile("path/to/basecolor.png")); Qt3DRender::QPhongMaterial *material = new Qt3DRender::QPhongMaterial(); material->setDiffuse(baseColorMap); // 可继续设置其他PBR参数如金属度、粗糙度等 entity->addComponent(material); return entity; } ``` ### 在Cesium中使用PBR材质 Cesium是一个用于创建3D地理空间应用的JavaScript库,其对glTF格式模型的支持也包括PBR材质。通过启用PBR扩展,可以显著提升模型的真实感: - **启用PBR扩展**:确保加载的glTF模型启用了PBR相关的扩展,如`KHR_materials_specular`、`KHR_materials_anisotropy`和`KHR_materials_clearcoat`。 - **调整色调映射**:使用Khronos中性色调映射(Neutral Tone Mapping)可以改善模型在不同光照下的视觉表现,避免模型显得过暗。 - **动态光照支持**:Cesium支持动态光源,结合PBR材质可以实现更真实的光照反射效果。 ### 总结 无论是在Unity、Unreal Engine、Qt3D还是Cesium中,使用PBR材质的核心步骤都包括:导入纹理资源、创建并配置材质、应用到3D模型,并根据需要调整光照和渲染设置。每种引擎的具体实现方式有所不同,但其背后的物理渲染原理是一致的[^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值