IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 学习笔记14 -> 正文阅读

[游戏开发]学习笔记14

一.体绘制

尤其要注意:所谓面数据,并不是说二维平面数据,而是说这个数据中只有表面细节,没有包含体细节,实际上体数据和面数据的本质区别,在于是否包含了体细节,而不是在维度方面。

(举例而言,你面前有一间房子,房子中有家具、家电,站在房子外面只能看到外部形状,无法观察到房子的布局或者房子中的物体;假设房子和房子中的物体都是半透明的,这样你就可以同时查看到所有的细节。这就是体绘制所要达到的效果。)

1.体绘制以物体对光的吸收原理为理论基础。【光线吸收、反射模型】

在实现方式上基于透明度合成计算模型:在同一射线方向上对体数据进行采样,获取多个体素的颜色值,然后根据其透明度进行颜色的合成。(颜色、透明度、梯度

2.体数据相关专业术语有:体素(Voxel )、体纹理(Volume Texture =3D Texture)。

【体素】

?由最邻近的两层图像的各4个角点所构成的立方体区域,相当于二维平面的像素的概念,图中每个小方块代表一个体素。

?不存在绝对空间位置的概念,只有在体空间中的相对位置。

【体纹理】

按照一定规则将三维数据存放在 XY 像素平面所得到的纹理,称之为 volume texture 。

?体数据最主要的文件存储格式,按照一定规则将三维数据存放在XY像素平面所得到的纹理,称之为volume texture。

?体数据通常是由CT 仪器进行扫描得到的,然后保存在图片的像素点上。目前国际上比较常用的体纹理格式有,基于DirectX的.dds格式和.raw格式。注意这里用于体纹理的.raw格式存放的是三维数据,而用于摄像器材的.raw格式只是普通的二维图片。

※体纹理并不是空间的模型数据,他只是描述了三维的数据(类似于编程时候用一维数组存储二维数组、三维数组的思想)。

※空间体模型(通常是规则的立方体或圆柱体)和体纹理相互结合才能进行体渲染。比如二维的纹理贴图效果。也就是说,我们想要看到体纹理数据,在体绘制中需要一个三维模型作为体纹理的载体,体纹理通过纹理坐标(三维)和模型进行对应,然后由视点向模型上的点引射线,该射线穿越模型空间等价于射线穿越了体纹理。通常使用普通的立方体或者圆柱体作为体绘制的空间模型。

3.?主要算法:

①物体空间方法(对象顺序绘制)

从体数据的每个体素出发】计算体数据内部每个体素重建后对屏幕像素的贡献值,最终获得绘制效果。如,抛雪球算法(Splatting从每个体素对屏幕抛一个雪球,形成一个雪斑块,能量从中心向外扩散并减弱(高斯函数)

②图像空间方法(图像顺序绘制)

从屏幕的每个像素出发】计算输出图像上每个像素所投射出的光线的累积,获得绘制效果。如,光线投射算法

Ray-casting从视点出发,穿过每个屏幕像素形成的透视投影?

Others:

错切-变形算法(Shear-warp)

频域体绘制算法(Frequency Domain)

4.?VTK使用Ray-Cast进行体绘制

原理:从屏幕上每一个像素点出发,沿着视线方向发射出一条光线,当这条光线穿过体数据时,沿着光线方向等距离采样,利用插值计算出采样点的颜色值和不透明度;接着按照从前到后或从后到前的顺序对光线上的采样点进行合成,计算出这条光线对应的屏幕上像素点的颜色值。

光线投射是目前应用最为广泛的体绘制方法。然而当观察方向发生变化时,采样点的前后关系也必然变化,因此需要重新进行采样,计算量极为庞大。针对算法所存在的问题,人们提出了不少优化方法,如光线提前终止、利用空间数据结构来跳过无用的体素,如八叉树、金字塔、k-d树等。

vtkVolume[派生自vtkProp]

表示渲染场景中的体数据对象

?存储基本变换信息(平移、旋转、缩放等)

?内部对象vtkAbstractVolumeMapper(根据不同的体绘制算法获取其内部生成的图元数据)

?内部对象vtkVolumeProperty(设置体绘制的属性对象)

vtkVolumeProperty对象需要设置

的属性

数据场映射到光学场

vtkColorTransferFunction

//Defines a transfer function for mapping a property to an RGB color value.

?

//uses piecewise hermite functions

?

vtkPiecewiseFunction【piecewise:分段】

【颜色映射】

(单→多值映射)

vtkColorTransferFunction类设置:

?volumeProperty->SetColor(volumeColor);

【不透明度映射】

(单→单值映射)

分段线性标量映射函数,通过vtkPiecewiseFunction类设置映射点和对应透明度;利用该函数可将光线投影过程中的采样点灰度值映射为不同的不透明度值。不透明度,0表示完全透明,1表示完全不透明。

?volumeProperty->SetScalarOpacity(volumeScalarOpacity);

【梯度映射】

(单→单值映射)

通过vtkPiecewiseFunction类设置。将梯度模值(单位距离内密度改变值)映射为一个不透明度乘子,增强边缘过渡区域的显示效果。例如在不同材料的临界区域,如空气到软组织,或者软组织到骨头的临界

区,梯度值会比较大,而材料的内部梯度值则会相对比较小。

?volumeProperty->SetGradientOpacity(volumeGradientOpacity);

【光照与阴影效果】

由环境光系数、漫反射光系数、镜面反射光系数和高光强度控制

环境光系数占主导时,阴影效果不明显;散射光系数占主导时,显示效果会比较粗燥;反射光系数占主导时,显示效果会比较光滑。阴影效果关闭时,等同于环境光系数为1.0,其他两个系数为零。阴影效果还与光源的数目、位置和颜色有关。开启阴影后体绘制效果会更加清晰逼真。(对MIP无效)

?vtkVolumeProperty::ShadeOn();//打开阴影效果

?vtkVolumeProperty::SetAmbient()设置环境光系数

?vtkVolumeProperty::SetDiffuse()设置散射光系数

?vtkVolumeProperty::SetSpecular()设置反射光系数

?VTKVolumeProperty::SetSpecularPower()设置高光强度,控制体绘制外观平滑程度。

vtkAbstractVolumeMapper设置

如果使用【vtkVolumeRayCastMapper】——光线投射算法

※指定一条光线上的最终颜色值合成计算方法: (某条投影光线与体数据的交点上选取部分来渲染)

?vtkVolumeRayCastIsosurfaceFunction 只渲染投影光线上标量值等于指定阈值的点。类似于选出等值面,再投影

?vtkVolumeRayCastMIPFunction 只渲染投影光线上最大强度(标量值/不透明度)的点。

?vtkVolumeRayCastCompositeFunction 对投影光线上所有点进行颜色叠加

※crop 可以选择只显示一部分数据mapper->CroppingOn() 可以指定六个参数

※mapper可以设置梯度估值器来控制法线 mapper->setGradientEstimator(vtkFiniteDifferenceGradientEstimator)

vtkLODProp3D

体绘制加速,提高渲染速度和交互速度

5.?【关于ImageData的一些tips】vtk集成的reader在读取三维数据的时候,其实就是在填充vtkImagedata的过程。本质上,三维重建是对vtkImagedata的重建,无论什么格式的图像(除了几何图形)读取进来以后都会变成vtkImagedata

6.颜色映射:https://blog.csdn.net/shenziheng1/article/details/54915682

色调(H),饱和度(S),明度(V)

透明度映射:https://blog.csdn.net/shenziheng1/article/details/54914495

多元数据的组分可能是非独立的,例如,RGB图像中每个像素的颜色值是由R.G.B三个颜色组分共同定义的。vtkVolumeMapper支持两种类型的非独立多元数据。

第一种是二元数据。第一元数据用于定义颜色传输函数,第二元数据用于定义不透明度传输函数;

第二种是四元数据。前三元数据作为一个R.G.B颜色定义颜色传输函数,第四元数据用于定义不同明度传输函数。

需要注意的是,两种方式都是利用最后一元数据来计算梯度,并决定梯度不透明度传输函数。

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-09-27 14:26:05  更:2021-09-27 14:27:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 3:39:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码