体绘制(Volume Rendering)概述之4:光线投射算法(Ray Casting)实现流程和代码(基于CPU的实现)...
转自:http://blog.csdn.net/liu_lin_xm/article/details/4850630
摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文 名“GPU编程与CG语言之阳春白雪下里巴人”
算法流程
图 47 展示了使用光线投射算法进行体绘制的实现流程。
首先要渲染出正向面深度图和背向面深度图,这是为了计算射线穿越的最大距离,做为循环采样控制的结束依据;然后在顶点着色程序中计算顶点位置和射线方向,射线方向由视线方向和点的世界坐标决定,其实射线方向也可以放在片段着色程序中进行计算。然后到了最关键的地方,就是循环纹理采样、合成。
每一次循环都要计算新的采样纹理坐标和采样距离,然后进行颜色合成和透明度累加,如果采样距离超过了最大穿越距离,或者透明度累加到 1 ,则循环结束。将合成得到的颜色值输出即可。
图 48 给出了使用光线投射算法进行体绘制的效果图:
15.4 光线投射算法实现
本节给出光线投射算法的着色程序实现代码。依然是分为三个部分:结构体、顶点着色程序和片段着色程序。
代码 22 光线投射算法结构体
struct VertexIn
{
float4 position : POSITION;
float4 texCoord: TEXCOORD;
};
struct VertexScreen
{
float4 position : POSITION;
float4 worldPos : TEXCOORD0;
float4 projPos : TEXCOORD1;
float4 texCoord : TEXCOORD2;
};
代码 23 光线投射算法顶点着色程序
VertexScreen main_v(VertexIn posIn,
uniform float4x4 world,
uniform float4x4 worldViewProj,
uniform float4x4 texViewProj)
{
VertexScreen posOut;
posOut.position = mul(worldViewProj, posIn.position);
posOut.worldPos = mul(world,posIn.position);
posOut.projPos = mul(texViewProj, posOut.worldPos);
posOut.texCoord = posIn.texCoord;
return posOut;
}
代码 24 光线投射算法片段着色程序
void main_f(VertexScreen posIn,
uniform float3 eyePosition,
uniform sampler3D volumeTex: register(s0),
uniform sampler2D frontDepthTex: register(s1) ,
uniform sampler2D backDepthTex: register(s2) ,
out float4 result : COLOR)
{
// 根据视点和当前顶点世界坐标计算方向
float3 dir = posIn.worldPos.xyz-eyePosition;
dir = normalize(dir);
float3 deltaDir = float3(0.0, 0.0, 0.0);
// 获取当前顶点的三维纹理坐标
float3 tex = posIn.texCoord.xyz;
float2 uvDelta;
uvDelta.x = 0.0;//ddx( tex ).x;
uvDelta.y = 0.0;//ddy( tex ).y;
// 取出深度间隔值 , 并设置采样间隔
float2 uv= posIn.projPos.xy/posIn.projPos.w;
float frontDis = tex2D(frontDepthTex,uv).x;
float backDis = tex2D(backDepthTex,uv).x;
float len = backDis-frontDis;
// 初始化颜色值、采样值、透明度
float3 norm_dir = normalize(dir);
float stepsize = 0.01;
float delta = stepsize;
float3 delta_dir = norm_dir * delta;
float delta_dir_len = length(delta_dir);
float3 vec = posIn.texCoord.xyz;
float4 col_acc = float4(0,0,0,0);
float alpha_acc = 0;
float length_acc = 0;
float4 color_sample;
float alpha_sample;
for(int i = 0; i < 800; i++){
color_sample = tex3D(volumeTex,vec);
alpha_sample = color_sample.a * stepsize;
col_acc += (1.0 - alpha_acc) * color_sample * alpha_sample * 3;
alpha_acc += alpha_sample;
vec += delta_dir;
length_acc += delta_dir_len;
if(length_acc >= len || alpha_acc > 1.0) break; // 采样循环控制条件
}
result.xyz = col_acc.xyz*2.0+float3(0.2,0.2,0.2);
result.w = col_acc.w;
}
15.5 本章小结
本书的第14 、15 章阐述了体绘制中光线投射算法的基本原理和实现流程。实际上,在此基础上可以对光线投射算法加以扩展,例如将光线投射算法和阴影绘制算法相结合,可以渲染出真实感更强的图像。
此外,有些体数据是中间是空的,在射线方向上进行采样时需要跳过空区域,这其中也需要额外的算法处理,在英文中称为“Object-Order Empty Space Skipping ”。
目前我所发现关于体绘制以及光线投射算法最好的教材是Markus Hadwiger 等人所写的“Advanced Illumination Techniques for GPU-Based Volume Raycasting ”。此书发表在SIGGRAPH ASIA2008 上,是目前所能找到最新也是非常权威的教材,共166 页。英文阅读能力比较好的同学可以尝试着看一下。
本章已经是此书的最后一章,最后希望中国的计算机科学可以真正上升到科学研究的层次,而不是一直在混沌中热衷做泥瓦匠的工作。
转载于:https://www.cnblogs.com/zhizhan/p/3971750.html
体绘制(Volume Rendering)概述之4:光线投射算法(Ray Casting)实现流程和代码(基于CPU的实现)...相关推荐
- 体绘制(Volume Rendering)概述
摘抄"GPU Programming And Cg Language Primer 1rd Edition" 中文名"GPU编程与CG语言之阳春白雪下里巴人" ...
- 体绘制(Volume Rendering)概述介绍
1.体绘制(Volume Rendering)概述之1:什么是体绘制? http://blog.csdn.net/liu_lin_xm/article/details/4850575 2.体绘制(Vo ...
- 体绘制(Volume Rendering)概述之1:什么是体绘制?
摘抄"GPU Programming And Cg Language Primer 1rd Edition" 中文 名"GPU编程与CG语言之阳春白雪下里巴人" ...
- 【GPU编程】基于GPU的光线投射体绘制(GPU-Based Ray-Casting Volume Rendering)入门学习
基于GPU的光线投射体绘制 这篇文字将会讲述怎么运用OpenGL和nVidia Cg进行基于GPU的光线投射体绘制. 读者最好具有OpenGL和顶点-片段渲染的相关经验. 首先,我们为什么需要这个算法 ...
- 直接体绘制(Direct Volume Rendering)原理
文章目录 什么是体绘制? 体绘制与面绘制的区别? 什么是科学可视化? 体绘制与科学可视化的关系? 体绘制的应用领域? 体绘制与透明光照模型? 什么是体数据? 什么是体素? 体绘制算法之光线投射算法 光 ...
- Nerf论文前后介绍以及今后方向(2020年各个方向工作论文分析) NEURAL VOLUME RENDERING:NERF AND BEYOND
你好! 这里是"出门吃三碗饭"本人, 本文章接下来将介绍2020年对Nerf工作的一篇总结论文NEURAL VOLUME RENDERING:NERF AND BEYOND,论文作 ...
- 基于SOM网络和归一化切割(Ncut)的双层聚类和体可视化(光线投射算法)
原文 A two-level clustering approach for multidimensional transfer function specification in volume vis ...
- NeuS: Learning Neural Implicit Surfaces by Volume Rendering for Multi-view Reconstruction
Paper_Reading(不定时更新版) (仅为个人记录,若有错误,请指正) Nerf:因为缺乏曲面约束,导致从学习到的隐式表示中提取到高质量的曲面较为困难. NeuS目的: In NeuS, th ...
- WebGL Volume Rendering Made Easy
WebGL Volume Rendering Made Easy WebGL Volume Rendering Made Easy 1.转换.raw文件成为一张16x16的png图片 2.2个rend ...
最新文章
- ios 代码设置控件宽高比_用宽高比调整UIImage的大小?
- 粒子系统(一):从零开始画一颗树
- GLSL中 Billboard和Point的顶点空间变换
- windows内核初窥(二)-----系统机制
- Python多级菜单
- mysql 临时表循环_在游标循环中查询临时表可以,但是结束循环后就无法查询了。...
- HTTP 错误 404.2 - Not Found 由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面。...
- 活动目录中组的类型和可用范围
- 设置居中_安卓手机时间怎么显示在中间 时间居中设置教程
- 9.深入分布式缓存:从原理到实践 --- Tair探秘
- C++--第1课 - C到C++的升级
- 采用AOP 的观点来 Log 所有方法的调用
- 【Demo】文件下载操作(console版和web版)
- JavaScript 进阶技能,中高级前端必备
- ActionForm的详解
- 磁力链接文件服务器,什么是磁力链接(BT、磁力链这些词语是什么意思?)
- Codeforces - 1102F - Elongated Matrix(建图 + 哈密顿通路)
- c语言 教学大纲,C语言教学大纲 ).doc
- ST-link驱动下载、安装、配置和升级
- 四川汶川县今天又连发生地震!