【Unity Shaders】Reflecting Your World —— Unity3D中简单的Cubemap反射
准备工作
- 创建一个新的scene,Material,和Shader,可以取名为SimpleReflection。
- 附着新的Shader到新的Material上,然后创建一个物体,并把Material赋值给它。
- 最后,创建或者找到一个Cubemap,之后将用于我们的Shader。
实现
- 首先在Properties块中创建新的properties。我们需要一个位置来得到我们的Cubemap贴图对象以及来控制反射的程度:
Properties {
- _MainTex ("Base (RGB)", 2D) = "white" {}
- _MainTint ("Diffuse Tint", Color) = (1,1,1,1)
- _Cubemap ("CubeMap", CUBE) = ""{}
- _ReflAmount ("Reflection Amount", Range(0.01, 1)) = 0.5
- }
Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _MainTint ("Diffuse Tint", Color) = (1,1,1,1) _Cubemap ("CubeMap", CUBE) = ""{} _ReflAmount ("Reflection Amount", Range(0.01, 1)) = 0.5 }
- 同样,我们还需要在SubShader块中创建和properties中各变量的联系。这将允许我们从Properties块中访问这些数据。
CGPROGRAM
- #pragma surface surf Lambert
- sampler2D _MainTex;
- samplerCUBE _Cubemap;
- float4 _MainTint;
- float _ReflAmount
CGPROGRAM #pragma surface surf Lambert sampler2D _MainTex; samplerCUBE _Cubemap; float4 _MainTint; float _ReflAmount
- 为了让我们能够模拟正确的反射角度,我们需要得到一个向量来提供给我们合适的世界反射方向。因此,我们可以使用上面提到的Unity的Surface Shaders内置的变量。在Input结构体中,下面的代码将提供给我们一个世界反射向量,来用于接下来的Shader中:
- struct Input {
- float2 uv_MainTex;
- float3 worldRefl
- };
struct Input { float2 uv_MainTex; float3 worldRefl };
- 最后,我们仅仅需要从Cubemap中得到贴图信息,即使用texCUBE函数和Input提供给我们的新的世界反射向量。添加下面的代码到你的surf函数中:
void surf (Input IN, inout SurfaceOutput o) {
- half4 c = tex2D (_MainTex, IN.uv_MainTex) * _MainTint;
- o.Emission = texCUBE(_Cubemap, IN.worldRefl).rgb * _ReflAmount;;
- o.Albedo = c.rgb;
- o.Alpha = c.a;
void surf (Input IN, inout SurfaceOutput o) { half4 c = tex2D (_MainTex, IN.uv_MainTex) * _MainTint; o.Emission = texCUBE(_Cubemap, IN.worldRefl).rgb * _ReflAmount;; o.Albedo = c.rgb; o.Alpha = c.a;
- Properties {
- _MainTint ("Diffuse Tint", Color) = (1,1,1,1)
- _MainTex ("Base (RGB)", 2D) = "white" {}
- _Cubemap ("CubeMap", CUBE) = ""{}
- _ReflAmount ("Reflection Amount", Range(0.01, 1)) = 0.5
- }
- SubShader {
- Tags { "RenderType"="Opaque" }
- LOD 200
- CGPROGRAM
- #pragma surface surf Lambert
- sampler2D _MainTex;
- samplerCUBE _Cubemap;
- float4 _MainTint;
- float _ReflAmount;
- struct Input {
- float2 uv_MainTex;
- float3 worldRefl;
- };
- void surf (Input IN, inout SurfaceOutput o) {
- half4 c = tex2D (_MainTex, IN.uv_MainTex) * _MainTint;
- o.Emission = texCUBE(_Cubemap, IN.worldRefl).rgb * _ReflAmount;;
- o.Albedo = c.rgb;
- o.Alpha = c.a;
- }
- ENDCG
- }
- FallBack "Diffuse"
- }
解释
【Unity Shaders】Reflecting Your World —— Unity3D中简单的Cubemap反射相关推荐
- 【Unity Shaders】Reflecting Your World —— Unity3D中的法线贴图和反射
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
- Unity网络(二)-Unity3D中的网络
正所谓:没有网络是没有灵魂的 欢迎关注公众号:雷潮课堂 Unity3D中的网络 一.WWW 1-1 Get 1-2 Post 1-3 案例(网络下载,本地存储与读取) 二.UnityWebReques ...
- Unity3D中简单地应用玻璃材质
最近在学习Unity3D.发现Unity3D中的玻璃效果要用到Shader才能实现.虽然简单学习了一下能看懂Shader的结构了,但要自己写一个实现自己想要的效果的Shader暂时还无能为力.这个要么 ...
- 【Unity Shaders】Reflecting Your World(反射吧!)介绍
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
- 【Unity Shaders】Lighting Models —— 灯型号Lit Sphere
考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同一时候会加上一点个人理解或拓展. 这里是本书全部的插图.这里是本书所需的代码和资源(当然你 ...
- unity游戏中提示信息如何实现_RPG游戏中的剧情在Unity3D中如何实现呢?
原标题:RPG游戏中的剧情在Unity3D中如何实现呢? RPG游戏想必不用多介绍了,剧情系统是RPG游戏中必不可少的功能. 曾经听过一些朋友谈论:目前正在做一款RPG游戏,但是不知道如何实现RPG游 ...
- (八)unity自带的着色器源码剖析之——————Unity3D的全局光照和阴影:下篇(unity3D中的球谐光照和SH球谐函数、unity实时阴影抗锯齿解决方案)
一.探针基于球谐函数的全局光照 球谐光照是基于预计算辐射度传输理论实现的一种实时渲染技术.预计算辐射度传输技术能够重现在区域面光源照射下的全局照明效果.这种技术通过在运行前对场景中光线的相互作用进行预 ...
- 【Unity Shaders】最简单的顶点/片元着色器3
微信号:ITComputerGraph 更多精彩内容,关注公众号<IT木子李> Shader "Unity Shaders/Simple Shader3" {SubSh ...
- Unity3D中项目在Unity编辑器下正常运行打包成功exe后无法正常运行
Unity3D中项目在Unity编辑器下正常运行打包成功exe后无法正常运行 一.遇到的情况描述: 项目中涉及到了文件读取的相关操作 项目在Unity下能够正常获取到文件信息并且不报错 项目能够成功打 ...
最新文章
- 如何利用 JConsole观察分析Java程序的运行,进行排错调优
- 最长公共子序列Java代码实现
- 命名空间“Microsoft.AspNet”中不存在类型或命名空间名“Mvc”
- poj 1201 差分约束
- export LD_LIBRARY_PATH 的使用
- 【转】正确认识动脉压力波形
- python最大分词_中文分词算法之最大正向匹配算法(Python版)
- html数据摘要算法,Hash函数和消息摘要算法(示例代码)
- ZendGuard-5_0_1 使用备忘
- js 内置对象之数组Array
- 书单丨724运维日,为运维人干杯
- 抛出异常,打印错误信息,追踪错误
- 计算机房用还原保护软件,“小哨兵”还原卡v9.1在机房的巧妙应用
- 怎么将多个Excel工作簿合并成一个新的工作簿
- Mac OS X 平台有哪些优秀应用可以将视频转成 GIF?Mac视频转gif软件推荐
- html拼凑成一张图片,(代码片段)利用canvas,把多张图合并成一张图片
- XMPP——Smack[2]会话、消息监听、字体表情和聊天窗口控制
- bzoj4416 阶乘字符串 子集dp
- 注入漏洞-sql注入
- RK3568关于RK808的定时开关机
热门文章
- 关于2010年7月日本语能力测试报名的通知
- Java各阶段学习书籍推荐
- 矩阵运算实现求样本与样本之间欧式距离
- 「接口汇总」APISpace 常用的免费API 整理
- (自用,无内容,勿点)MySQL必知必会笔记
- C++实现员工管理系统
- linux共享文件夹密码,[Linux]ubuntu下共享文件夹密码设置和重置-smbpasswd -a user
- 仙侣奇缘3新版登录器界面设定
- matlab时间复杂度,MATLAB中的矩阵乘法时间复杂度
- 量子叠加态和量子纠缠_从无到有的量子隐形传态。 第2部分-在真实设备上进行操作...