贸商网本站服务帮助中心手机版

贸商网

  • 全站
  • 招商
  • 供应
  • 求购
  • 产品
  • 资讯
  • 展会
  • 企业
您现在的位置:贸商网 > 资讯中心 > 物联网 > 初遇Unity立体渲染

初遇Unity立体渲染

时间:2017-04-29  作者:贸商网  点击:157  评论:  字体:T|T

 初遇Unity立体渲染

近期我们将陆续推出专注于立体渲染、光线追踪、表面着色及有向距离场的Unity系列教程。本文是第一篇:立体渲染(Volumetric Rendering)。这些技术能突破现代3D引擎只能渲染物体外壳的最大限制。立体渲染可以实现逼真的材质与灯光进行复杂的交互,例如雾、烟、水和玻璃。查看NMZ的Plasma Globe效果了解立体渲染的基本概念,如下图:

 初遇Unity立体渲染

诚然,这些技术本身并不复杂,但实现上图效果需要非常多的步骤。本教程将为大家全面介绍以下概念:

● 第一篇:立体渲染。介绍立体渲染的概念以及在Unity中如何实现立体渲染。
● 第二篇:光线追踪。文章着重说明如何实现距离辅助的光线追踪,这是是渲染立体的事实性标准技术。
● 第三篇:表面着色。全面指引如何逼真地进行立体着色。
● 第四篇:有向距离场。一篇对于数学工具更深入的讨论,让我们能制作和组合任意几何体。

本文将介绍立体渲染的基本概念,并以一个简单的着色器收尾,后续的文章将以此为基础进行迭代:

● 介绍
● 第一部分 立体渲染
● 第二部分 立体射线投射
● 第三部分 固定步长的立体光线追踪
● 结论

介绍

在3D游戏引擎中,球体、立方体以及所有其它复杂的集合体都是由三角面片组成的。Unity采用的实时光照系统只能渲染平面。例如渲染球体,Unity仅绘制球体表面的三角形。尽管一些材质是半透明的,也只绘制表面并将其颜色与后面的物体进行混合。光照系统无法探测到材质的几何体的内部。对于GPU来说,整个世界就是由各种空壳构成的。

为了突破这种强大的限制,大量技术顺势而出。尽管传统着色器最终都会止于物体表面,但这并不意味着无法更深入。立体渲染技术可以在材质内部模拟光线的传送,从而实现更震撼也更真实的视觉效果。

立体渲染

无光照纹理的片段着色器如下:
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.texcoord);
return col;
}

不严格地说,上述代码会为最终渲染图像每一个可能的像素(片段)调用。GPU会在有三角形与相机视锥体相交时,调用该片段着色器。换句话说,就是相机“看见了”该对象。Unity需要知道该对象的实际颜色,以便将其分配到渲染图像的各个像素。

 初遇Unity立体渲染

片段着色器最后返回的对象,是从特定角度看过去特定位置的颜色。这种方式计算的颜色是完全随意的,因此返回的内容可以不必匹配几何体的真实渲染情况。下图展示了一个3D立方体的例子。当片段着色器检测到立方体表面的颜色时,我们获得的颜色如同我们在一个球体上所看到的。这个几何体是个立方体,但是从相机的角度来看,它的外观和感觉其实“酷似”一个球体。

 初遇Unity立体渲染

这就是立体渲染(Volumetric Rendering)的基本概念:模拟光线在物体内部的传送。

如果想模拟前面的效果,就要更精确地进行描述。假设主物体是一个立方体,要在其内部立体渲染一个球体,实际上并不存在这个球体,因为我们将完全通过着色器代码来渲染。球体中心点位于_Centre,半径是_Radius,均为世界坐标。移动立方体不会影响球体位置,因为它是完全以世界坐标系来表述的。外部的几何体也不会对该球体造成任何影响。立方体表面的三角形就是通向几何体内部的窗口。虽然可以使用四边形(Quad)减少三角形数量,但要能从立方体的任意角度观看该球体。

立体射线投射

第一种立体渲染的方式完全适用于实现前文所述的效果。片段着色器接收要渲染的点(wolrdPosition)以及视线方向(viewDirection),然后使用raycastHit函数检测是否投射到红色球体。这种技术叫做立体射线投射(Volumetric Raycasting),它将射线从相机投射到几何体内部。

在片段着色器函数中添加剩下的代码:
float3 _Centre;
float _Radius;

fixed4 frag (v2f i) : SV_Target
{
float3 worldPosition = ...
float3 viewDirection = ...
if ( raycastHit(worldPosition, viewDirection) )
return fixed4(1,0,0,1); // Red if hit the ball
else
return fixed4(1,1,1,1); // White otherwise
}

下面来解释代码中的其它变量。

世界坐标


(编辑:mao35  来源:网络整理)

顶一下
发表评论

共有0位网友发表了评论 查看完整内容


版权与免责声明:
①凡本网注明"来源:贸商网"的所有作品,版权均属于本网,转载请必须注明贸商网,违反者本网将追究相关法律责任。
②本网转载并注明自其它来源的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品来源,并自负版权等法律责任。
③如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。

网站服务:QQ:2632106543 广告洽谈:QQ:2632106543 Email:2632106543@qq.com All Right Reserved.   鲁ICP备16030072号-7

版权所有 贸商网 Copyright ©2014-2024 mao35.com