效果图:

使用phong着色模型,将环境光、物体的漫反射光、镜面光三种光效加合而得到上图的效果

raymarch 的shader代码:

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

Shader "RayMarch/Primitives1_phong"
{Properties{_MainTex("Texture", 2D) = "white" {}}SubShader{Tags{ "RenderType" = "Opaque" }LOD 100Pass{CGPROGRAM
#pragma vertex vert
#pragma fragment frag#include "UnityCG.cginc"
#include "Lighting.cginc"#define PointLightPos fixed3(0, 3, 0)
#define LightColor float3(1,1,1)
#define GlobalAmibent float3(0.1,0.1,0.1)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), 0);float2 ball_1 = float2(sdSphere(pos, float3(0, 0, 2), 0.5), 1);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), 3);//求物体的并集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 BasicPhong(fixed3 lightDir, fixed3 normalDir, fixed3 viewDir, int matIndex) {float Ka = 1, Kd = 1, Ks = 1, Shininess = 7;float3 matColor = float3(0.5, 0.5, 0);switch (matIndex) {case -1://极远处matColor = float3(0, 0, 0); break;case 0:matColor = float3(0.1, 0.1, 0.1); break;case 1:matColor = float3(0.5, 0.5, 0); Shininess = 30;break;case 2:matColor = float3(0, 0.5, 0.5); break;case 3:matColor = float3(0.5, 0, 0.5); break;default:break;}float3 amibent = Ka * GlobalAmibent * matColor;float3 diffuse = Kd * LightColor * clamp(dot(normalDir, lightDir), 0, 1) * matColor;fixed3 reflectDir = reflect(-lightDir, normalDir);float3 specular = Ks * LightColor * pow(clamp(dot(viewDir, reflectDir), 0, 1), Shininess) * matColor;float3 color = amibent + diffuse + specular;return color;}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);fixed3 lightPos = PointLightPos;fixed3 lightDir = normalize(lightPos - pos);float3 col = BasicPhong(lightDir, nor, rd, m);return col;}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/7607111.html

Unity3D-RayMarch-几何图元1-添加基本着色模型相关推荐

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

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

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

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

  3. osg 基本几何图元

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

  4. Ogre procedural 几何图元库

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

  5. QGraphicsItem基本图元的添加以及闪烁图元和移动图元的添加

    基本图元有:椭圆,多边形,长方形,文字,图片等图元 通过代码演示各种图元的添加: ①主窗口头文(QMainWindow): #ifndef MAINWINDOW_H #define MAINWINDO ...

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

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

  7. lisp将图元追加选择_晓东CAD家园-论坛-A/VLISP-向块添加新图元,添加图元到块内 - Powered by Discuz!...

    (defun $add-ents>block$ (ents block / copy-zt dxf mat mxm mxv objs ref->def trp B-O) ;块外图元复制到块 ...

  8. Unity3D开发:为地形添加水源和效果

    第一步:添加水面 由于我在上一次的地形创作中就已经在山峰之间制作了一块洼地,它就可以作为一个放置湖水的地方.如果您上次的创作并没有这样的地形,那么请您重新创建一个山势地形图,就当作自己的一次练习吧. ...

  9. 计算机图形学(七)-深度缓存、着色shadding、着色模型、着色频率、渲染管线

    shadding-着色 1 深度缓存 1.1 从画家算法到深度缓存 1.2 深度缓存 1.2.1 深度缓存深度缓存的实现方法 1.2.2 深度缓存注意事项 2 着色shadding 2.1 着色模型 ...

最新文章

  1. 你认为是宽渠道好还是窄渠道好?请做具体分析
  2. Javascript中使用正则表达式进行数据验证
  3. NOIP模拟测试16「Drink·blue·weed」
  4. [解读REST] 3.基于网络应用的架构
  5. MySQL Cluster 4个数据节点压力测试--mysqlslap工具压400W写
  6. jquery自定义一个放大镜
  7. UVA10735 Euler Circuit题解
  8. python 中list的操作(循环、切片、增、删、改、查、反转、排序)
  9. java优先级 六级和七级_百度知道六级和七级得区别是什么?如何升到七级?
  10. 【MM32F5270开发板试用】+RFID门禁
  11. 截图工具Snipaste
  12. pytorch的变量variable
  13. mysql的全量备份和增量备份
  14. 嵌入式linux系统蜂鸣器实验,嵌入式系统原理实验四蜂鸣器.docx
  15. user-modify
  16. 转盘抽奖脚本html,js抽奖转盘实现方法分析
  17. linux 编辑文件命令
  18. html怎样制作背题模式和答题模式,科目一背题模式还是答题模式,技巧口诀答题...
  19. 业务逻辑漏洞之水平越权和垂直越权
  20. 常见测试场景用例设计(1):登录页面测试用例

热门文章

  1. 实体 联系 模型mysql_数据库实体联系模型与关系模型
  2. php中文网侵权事件,【杂谈】程序员删库跑路事件,php中文网的几点声明!
  3. python exe enter退出,Python程序退出处理程序(atexit)
  4. mysql主从安装配置_mysql主从安装配置
  5. mysql分组后再分组_全网最全的mysql分组后取topN的解答
  6. 面向对象方法的优势简化软件开发的过程_Java面试题说一说你的对面向过程和面向对象的理解...
  7. php-fpm 的参数,php-fpm启动参数配置详解
  8. PHP教程 数据库和MySQL_PHP教程 - MySQL 创建数据库和表
  9. Python数据分析学习笔记:计算向量夹角
  10. 15.立体几何——立体,基本概念,随机点立体图,立体估计深度_2