效果图:

将下面的shader代码对应的Material拖给一个面片,即可看到效果。

shader代码:

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'

Shader "RayMarch/Primitives0_diffuse"
{Properties{_MainTex ("Texture", 2D) = "white" {}}SubShader{Tags { "RenderType"="Opaque" }LOD 100Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;};sampler2D _MainTex;float4 _MainTex_ST;//###################################################################################//sdf:define primitives float sdPlane(float3 p,float planeYPos){return p.y - planeYPos;}float sdSphere(float3 p, float3 spherePos, float radius){return length(p - spherePos) - radius;}//###################################################################################//###################################################################################//primitives boolean operation//求并集
            float2 opU(float2 d1, float2 d2){return (d1.x<d2.x) ? d1 : d2;}    //###################################################################################// define the scenefloat2 map(in float3 pos){//plane//float2(x,y)的第二个参数定义了该物体的材质id,在render环节,可以根据id做不同处理float2 plane = float2(sdPlane(pos, -0.5), 1);float2 ball_1 = float2(sdSphere(pos, float3(0, 0, 2), 0.5), 2);float2 ball_2 = float2(sdSphere(pos, float3(2, 0, 5), 0.5), 2);float2 ball_3 = float2(sdSphere(pos, float3(-2, 0, 5), 0.5), 2);//求物体的并集float2 res = opU(opU(opU(ball_1, ball_2), ball_3),plane);return res;}float2 castRay(in float3 ro, in float3 rd){float tmin = 1.0;//射线最大允许经过的距离float tmax = 100.0;//当前已经过的距离float t = tmin;//材质idfloat m = -1.0;//最大迭代次数定位64for (int i = 0; i<64; i++){//距离精度随距离的增加而减小float precis = 0.0005*t;//获得场景中物体距离该点的距离,及距离最近物体的材质idfloat2 res = map(ro + rd*t);//如果与场景物体发生碰撞,或者射线行进距离超出最大范围,则跳出迭代if (res.x<precis || t>tmax) break;t += res.x;m = res.y;}if (t>tmax) m = -1.0;return float2(t, m);}//计算碰撞点处物体表面的法线float3 calcNormal(in float3 pos){float3 eps = float3(0.0005, 0.0, 0.0);float3 nor = float3(map(pos + eps.xyy).x - map(pos - eps.xyy).x,map(pos + eps.yxy).x - map(pos - eps.yxy).x,map(pos + eps.yyx).x - map(pos - eps.yyx).x);return normalize(nor);}float3 render(in float3 ro, in float3 rd){//投掷射线,获得与所场景物体的碰撞信息float2 res = castRay(ro, rd);float t = res.x;float m = res.y;float3 pos = ro + t*rd;float3 nor = calcNormal(pos);float3 ref = reflect(rd, nor);//漫反射着色fixed3 lightPos = fixed3(0, 3, 0);fixed3 lightDir = normalize(lightPos - pos);float dif = clamp(dot(nor, lightDir),0, 1);float3 col = float3(dif, dif, dif);return float3(clamp(col, 0.0, 1.0));}v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);return o;}fixed4 frag (v2f i) : SV_Target{//虚拟摄像机坐标float3 ro = float3(0,0,-1);//投影面某点坐标float3 p = float3(i.uv - float2(0.5, 0.5),0);//投掷射线float3 rd = normalize(p - ro);fixed4 col = fixed4(render(ro, rd).rgb, 1);// gamma校正col.rgb = pow(col.rgb, float3(0.4545, 0.4545, 0.4545));return col;}ENDCG}}
}

转载于:https://www.cnblogs.com/bluebean/p/7402042.html

Unity3D-RayMarch-几何图元0相关推荐

  1. 使用基本几何图元在道路上实现准确高效的自定位

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 摘要(Abstract) 在非常有限的内存和计算能力的条件下实现准确定位是下一代汽车序列的一大挑战.本 ...

  2. osg画线_osg 基本几何图元

    //osg 基本几何图元//ogs中所有加入场景中的数据都会加入到一个Group类对象中,几何图元作为一个对象由osg::Geode类来组织管理.//绘制几何图元对象时,先创建一个Geometry对象 ...

  3. osg 基本几何图元

    ogs中所有加入场景中的数据都会加入到一个Group类对象中,几何图元作为一个对象由osg::Geode类来组织管理.绘制几何图元对象时,先创建一个Geometry对象,这个对象中要设置绘制所需的基本 ...

  4. IGES文件解析1——几何图元(更新中...)

    IGES文件解析1--几何图元 文件格式 开始段 全局段 数据索引段DE 数据参数PD 结束段 几何图元 圆弧(100型) 复合曲线(102型) 圆锥曲线(104型) 大量数据(类型 106) 平面( ...

  5. Ogre procedural 几何图元库

    概述:  Ogre procedural 几何图元库是Ogre3D的基本图元库.使我们可以快速的创建几何图元,比如立方体, 球, 圆锥等. 几何图元包含:  Box 盒子  RounderBox 弧形 ...

  6. 【学习笔记】OSG 基本几何图元

    例:geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS,0,4)); 来指定要利用这些数据生成一个怎么样的形状. ...

  7. unity3d动画系统(5.0以上版本,资源在51kaifa.com中下载)

    1.Model窗口,导入资源需要调整模型比例,unity默认的单位是米,可以创建一个方块作为参照物,选中模型的文件,点击model窗口,调整scale factor然后点击apple即可. 2.Rig ...

  8. Unity3D天气系统插件UniStorm3.0插件使用说明

    1.开始使用 下载并导入UniStorm插件就能够进行使用了,该资源能够在Assets Store中搜索并下载,也能够评论我会发给你,该插件功能十分强大,内置25种天气类型,并包含音效,彻底能够知足咱 ...

  9. OSG 绘制几何图元

    文章目录 一.简介 二.相关类别 三.实现代码 3.1快速绘制(调试) 3.2标准方式 四.实现效果 参考资料 一.简介 在真正使用OSG绘制图形之前,我们可以先了解一下OpenGL是怎么绘制几何模型 ...

最新文章

  1. 第三届“达观杯”文本智能信息抽取挑战赛丰厚奖金,群英集结,等你来战!...
  2. Silverlight 4 WebBrowser的使用及调用 WebBrowser 中的 javascript 方法
  3. 多字节 unicode和utf-8的转换
  4. 物理、线性、虚拟、逻辑、有效地址
  5. python生成器迭代_python中的生成器和迭代器
  6. 神经网络代码解读_强化学习、联邦学习、图神经网络,飞桨全新工具组件详解...
  7. 第十四天-企业应用架构模式-Web表现模式
  8. 实习踩坑之路:ElasticSearch搜索出来了不是自己的数据?Elastic会像MyBatisPlus一样会帮我们做判断null的操作么?分片精确度如何控制?
  9. Padavan 老毛子路由器登录SSH教程
  10. Halcon视觉检测——使用分类器分类
  11. PMP备考大全:经典题库(敏捷管理第9期)
  12. 史上最全的app相关的面试题【多测师】
  13. 亿玛大数据揭秘“钻石网购密码” 最高单价超15万
  14. 字典树(单词查找树、Trie)
  15. Teradata:数据可视化与模型优化相辅相成
  16. SQL之对EXISTS谓词的理解
  17. jiecaovideoplayer视频播放开源框架的使用步骤
  18. linux内核内存问题检测调试
  19. 【Fuzzy】不确定规划:模糊相关机会规划与模糊随机变量
  20. WinForm实现多人聊天工具完整源码

热门文章

  1. pygame 笔记-8 背景音乐子弹音效
  2. js实现复制文本内容到剪切板
  3. Net设计模式实例之模板方法模式(Template Mothed Pattern)(1)
  4. BMP文件的读取与显示
  5. 红帽计划收购API管理领导者3scale
  6. 前端测试 karma mocha should 都是什么鬼?
  7. 镜像save保存和镜像重命名tag
  8. Maven学习——安装与修改Maven的本地仓库路径
  9. 灵玖软件大数据采集技术提高出版行业效率
  10. 让DJANGO里的get_success_url定义的reverse_lazy带参数跳转