Unity3D ShaderLab 简单的立方体图反射

反射是着色器模拟现实环境的一个关键因素,它能使我们的着色器渲染效果更加具备视觉冲击,因为他利用了我们周围的环境,

让着色器反射外界的场景信息并将他们反射到材质表面来模拟外部环境,所以我们会使用立方图【CubeMap】的6张纹理来模拟环境的色彩情况。

首先,创建Shader,创建材质球,准备立方图,双击Shader,进入代码编辑器。

如果没有立方体图可以使用天空盒暂代,或者通过Unity的Camera相机渲染到一个立方贴图,具体的创建方法,参见api:

http://www.unitymanual.com/m/Script/Camera.RenderToCubemap.html

从Properties 到CGPROGRAM,再到surf,本次功能较为简单,先看代码。

code start -----------------------------------------------------------------------

  

Shader "91YGame/Cube1" {

Properties {

_MainTint("Diffuse Tint",Color)=(,,,)

_MainTex ("Base (RGB)", 2D) = "white" {}

_CubeMap("CubeMap",CUBE)=""{}

_ReflAmount("Reflection Amount",Range(0.1,))=0.5

}

SubShader {

Tags { "RenderType"="Opaque" }

LOD 

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"

}

code end ------------------------------------------------------------------------

通过上面的简单修改,我们也获得了简单的立方体图反射效果,在Unity中可以直接查看效果。

总结看来,着色器对立方图进行采样,并得到一个类似真实的反射。

这要归功于Unity在表面着色器的Input结构体中内置的worldRefl属性,他为我们直接提供了必要的反射向量,

帮助我们的立方图进行正确采样。我们只需要在texCube函数中使用worldRefl变量,即可得到正确的反射图。

Unity3D ShaderLab 简单的立方体图反射的更多相关文章

  1. Unity3D 创建动态的立方体图系统

    Unity3D 创建动态的立方体图系统 这一篇主要是利用上一篇的Shader,通过脚本来完成一个动态的立方体图变化系统. 准备工作如下: 创建一个新的场景.一个球体.提供给场景一个平行光,准备2个立方 ...

  2. Unity3D ShaderLab 立方体图的反射遮罩

    Unity3D ShaderLab 立方体图的反射遮罩 上一篇,简单的介绍了立方体图的反射,那么我们能不能使用一张纹理对其进行指定遮罩呢?这样美工可以更好的控制图像的效果. 我们接着使用上一篇的sha ...

  3. Unity3D ShaderLab 立方体图的菲涅尔反射

    Unity3D ShaderLab 立方体图的菲涅尔反射 菲涅尔反射是反射类型中比较常见的一种类型,当我们的视线正对物体表面,那么反射量会明显增加, 我们几乎可以在任何支持反射类型的物体表面看到这种情 ...

  4. Unity3D ShaderLab立方体图的法线渲染

    Unity3D ShaderLab立方体图的法线渲染 某些情况下,我们希望立方体图的材质球上产生法线效果,来更多的表现细节,比如菱形花纹的玻璃,冰块的表面. 在帧数的协调下,我们可以通过input结构 ...

  5. Unity3D ShaderLab 静态贴图光照模型

    Unity3D ShaderLab 静态贴图光照模型 其实在unity的光照模型中,我们可以把光照讯息烘培进入一个2D贴图,来实现着色器的光照效果. 下面是在unity中关闭灯光和打开灯光的对比效果. ...

  6. Unity3D ShaderLab 使用贴图对模型的高光进行遮罩

    Unity3D ShaderLab 使用贴图对模型的高光进行遮罩 前面研究了高光效果的实现,再说说现很多游戏用到的高光贴图技术,因为它可以让3D美工更容易控制最终的视觉效果. 这也就为我们提供了另外的 ...

  7. Unity3D ShaderLab法线贴图

    Unity3D ShaderLab法线贴图 说到法线贴图,应该算是我们最常使用的一种增强视觉效果的贴图.将法线贴图的各个像素点座位模型的法线,这样我们的光照可以模拟出高分辨率的效果, 同时也保持较低的 ...

  8. Unity3D ShaderLab压缩混合纹理贴图

    Unity3D ShaderLab压缩混合纹理贴图 纹理可以用于存储大量的数据,我们可以把多个图像打包存储在单一的RGBA纹理上,然后通过着色器代码提取这些元素, 我们就可以使用每个图片的RGBA通道 ...

  9. Unity3D ShaderLab 透明裁剪着色器

    Unity3D ShaderLab 透明裁剪着色器 上一篇,我们介绍了使用Alpha实现透明的手法,其实Unity为我们的#pragma提供了另一种参数,是我们能做出更高效 简单的透明效果,也就是裁剪 ...

随机推荐

  1. 201. Bitwise AND of Numbers Range -- 连续整数按位与的和

    Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers ...

  2. lrzsz在CentOS7的安装

    在超级用户下打一句命令: yum install lrzsz 或者,在普通用户打一句命令,需要输入超级用户密码: sudo yum install lrzsz 然后使用Xshell 5建立连接即可

  3. Java 正则表达式 向前、向后匹配

    //向后匹配 String a = "I paid $90 for 10 oranges, 12 pears and 8 apples. I saved $5 on "; Patt ...

  4. pycharm 导包

    如果需要requests包,python没有自带.可以执行命令:pip install requests,自动安装导入.

  5. BZOJ4003 [JLOI2015]城池攻占

    这题有两种做法来着... 第一种就是一开始想到的比较不靠谱,不过貌似可以过掉: 看从$1$号节点开始到$p$号节点最大需要的体力,记录单调上升的体力,询问的时候二分跳着走就可以了 不过精度问题还有可能 ...

  6. Cookie实例,理解cookie

    一.一句话了解cookie是什么 cookie是服务端发送给客户端的.用来记录一些信息(如用户名),定制主页,聚焦广告的.最终以文件形式存在于客户端电脑磁盘下的小型文档. 二.用实例来认清cookie ...

  7. Java 生成压缩包,ZipOutputStream的使用

    案例:根据url 获取网络资源A,B,C   将资源A,B,C放在一起生成一个xxx.zip 直接看代码 import java.io.File; import java.io.FileOutputS ...

  8. Redis的简单介绍及在Windows下环境搭建

    简单介绍 1,Redis是什么 最直接的还是看官方的定义吧. Redis is an open source (BSD licensed), in-memory data structure stor ...

  9. python 爬虫

    import urllib2 as url import re urls = 'http://www.php100.com/html/it/' headers = {'User-Agent':'Moz ...

  10. 用ajax向处理页面传送路径问题解决方法

    var pic = document.getElementById("pic");    var ppp = pic.getAttribute("src");/ ...