10. Volumetric Shaders

50. Volumetric Rendering体渲

体积渲染技术,是可以应用在一个形状里再画一个shap。

从正方体网格表面发射射线,碰到球表面像素(假想)变色。只着色视角方向的像素。

  1. 创建一个射线:从摄像机出发到达片元的世界坐标.

    1. 为什么要从摄像机出发?因为屏幕就是从摄像机位置出发。

2.从表面向内部按照steps延长射线。直到碰到所画图形表面。

  1. 如果射线击中假想球表面,则该片元返回球的颜色,否则更改位置,进入下一步长。
Shader "NiksShaders/Shader67Unlit"
{Properties{_Radius("Radius", Float) = 0.4_Center("Center", Vector) = (0,0,0,0)_SphereColor("Color", Color) = (0,0,1,1)}SubShader{Tags { "RenderType"="Opaque" }LOD 100Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#define STEPS 100 #define STEP_SIZE 0.0175float _Radius;float3 _Center;fixed4 _SphereColor;struct v2f {float4 position : SV_POSITION; // Clip spacefloat4 worldPos : TEXCOORD1; // World position};// Vertex functionv2f vert (appdata_base v){v2f o;o.position = UnityObjectToClipPos(v.vertex);o.worldPos = mul(unity_ObjectToWorld, v.vertex); return o;}fixed4 raymarch(float3 posiiton,float3 direction){//通过这个循环来找到要涂色的点for (int i = 0;i < STEPS;i++){if (length(posiiton - _Center) < _Radius)return _SphereColor;posiiton += direction * STEP_SIZE;//没找到就加上步长继续找}return fixed4(1,1,1,-0.1);}// Fragment functionfixed4 frag (v2f i) : SV_Target{float3 viewDir = normalize(i.worldPos.xyz - _WorldSpaceCameraPos);//viewDir = normalize(-UnityWorldSpaceViewDir(i.worldPos.xyz));fixed4 col = raymarch(i.worldPos,viewDir);clip(col);return col;}ENDCG}}FallBack off
}

50.1 STEPS 和STEP_SIZE

  • STEPS用来控制步数,也就是精细程度

  • STEP_SIZE是具体算出来刚好覆盖最长边

  • 怎么算出来的呢?

    1. 因为立方体的最长边12+12+12=3≈1.73\sqrt{1^2 + 1^2 + 1^2} = \sqrt{3}\approx1.7312+12+12​=3​≈1.73
    2. 然后我们控制 精细程度 STEPS = 100
    3. 就能得出STEP_SIZE = 0.0173

50.2 关于WorldSpaceViewDir和UnityWorldSpaceViewDir和透视除法

这里我修改了一下,因为默认的帮助参数_WorldSpaceCameraPos返回的就是float3,所以用i.worldPos.xyz

  • WorldSpaceViewDir(float4 vertex)也就是原生顶点。所以这个函数多用于顶点着色器,如果片元着色器要用就麻烦了,因为我们只有在v2f中定义了v.vertex后才有这个。

  • UnityWorldSpaceViewDir(float3 worldPos)也就是经过变换后的世界空间的坐标,是Unity改进后的函数,方便用于顶点和片元着色器,因为在顶点着色器中,我们通常啥原始数据都有,啥经过坐标变换的数据也有,所以顶点着色器对帮助函数兼容性很高。主要解决片元着色器的使用问题,一般在v2f中都会定义worldPos这就方便了,直接传入就能使用。

  • 两者均返回从物体顶点射向摄像机的向量。

  • 这里我们使用的是从摄像机射向物体的,所以要取负。记不记得在49.2中我们使用reflect函数也取了负,去看一看吧?

  • 这里还有一点,就是经过帮助函数调用之后,返回的射线,向量,位置,大部分都是Vector3,很少有4了(如果得出的是仍需要进行计算的量,很有可能就有4,比如ComputeScreenPos,ComputeGrabScreenPos,计算出来之后得到的是剪裁空间的纹理,需要用透视除法,才能转换到屏幕空间)

51. Using textures in the render

从正方体网格表面发射射线,

奇妙的0.5又出现了,除了在3.2中,这里floor算index也有.这是对于这个物体而言,中心实在(0.5,0.5,0.5)的,我们要将pos范围变到(0,1)方便uv计算。

利用贴图完成体积雾。

具体shader如下:

Shader "NiksShaders/Shader68Unlit"
{Properties{_Radius("Radius", Float) = 0.4_Center("Center", Vector) = (0,0,0,0)_Tex("Tex", 2D) = "white" {}}SubShader{Tags { "RenderType"="Transparent" "Queue"="Transparent" }LOD 100Pass{Blend SrcAlpha OneMinusSrcAlphaZWrite offCGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"float _Radius;float3 _Center;sampler2D _Tex;struct v2f {float4 position : SV_POSITION; // Clip spacefloat3 worldPos : TEXCOORD1; // World position};// Vertex functionv2f vert (appdata_base v){v2f o;o.position = UnityObjectToClipPos(v.vertex);o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz; return o;}float raymarch(float3 position,float3 direction){float alpha = 0;int steps = 144;float step_size = 1.0 / steps;for (int i = 0; i < steps; i++){int index = floor((position.z - _Center.z + 0.5) * steps);//这里算出来的z是在(0,1)之间的,然后乘以steps,算的是按深度使用哪张贴图float2 uv = saturate(position.xy - _Center.xy + 0.5);//按照xy来算出uv是多少在(0,1)范围内float2 offset = float2(fmod(index,12),floor(float(index)/12.0));//余数:x上第几张,商:y上的第几张,再加上uv就得出是哪个offset上的uv//所以offset用来定位具体的小图片,uv是该图片上的纹理定位,但是这时按照正常大小算的,我们现在的图片是缩小了的,所以每边都要除以12来缩小。//为什么不是144呢?注意,这里是float2float2 newuv = (uv + offset)/12;float texel = tex2D(_Tex,newuv).r;//r通道是1,则不透明alpha += texel * step_size;//累加从表面开始射入的射线到达每个深度的alpha,最后结果反应在表面position += direction * step_size;}return alpha;}// Fragment functionfixed4 frag (v2f i) : SV_Target{float3 viewDirection = normalize(i.worldPos - _WorldSpaceCameraPos);float alpha = raymarch(i.worldPos,viewDirection);return fixed4(1,1,1,alpha);}ENDCG}}FallBack off
}

10.Volumetric Shaders相关推荐

  1. A卡速度表以及软件的设置参数(二…

    A卡速度表以及软件的设置参数(二)     很多朋友在使用CG或者REAPER的时候 出现各种错误  error 28  error16 等等   大多跟conf文件的配置有关,下面附一个权威的参数表 ...

  2. IT类英文电子书存档页面

    为什么80%的码农都做不了架构师?>>>    http://www.salttiger.com/archives/ 目前我主要在以下两个网站收集编程类的电子书,在这上面找不到的书, ...

  3. H3CNE最新版官网考试模拟题库

    以下工作于OSI 参考模型数据链路层的设备是__A____.(选择一项或多项) A. 广域网交换机 B. 路由器 C. 中继器 D. 集线器 A 数据链路层传输的是帧,交换机是基于帧转发的:B 路由器 ...

  4. Direct3D 10教程3:Shaders和Effect系统

    概览 在前面的教程中,我们设置一个顶点缓存并将一个三角形传递到GPU.现在,我们将看一下图形管线的各个阶段是如何工作的,我们会解释shader的概念和effect系统. 注意:这个教程的共享前一个教程 ...

  5. 《Real-Time Rendering 4th Edition》全文翻译 - 第3章 图形处理单元(GPU)(下)3.7 ~ 3.10

    赶在 2019 结束之前把第三章结束,提前祝大家新年快乐! 实时渲染(第四版)Real-Time Rendering (Fourth Edition) 第3章 图形处理单元(GPU) Chapter ...

  6. c# 数据可视化_#OpenVisConf上的22位数据可视化从业者的10点收获

    c# 数据可视化 by Siena Duplan 通过锡耶纳·杜普兰(Siena Duplan) #OpenVisConf上的22位数据可视化从业者的10点收获 (10 Takeaways from ...

  7. 一文盘点10大移动端机器学习框架

    本文介绍了适用于移动端的 10 个机器学习框架,包括针对计算机的机器学习框架和针对手机端的优化性能的框架. 本文介绍了适用于移动端的 10 个机器学习框架,包括针对计算机的机器学习框架和针对手机端的优 ...

  8. VTK:Shaders之MarbleShaderDemo

    VTK:Shaders之MarbleShaderDemo VTK:Shaders之MarbleShaderDemo 描述 参数 代码 MarbleShaderDemo.cxx CMakeLists.t ...

  9. VTK:Shaders之MarbleShader

    VTK:Shaders之MarbleShader VTK:Shaders之MarbleShader 描述 参数 代码 MarbleShader.cxx CMakeLists.txt VTK:Shade ...

最新文章

  1. 机器的深度学习究竟有多“深”?
  2. matlab中ss函数_matlab ss函数 tf函数
  3. HTTPS协议,SSL协议及完整交互过程
  4. 安装oracle11g时,Enterprise Manager配置成功,出现以下警告……
  5. python的序列化是什么意思_python什么是反序列化?
  6. 流媒体开发之开源项目live555---live555 server 编译 包括更改帧率大小
  7. Java IO流读取/写入/修改某个字符串(通用)
  8. t-sql 调用作业
  9. 人脸识别版本目前的问题
  10. 潜移默化学会WPF(样式)-- DataGrid(转载)
  11. 读书笔记∣元数据:用数据的数据管理你的世界 Ch.5-8
  12. 怎么删除计算机的一个用户名和密码,哪位晓得电脑有两个账户怎么删除一个
  13. ARC077C pushpush 递推
  14. matlab如何用二分法求函数零点,如何用二分法求函数的“零点”的近似值
  15. 人的命,三分天注定,七分靠打拼,有梦就会红,爱拼才会赢
  16. c++实验题:设计两个酒店管理员客房管理的类:一个是Person类,要求储存房号、客户姓名和身份证号的信息;另一个类是Client类,要求新增客户的订房、退房和消费金额等信息,并给出相关测试算法。
  17. 简单的node文件上传下载及中文乱码问题解决
  18. 改进YOLOv7系列:首发结合最新Transformer视觉模型MOAT结构:交替移动卷积和注意力带来强大的Transformer视觉模型,超强的提升
  19. bootstarp怎么使盒子到最右边_8+ | 从恐龙特急克塞号到小猪佩奇,怎么都有它
  20. 写一些我工作中遇到的问题吧

热门文章

  1. SOA (百度百科)
  2. 联机分析处理 OLAP
  3. 信息论与编码习题(一)
  4. Mac重复文件清理软件Cisdem Duplicate Finder Mac
  5. C#语言开发规范-ching版
  6. 视觉机器学习20讲-MATLAB源码示例(8)-Adaboost算法
  7. 太实用了!你的视频播放量低?5个小技巧教你快速提升播放量
  8. 数据结构:顺序栈基本操作(入栈和出栈)C语言详解(转载)by解学武
  9. 前端如何处理emoji表情符号
  10. C++1——控制语句章节