当前位置: 首页 > news >正文

[Unity Shader Base] RayMarching in Cloud Rendering

基础知识:
1.SDF 有符号距离场,且通过正负可以判断在物体外部还是内部,通常外正内负

这是RayMarching的灵魂支撑,能够通过一个数学函数,输入一个空间中的点,输出这个点到物体表面的最短距离(带符号)。可以使复杂的几何形状可以通过简单的 SDF运算来组合。比如,两个球体的 SDF 可以通过 min() 操作来融合,通过 max() 来相交,通过 abs()和减法来创造出“镂空”效果。

RayMarching 区别于正常的射线求交,根据他的中文翻译名,光线步进,可以比较生动的理解。
光并非直接打到物体表面求交然后渲染,而是每一步都计算和物体表面的SDF,从而安全前进,循环直道命中物体或者超出最大步数结束。

第一种制作方法:

球体采用XYZW四维向量,W表示球体半径
在这里插入图片描述

// 版本1:简单的球体密度测试
void raymarchv1_float(float3 rayOrigin,        // 光线起点float3 rayDirection,     // 光线方向float numSteps,          // 步进次数float stepSize,          // 步长float densityScale,      // 密度缩放float4 Sphere,           // 球体数据:xyz=中心位置, w=半径out float result         // 输出:累积密度
)
{float density = 0;// 简单步进循环for (int i = 0; i < numSteps; i++){// 沿光线方向移动rayOrigin += (rayDirection * stepSize);// 计算到球心的距离float sphereDist = distance(rayOrigin, Sphere.xyz);// 如果点在球体内,增加密度if (sphereDist < Sphere.w){density += 0.1; // 固定密度值}}// 应用密度缩放result = density * densityScale;
}

在此基础上能输出一个白色的圆环
光线步进-经典的三个参数:
numstep是步数,步数越大,光线越容易走出圆圈的范围,渲染出的效果越淡
stepSize是步长,步长越长,分层越明显, 越小,分层越不明显,越偏向全白
densityScale是密度缩放数值, result = density * densityScale;

在这里插入图片描述在这里插入图片描述

然后把球的节点更换增加一个3D体积纹理就可以变得更像云一些了

// 版本2:使用3D纹理的基本实现
void raymarchv2_float(float3 rayOrigin,        // 光线起点float3 rayDirection,     // 光线方向float numSteps,          // 步进次数float stepSize,          // 步长float densityScale,      // 密度缩放UnityTexture3D volumeTex, // 3D体积纹理UnitySamplerState volumeSampler, // 采样器float3 offset,           // 纹理偏移out float result         // 输出:累积密度
)
{float density = 0;float transmission = 0;// 基本步进循环for (int i = 0; i < numSteps; i++){// 沿光线方向移动rayOrigin += (rayDirection * stepSize);// 从3D纹理采样密度float sampledDensity = SAMPLE_TEXTURE3D(volumeTex, volumeSampler, rayOrigin + offset).r;// 累积密度density += sampledDensity;}// 应用密度缩放result = density * densityScale;
}

在这里插入图片描述
参数还是同理在这里插入图片描述
sphere四个参数控制圆心位置和半径
numsteps 确定步数,步长太少根本画不出圆,只有能走过圆的步长才能有形状,step数量确定有没有
step size 确定步长,步长越长数值越大
density scale 确定每一步的值的缩放尺寸

云越多,光线照射到物体上的光线方向数量就越少
在这里插入图片描述
最终版本的代码如下

void raymarch_float(float3 rayOrigin, float3 rayDirection, float numSteps, float stepSize,float densityScale, UnityTexture3D volumeTex, UnitySamplerState volumeSampler,float3 offset, float numLightSteps, float lightStepSize, float3 lightDir,float lightAbsorb, float darknessThreshold, float transmittance, out float3 result)
{float density = 0;float transmission = 0;float lightAccumulation = 0;float finalLight = 0;for (int i = 0; i < numSteps; i++){rayOrigin += (rayDirection * stepSize);//The blue dot positionfloat3 samplePos = rayOrigin + offset;float sampledDensity = SAMPLE_TEXTURE3D(volumeTex, volumeSampler, samplePos).r;density += sampledDensity * densityScale;//light loop   numLightSteps 数量直接影响性能float3 lightRayOrigin = samplePos;for (int j = 0; j < numLightSteps; j++){//The red dot positionlightRayOrigin += -lightDir * lightStepSize;float lightDensity = SAMPLE_TEXTURE3D(volumeTex, volumeSampler, lightRayOrigin).r;//The accumulated density from samplePos to the light - the higher this value the less light reaches samplePoslightAccumulation += lightDensity;}//The amount of light received along the ray from param rayOrigin in the direction rayDirectionfloat lightTransmission = exp(-lightAccumulation);//shadow tends to the darkness threshold as lightAccumulation risesfloat shadow = darknessThreshold + lightTransmission * (1.0 - darknessThreshold);//The final light value is accumulated based on the current density, transmittance value and the calculated shadow value finalLight += density * transmittance * shadow;//Initially a param its value is updated at each step by lightAbsorb, this sets the light lost by scatteringtransmittance *= exp(-density * lightAbsorb);}transmission = exp(-density);result = float3(finalLight, transmission, transmittance);
}
http://www.dtcms.com/a/606624.html

相关文章:

  • Java后端常用技术选型 |(六)避坑手册
  • 教育网站平台建设对网站做维护
  • RUST实现简易随机密码生成器
  • 个人主页网站网站正在建设中源码
  • 网站邮箱配置百度seo哪家公司好
  • wordpress建站 购物网页设计实训报告不足
  • 蚂蚁与浙大签约,共建大数据认知计算联合研究中心
  • Ingress、Kubernetes数据存储相关概念及相关实验案例
  • 深圳做棋牌网站建设哪家好衡水专业网站制作
  • 建设项目环境影响评价登记表网站医院网站建设方案详细
  • 虚幻引擎 5.7 现已发布
  • 构建高效的多模态AI数据平台:从海量数据到智能进化的完整指南
  • 传奇发布网站排行网站建设哪方面最重要的呢
  • 消息队列终极选型:RabbitMQ、RocketMQ、Kafka与ActiveMQ深度对比
  • 超市网站建设费用泉港网站建设推广服务公司
  • 【OpenCV + VS】图像缩放与插值
  • 拖拽式建站平台国外网站做acm题目比较好
  • Vue——vue2中的mixin有哪些问题
  • 用 Rust 打造可复现的 ASCII 艺术渲染器:从像素到字符的完整工程实践
  • 台州企业自助建站代理app软件
  • 31.网络云服务
  • 网站开发与软件开发的区别重庆企业网站开发方案
  • 深圳公司网站建设公司郑州排名前十的科技公司
  • 做画册好的网站企业查询app
  • 算法学习笔记-贪心算法总结2
  • 网站开发技术方案龙岩资讯
  • 网站建设综合训练报告演示网站怎么做
  • MySQL 内存使用:优化指南
  • 建一个收费网站 怎么收费西安建设工程信息网怎么看
  • RedHat系统搭建DNS主从服务器