9.球体阴影

上一篇讲的阴影shader是通过两个pass来渲染出的,第一个pass渲染要投影的物体本体,第二个pass渲染物体的阴影,也就是说阴影的渲染是在物体的shader中而不是地面的shader。下面要讲的球体阴影的shader是放在要接受阴影的地面上。

 原理如下图:

1.根据点的入射光矢量和点到球体的矢量计算【点积】求出【角度】。

2.通过【角度】的sin值,求出【对边】并与【球体半径】进行比较。

3.所求【对边的长度】大于【半径】,说明该点被光照,反之该点是阴影点。


// shader,放在需要接受阴影的对象上
Shader "Study/9_SphereShadow" {Properties{_spPos("Sphere pos", vector) = (0,0,0,1)_spR("radius", float) = 1_Intensity("Intensity", range(0,1)) = 0.5}SubShader{Pass{Tags{ "LightMode" = "ForwardBase" }CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"float4 _spPos;   // 球体位置float _spR;    // 球体半径float _Intensity;  // 阴影浓度float4 _LightColor0; // 颜色struct v2f {float4 pos:SV_POSITION;float3 litDir:TEXCOORD0;// 世界坐标中灯光方向矢量float3 spDir:TEXCOORD1; // 在世界坐标中投影球体方向矢量float4 vc:TEXCOORD2; // 逐顶点计算的光照};v2f vert(appdata_base v){v2f o;o.pos = mul(UNITY_MATRIX_MVP, v.vertex);// 获取顶点视图位置o.litDir = WorldSpaceLightDir(v.vertex);// 获取世界坐标中灯光对顶点的方向矢量o.spDir = (_spPos - mul(_Object2World, v.vertex)).xyz;//世界坐标中该顶点到投影球体的矢量// 顶点的光照计算。该顶点在对象坐标中的光照方向矢量float3 ldir = ObjSpaceLightDir(v.vertex);ldir = normalize(ldir);o.vc = _LightColor0 * max(0, dot(ldir, v.normal));//根据顶点的入射光线和法线角度求该顶点光照return o;}float4 frag(v2f i) :COLOR{float3 litDir = normalize(i.litDir);//获取点的入射线单位向量float3 spDir = i.spDir; // 获取该点到投影球体的矢量float spDistance = length(spDir); //该点到球体的距离spDir = normalize(spDir); //该点到投影球体的单位向量float cosV = dot(spDir, litDir);// 该点到球体 与 该点到入射线的夹角float sinV = sin(acos(max(0, cosV)));// 拿到余弦值大于0的角度,求正弦float D = sinV * spDistance;  // 解三角形,求对边float shadow = step(_spR, D); // 如果对边小于半径返回0,该点为阴影点float c = lerp(1 - _Intensity, 1, shadow);// shadow由0到1return i.vc * c; // 为0的时候是阴影点}ENDCG}}
}

这个脚本也放在需要接受阴影的对象上:

using UnityEngine;
using System.Collections;public class ReceiveShadow : MonoBehaviour {public GameObject sphere;void Start () {Vector3 pos = sphere.transform.localPosition;GetComponent<Renderer>().sharedMaterial.SetVector("_spPos", new Vector4(pos.x, pos.y, pos.z, 1f));GetComponent<Renderer>().sharedMaterial.SetFloat("_spR", sphere.transform.localScale.x / 2);}}




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246341.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css html 抽屉,CSS快速入门-前端布局1(抽屉)(示例代码)

一、效果图前面对CSS基础知识有了一定的了解&#xff0c;是时候开始实战了&#xff01;以下我对抽屉(https://dig.chouti.com/)主页进行模拟布局。官方网站效果图&#xff1a;模拟网站图&#xff1a;二、实现步骤1、整体布局(header、body、footer)抽屉的首页主要分为三块&…

10.热空气扭曲效果

Shader "Study/10_Distortion" {Properties{_NoiseTex("絮乱图", 2D) "white" {} // 絮乱图_AreaTex("区域图(Alpha)&#xff1a;白色为显示区域&#xff0c;透明为不显示区域", 2D) "white" {} // 区域图_Move…

11.Wave Shader

这个shader是在这位博主点击打开链接的文章基础上进行修改得到的&#xff0c;原作是在shadertoy网站上。不得不说&#xff0c;被shadertoy上的大神们震精了&#xff0c;真的是令我叹为观止&#xff0c;啥也不说了&#xff0c;慢慢学吧。 shader的效果&#xff1a; Shader的代码…

macpro台式计算机,Mac Pro正式上架 真的可以用来刨土豆丝

12月15日消息&#xff0c;早在6月4号WWDC全球开发者大会上就已经发布的新版Mac Pro电脑&#xff0c;近期正式上架苹果官网开销&#xff0c;某一外媒在收到2019年新版Mac Pro后&#xff0c;第一件事竟不是体验其性能&#xff0c;而是验证它是否可以用来给土豆或者奶酪刨丝。在视…

中专选计算机应用很难,对中专计算机应用基础改革的思考.pdf

对中专计算机应用基础改革的思考对 中 专 计 算 机 应 用 基 础 改 革 的 思 考许建英(许昌技术经济学校 &#xff0c;河南 长葛 461500)随着我国经济 、社会 的发展和科技 的进步&#xff0e;计算机应用技 动性 &#xff0c;让学生掌握 自主学习的学习方法 &#xff0e;提高学…

12.屏幕高斯模糊

本系列文章由浅墨_毛星云 出品&#xff0c;转载请注明出处。 文章链接&#xff1a; http://blog.csdn.net/poem_qianmo/article/details/51871531 作者&#xff1a;毛星云&#xff08;浅墨&#xff09; 微博&#xff1a;http://weibo.com/u/1723155442 本文工程使用的Uni…

广东东软学院计算机系主任罗,广东东软学院副校长朱爱红一行来访我校

3月27日&#xff0c;广东东软学院副校长朱爱红、教务部部长程江涛、品牌发展部部长李惠旋、计算机学院院长黄迅、SOVO主任吴志成、网络与信息中心主任付冬波、实验教学中心主任谢振华、图书馆馆长刘春林等一行18人来访我校。我校副校长郭权接待来访嘉宾。嘉宾一行参加调研会议嘉…

事业单位职称工资计算机,终于!事业单位绩效工资、职称变了!关系上千万人收入!...

原标题&#xff1a;终于&#xff01;事业单位绩效工资、职称变了&#xff01;关系上千万人收入&#xff01;大学生热烈追捧事业单位和公务员&#xff0c;并将其称为铁饭碗&#xff01;有很多大学生们在大学毕业之后就选择了去考公务员或者事业单位&#xff01;甚至不少同学甚至…

Unity-Find-Script-References 查找脚本的引用

背景&#xff1a; 有时候我们需要找出项目中所有的引用到某个脚本的地方&#xff08;比如Prefabs/Scene GameObjects等&#xff09;。当项目比较大时&#xff0c;手工寻找还是非常费时费力的事情。本文尝试通过插件自动搜索。 分析&#xff1a; 基本的思路是&#xff1a;首先筛…

remove是什么意思计算机语言,remove是什么意思?remove是什么意思?

remove()是C语言中的函数&#xff0c;一般作用是删除数组、链表对象所有的元素。函数原型是intremove(char*filename)。函数功能remove()函数用于删除指定的文件&#xff0c;其原型如下&#xff1a;int remove(char *filename);函数声明2&#xff1a;templateinline bool remov…

Unity3D_NGUI_安卓APK安装包瘦身实践

减包瘦身是个精细活。本文整理了0907版本操作过程&#xff0c;以备日后参考。 经过一番折腾&#xff0c;各位攻城狮的努力&#xff0c;美术设计师的支持&#xff0c;策划爷的理解&#xff0c;UI资源&#xff08;图集、字体、单局外模型贴图&#xff09;从45.4MB减少到24.5MB。如…

太原理工大于丹计算机,于丹作客太原理工大 给4000理科生讲佛学

中新网太原5月17日电(贾子娴)17日&#xff0c;著名文化学者于丹走进太原理工大学清泽讲坛&#xff0c;为近4000名师生作了一场题为“阅读经典 感悟成长”的讲座&#xff0c;并引用佛道教中的若干经典来领悟、指导人生。于丹认为&#xff0c;在这纷繁复杂的中国社会中无论男女老…

Unity3D之Shader自定义编辑器功能拓展

一、前言最近在开发一个关卡类的游戏&#xff0c;在导入一些3D物体的时候&#xff0c;发现很多时候同一个3D物体需要渲染的方式不一样&#xff0c;比如这颗树要双面渲染&#xff08;Cull Off&#xff09;&#xff0c;但在很多情况下是可以剔除背面&#xff08;Cull Back&#x…

零基础怎么学好计算机函数,零基础要学会的15个常用函数

这些函数是最基本的&#xff0c;但应用面却非常广&#xff0c;学会这些基本函数可以让工作事半功倍。1、SUM加法是最基本的数学运算之一。函数SUM就是用来承担这个任务的。SUM的参数可以是单个数字、一组数字。因此SUM的加法运算功能十分强大。统计一个单元格区域&#xff1a;s…

理解依赖注入(IOC)

IOC:英文全称&#xff1a;Inversion of Control&#xff0c;中文名称&#xff1a;控制反转&#xff0c;它还有个名字叫依赖注入&#xff08;Dependency Injection&#xff09;。 作用&#xff1a;将各层的对象以松耦合的方式组织在一起&#xff0c;解耦&#xff0c;各层对象的调…

局域网win7计算机如何互访,局域网win7电脑的互访步骤

局域网win7电脑的互访步骤Windows7如何实现局域网内的互访?下面是局域网win7电脑互访的步骤&#xff0c;为大家提供参考。步骤一&#xff1a;同步工作组 不管使用的是什么版本的Windows操作系统&#xff0c;第一步&#xff0c;要保证联网的各计算机的工作组名称一致步骤二&…

服务器自动挂载硬盘,Linux硬盘分区及开机自动挂载

本文以CentOS 6.4为例&#xff0c;查看当前linux服务器分区&#xff1a;df -h查看当前linux服务器硬盘&#xff1a;fdisk -l/dev/sda 第一块硬盘/dev/sdb 第二块硬盘依此类推以/dev/sdb为新增硬盘为例&#xff0c;需要进行以下操作方可正常使用1、分区fdisk /dev/sdb依次输入n&…

GPU Pro2 - 1.Terrain and Ocean Rendering with Hardware Tessellation

最近时间多了起来&#xff0c;准备捡起扔下了的渲染部分的知识。想拜读下GPU Pro系列并且做个笔记&#xff0c;不知道自己能否坚持下来&#xff0c;但愿可以吧。自己能力也有限&#xff0c;写的东西也只是自己的理解&#xff0c;肯定有很多理解不到位甚至错误的地方&#xff0c…

更改微软更新服务器地址,更新服务 | Microsoft Docs

您现在访问的是微软AZURE全球版技术文档网站&#xff0c;若需要访问由世纪互联运营的MICROSOFT AZURE中国区技术文档网站&#xff0c;请访问 https://docs.azure.cn.更新服务10/21/2020本文内容使用指定的更新说明更新 Service Fabric 服务。此 API 允许更新正在运行的 Service…

GPU Pro2 - 3.Procedural Content Generation on the GPU

GPU Pro2 - 3.Procedural Content Generation on the GPU 这篇文章着重介绍了基于Brownian 噪声和高度图在GPU中实时生成和渲染无限大地形系统。 Procedural content generation (PCG)程序化生成在许多游戏中已经有广泛应用&#xff0c;从简单的随机物体摆放&#xff0c;到全…