Unity Shaders and Effects Cookbook (4-1)(4-2)静态立方体贴图的创建与使用
開始学习第4章 - 着色器的反射
看完了1、2节,来记录一下。反射主要是利用了 Cubemap 立方体贴图。
认识Cubemap
立方体贴图。就如同名字所说。在一个立方体上有6张图。就这样觉得吧。
假想一下 ,在一个艳丽的房间里。有一个表面是镜子的圆球。那这个圆球表面就反射了房间里面的全部东西。就是一个大号的凸镜。
这是到网上找得一张图,非常直观的表达了我的意思……
注意标题中说的,静态立方体贴图。为什么叫静态。由于这一次使用的立方体贴图是提前生成好的图片,而不是动态生成的。
这又是什么意思呢?
就拿上面图片中的场景来说,假设是静态的立方体贴图。那么当这个球在移动的时候。球上面显示的东西是不会变动的。
现实生活中的话,球移动。球上面显示出来的内容应该也是要随之变动的。
那么这里使用静态立方体贴图呢。是先学习立方体贴图的知识。后面会学习动态立方体贴图的。在书上是 4.6 这一节。
创建Cubemap
首先来创建一个立方体贴图,在Assets 中右键新建一个 Cubemap。
搭建场景,加入一个Sphere 作为Camera 的容器。
由于要借助 Camera 的 API 来生成Cubemap。
转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn
以下是我搭建的场景。
以下编写一个Unity编辑器插件来生成CubeMap。
using UnityEngine;
using System.Collections;
using UnityEditor; public class GenerateStaticCubemap : ScriptableWizard
{
public Transform renderPosition;
public Cubemap cubemap; void OnizardUpdate()
{
helpString = "Select transform to render" + "from and cubemap to render into";
if (renderPosition != null && cubemap != null)
{
isValid = true;
}
else
{
isValid = false;
}
} void OnWizardCreate()
{
//加入一个Camera,用来创建Cubemap的。 GameObject go = new GameObject("CubemapCamera", typeof(Camera)); go.transform.position = renderPosition.position;
go.transform.rotation = Quaternion.identity; go.camera.RenderToCubemap(cubemap); DestroyImmediate(go);
} [MenuItem("CookBookShaders/Render Cubemap")]
static void RenderCubemap()
{
ScriptableWizard.DisplayWizard("Render Cube", typeof(GenerateStaticCubemap), "Render");
}
}
由于是编辑器工具。所以要遵循unity的规定。把这个代码文件放在 名为 Editor 的目录中。自己新建一个即可。
这个代码文件的核心就是
go.camera.RenderToCubemap(cubemap);
借助Camera 的 API。生成了一个 Cubemap。
然后加入了一个菜单,作为入口。
[MenuItem("CookBookShaders/Render Cubemap")]
等unity 编译完毕后。菜单条就会出现我们自己加入的菜单。
把刚才创建的 Cubemap 拖进来,把Sphere拖进来。
点击 Render 就生成了 Cubemap。
使用Cubemap
上面创建好了立方体贴图,然后就能够使用了。
仍然创建一个材质。一个 Shader。
转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn
Shader 代码
Shader "CookBookShaders/Cubemap"
{
Properties {
_MainTint("Diffuse Tint",Color)=(1,1,1,1)
_MainTex ("Base (RGB)", 2D) = "white" {}
_Cubemap("Cubemap",CUBE)=""{}
_ReflectionAmount("Reflection Amount",Range(0.01,1))=0.5
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200 CGPROGRAM
#pragma surface surf Lambert float4 _MainTint;
sampler2D _MainTex;
samplerCUBE _Cubemap;
float _ReflectionAmount; 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 *_ReflectionAmount;
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
第一次使用立方体贴图。
在Properties 块中。定义属性的使用类型是 CUBE。普通纹理是 2D。
在SubShader 中,定义变量的时候注意用 samplerCUBE。普通纹理是 sampler2D。
在 Input 结构体中,使用了 Unity的内置变量 worldRefl 。这个变量 提供了在着色器中使用的 世界反射变量。
然后在 surf 函数中,使用 texCube 从Cubemap 中取纹素。
texCUBE(_Cubemap,IN.worldRefl).rgb
执行后的效果
演示样例project下载:
http://pan.baidu.com/s/1qYcNKxI
Unity Shaders and Effects Cookbook (4-1)(4-2)静态立方体贴图的创建与使用的更多相关文章
- 【Unity Shaders】《Unity Shaders and Effects Cookbook》总结篇
我的唠叨 不知不觉,从发表第一篇关于<Unity Shaders and Effects Cookbook>已经快十个月了.一开始的初衷就是学习笔记,毕竟将来回过头去看的时候,再看英文难免 ...
- Unity Shaders and Effects Cookbook (3-4) 使用高光贴图
在学习完上一节之后.已经了解了在Unity 中怎样实现一个高光 Shader ,可是会有一个问题.就是效果看起来不切实际,如以下的问题 我用一张图片贴到了Cube上面.然后用了一个高光材质,得到了下图 ...
- Unity Shaders and Effects Cookbook (3-5) 金属软高光
书上这一节看得我头昏脑胀,数学渣表示自理不能-- 并且也不了解这个效果的实际意义. 先记录下来,后面真正看懂了再来补充具体理论. 通过一张纹理贴图,定义高光的形状,利用到的纹理贴图有三种 这里并非把纹 ...
- Unity Shaders and Effets Cookbook
Unity Shaders and Effects Cookbook 最近在读 <Unity Shaders and Effects Cookbook> 中文名称:<Unity 着色 ...
- Unity Shader and Effects Cookbook问题记录
1.p61的specular计算,涉及到的一个参数“_SpecColor”是在Unity的官方cginc文件(UnityLightingCommon.cginc)中,是直接赋颜色给这个参数,反应到你模 ...
- 【Unity Shaders】Using Textures for Effects —— 实现Photoshop的色阶效果
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
- 【Unity Shaders】Using Textures for Effects——打包和混合textures
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
- 【Unity Shaders】Using Textures for Effects——让sprite sheets动起来
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
- 【Unity Shaders】Using Textures for Effects——通过修改UV坐标来滚动textures
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
随机推荐
- 将Excel表格保存为图片
如何将Excel表格保存为图片,可参见以下几种方法: 1.借助其它办法软件,例如Word或PPT. 步骤:选中Excel中需要被保存成图片的内容,Ctrl+C进行复制,打开Word或PPT办公软件,鼠 ...
- Win7 64bit下值得推荐的免费看图软件
自从更换到Win7 64bit后, 用了十多年的AcdSee3.x不能再正常工作了. 找到了两个替代品: Faststone Image Viewer 和 XnView Faststone Image ...
- iOS中消息传递方式
iOS中消息传递方式 在iOS中有很多种消息传递方式,这里先简单介绍一下各种消息传递方式. 1.通知:在iOS中由通知中心进行消息接收和消息广播,是一种一对多的消息传递方式. NSNotificati ...
- 【LeetCode】208. Implement Trie (Prefix Tree)
Implement Trie (Prefix Tree) Implement a trie with insert, search, and startsWith methods. Note:You ...
- java实现simhash算法
一个牛人分享的,放在github上,用java实现,网络上还有很多用ruby写的 https://github.com/commoncrawl/commoncrawl/blob/master/sr ...
- solrj索引操作
添加索引 Solr添加文档至索引: http://www.cnblogs.com/dennisit/p/3621717.html 删除索引: 每天索引记录有一个唯一标识,索引的删除通过唯一标识操作,如 ...
- Windows中"打开方式..."无法指定程序的解决办法
Windows真DT, 今天升级了vim, 从vim73到vim74, 突然发现右键菜单打开方式中的VIM不见了, 于是手动重新指定到vim74\gvim.exe, 未果, Windows就直接忽略了 ...
- centos6.4安装GitLab
参考文章: http://www.pickysysadmin.ca/2013/03/25/how-to-install-gitlab-5-0-on-centos-6/ yum安装redis的方法: h ...
- C++项目參考解答:求Fibonacci数列
[项目:求Fibonacci数列] Fibonacci数列在计算科学.经济学等领域中广泛使用,其特点是:第一.二个数是1,从第3个数開始,每一个数是其前两个数之和.据此,这个数列为:1 1 2 3 5 ...
- CTreeCtrl获得鼠标点击时的节点
原文链接: http://blog.csdn.net/lcalqf/article/details/21321923 1.添加图标 HICON icon[10]; icon[0]=AfxGetApp( ...