Unity3D-RayMarch-几何图元1-添加基本着色模型
效果图:

使用phong着色模型,将环境光、物体的漫反射光、镜面光三种光效加合而得到上图的效果
raymarch 的shader代码:
// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
Shader "RayMarch/Primitives1_phong"
{
Properties
{
_MainTex("Texture", 2D) = "white" {}
}
SubShader
{
Tags{ "RenderType" = "Opaque" }
LOD
Pass
{
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 scene
float2 map(in float3 pos)
{
//plane
//float2(x,y)的第二个参数定义了该物体的材质id,在render环节,可以根据id做不同处理
float2 plane = float2(sdPlane(pos, -);
float2 ball_1 = float2(sdSphere(pos, float3(, , ), );
float2 ball_2 = float2(sdSphere(pos, float3(, , ), );
float2 ball_3 = float2(sdSphere(pos, float3(-, , ), );
//求物体的并集
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;
//材质id
float m = -1.0;
//最大迭代次数定位64
; i<; i++)
{
//距离精度随距离的增加而减小
float precis = 0.0005*t;
//获得场景中物体距离该点的距离,及距离最近物体的材质id
float2 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) {
, Kd = , Ks = , Shininess = ;
float3 matColor = float3();
switch (matIndex) {
:
//极远处
matColor = float3(, , );
break;
:
matColor = float3(0.1, 0.1, 0.1);
break;
:
matColor = float3(); Shininess = ;
break;
:
matColor = float3(, 0.5, 0.5);
break;
:
matColor = float3(, 0.5);
break;
default:
break;
}
float3 amibent = Ka * GlobalAmibent * matColor;
float3 diffuse = Kd * LightColor * clamp(dot(normalDir, lightDir), , ) * matColor;
fixed3 reflectDir = reflect(-lightDir, normalDir);
float3 specular = Ks * LightColor * pow(clamp(dot(viewDir, reflectDir), , ), 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(,,-);
//投影面某点坐标
float3 p = float3(i.uv - float2();
//投掷射线
float3 rd = normalize(p - ro);
fixed4 col = fixed4(render(ro, rd).rgb, );
// gamma校正
col.rgb = pow(col.rgb, float3(0.4545, 0.4545, 0.4545));
return col;
}
ENDCG
}
}
}
Unity3D-RayMarch-几何图元1-添加基本着色模型的更多相关文章
- osg 基本几何图元
转自:osg 基本几何图元 //osg 基本几何图元 // ogs中所有加入场景中的数据都会加入到一个Group类对象中,几何图元作为一个对象由osg::Geode类来组织管理. // 绘制几何图元对 ...
- OpenCV入门系列教学(三)绘制几何形状及添加文本
一.绘制简单的几何形状和添加文本 opencv中绘制图形很简单,我们只需要使用下面这些常用函数即可. #画线 cv2.line() #画圆 cv2.circle() #画矩形 cv. rectangl ...
- Django编写RESTful API(五):添加超链接提高模型间的关联性
前言 在第四篇中,加入了用户模型,以及相关的认证和权限的功能.但是我们在使用的时候,会发现在访问http://127.0.0.1:8000/users/时看到的用户列表,不能够直接点击某个链接然后查看 ...
- ROS * 通过launch文件添加多个模型
我添加的是dae模型,urdf文件过两天贴 方法一 : <launch> <!-- these are the arguments you can pass this launch ...
- Unity3D NGUI 给button按钮添加单间事件
Unity3D中, NGUI 给button按钮添加单间事件的方法很多,在这里只给推荐一种比较常用的方法. 推荐方法:使用UIListener. 1.给button组价添加上UIListener.选择 ...
- Unity3D-RayMarch-几何图元-3添加阴影
效果图: 在RayMarch渲染算法中计算阴影非常简单,当射线碰撞到物体,从碰撞点逆着光源方向再次执行射线步进算法,如果这一过程中碰撞到了其他物体,则碰撞点被其他物体遮挡,该处具有阴影. shader ...
- Unity3D Animator控制参数和添加事件
Animator控制参数和添加事件 using UnityEngine; using System.Collections; public class AniControl : MonoBehavio ...
- openGl超级宝典学习笔记 (2) 7个主要的几何图元
点(GL_POINTS): 点总是正方形的像素,默认情况下,点的大小不受透视除法影响. 即无论与视点的距离怎样,它的大小都不改变.为了获得圆点.必须在抗锯齿模式下绘制点. 能够用glPointSize ...
- 【学习笔记】OSG 基本几何图元
例:geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS,0,4)); 来指定要利用这些数据生成一个怎么样的形状. ...
随机推荐
- Windows环境下在sublime text3配置C编译环境
1. 检查本机有没有安装GCC,没有的话先进行安装 2. 选择 sublime 的Tools->Build System->New Build System,建立配置文件,文件命名为C.s ...
- 使用Pycharm创建Django项目
一.安装django pip install django 二.创建空django项目 选择New Project...打开创建项目向导. 成功创建一个空Django项目. 创建好的项目可以看到,已经 ...
- Android 开发 使用javax.mail发送邮件。
简介 sun公司开源的邮件发送工具. 依赖 implementation 'com.sun.mail:android-mail:1.6.0' implementation 'com.sun.mail: ...
- 关于前段JS代码报错问题的解决方法
最近接手别人的一个项目,项目导入到Myeclipse中,JS代码一直报错,说missing semicolon.该错误是Myeclipse在检查JS代码的过程出现的. 后来经过检查,发现JS代码本身没 ...
- 简介C#读取XML的方式(转)
在程序中访问进而操作XML文件一般有两种模型,分别是使用DOM(文档对象模型)和流模型,使用DOM的好处在于它允许编辑和更新XML文档,可以随机访问文档中的数据,可以使用XPath查询. XML作用 ...
- 2018-2019-2 网络对抗技术 20165304 Exp4 恶意代码分析
2018-2019-2 网络对抗技术 20165304 Exp4 恶意代码分析 原理与实践说明 1.实践目标 监控你自己系统的运行状态,看有没有可疑的程序在运行. 分析一个恶意软件,就分析Exp2或E ...
- 常用的js代码合集
!function(util){ window.Utils = util(); }( function(){ //document_event_attributes var DEA = "d ...
- EMQTT本地源码搭建填坑记录
因业务需求需要本地搭建一个emqtt的消息队列服务器,根据官网提示搭建失败,具体如下 官方步骤: Erlang 安装: http://www.erlang.org/ MSYS2 安装: http:// ...
- 几种解决方法:idea 找不到符号或找不到包
一. idea找不到符号,可能是因为编码问题,所以,在File->settings->Editor->File Encodings-找到编码设置,更改为项目的编码要求,一般都为utf ...
- 基于WebGL架构的3D可视化平台ThingJS-搭建设备管理系统
国内高层建筑不断兴建,它的特点是高度高.层数多.体量大.面积可达几万平方米到几十万平方米.这些建筑都是一个个庞然大物,高高的耸立在地面上,这是它的外观,而随之带来的内部的建筑设备也是大量的.为了提高设 ...