Unity3D ShaderLab立方体图的法线渲染

某些情况下,我们希望立方体图的材质球上产生法线效果,来更多的表现细节,比如菱形花纹的玻璃,冰块的表面。

在帧数的协调下,我们可以通过input结构体的另一个内置参数来传递我们的法线贴图。下面 我们就一步步实现。

首先,新建Shader,在新建材质球,准备立方体图,法线贴图。双击shader进入脚本编辑。

本次的代码修改依然是和之前的立方体图的反射遮罩差不多,所以就直接看完成的代码吧。

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

Shader "91YGame/ReflectionNormal" {

Properties {

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

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

_NormalMap("Normal Map",2D)=""{}

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

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

}

SubShader {

Tags { "RenderType"="Opaque" }

LOD 

CGPROGRAM

#pragma surface surf Lambert

sampler2D _MainTex;

sampler2D _NormalMap;

samplerCUBE _CubeMap;

float4 _MainTint;

float _ReflAmount;

struct Input {

float2 uv_MainTex;

float2 uv_NormalMap;

float3 worldRefl;

INTERNAL_DATA

};

void surf (Input IN, inout SurfaceOutput o) {

half4 c = tex2D (_MainTex, IN.uv_MainTex);

float3 normals = UnpackNormal(tex2D(_NormalMap,IN.uv_NormalMap)).rgb;

o.Normal = normals;

o.Emission=texCUBE(_CubeMap,WorldReflectionVector(IN,o.Normal) ).rgb*_ReflAmount;

o.Albedo = c.rgb*_MainTint;

o.Alpha = c.a;

}

ENDCG

} 

FallBack "Diffuse"

}

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

通过对比变量,我们只是把之前的遮罩贴图换为了法线贴图。但是我们就是想要逐像素的法线贴图来修改我们的反射立方体图效果,

为了实现这一步,必须在法线贴图应用到着色器之后得到物体表面的法线信息,所以我们通过UnpackNormal方法获得法线的rgb信息。

然后再传递给ouput输出结构体的Normal属性。这时候着色器表面的法线就会被修改。因此,我们需要借助它来对我们的反射进行修改,

借助Input结构体进行传递,于是我们用到了内置的INTERNAL_DATA变量来访问修改后的法线。然后再通过WorldReflectionVector(IN,o.Normal)函数来计算游戏场景世界的反射向量,

(WorldReflectionVector)函数中计算每个像素(per-pixel)反射向量(reflection vector)。

这是Unity给我们提供的一种内置函数,方便我们完成功能。最后,我们的效果如下:

左侧是我们刚刚完成的发现贴图效果,中间是上一篇带遮罩的效果。

Unity3D ShaderLab立方体图的法线渲染的更多相关文章

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

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

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

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

  3. (转)Unity3D 游戏贴图(法线贴图,漫反射贴图,高光贴图)

    原帖网址http://www.u3dpro.com/read.php?tid=207  感谢jdk900网友的辛苦编写 我们都知道,一个三维场景的画面的好坏,百分之四十取决于模型,百分之六十取决于贴图 ...

  4. Unity3D ShaderLab 简单的立方体图反射

    Unity3D ShaderLab 简单的立方体图反射 反射是着色器模拟现实环境的一个关键因素,它能使我们的着色器渲染效果更加具备视觉冲击,因为他利用了我们周围的环境, 让着色器反射外界的场景信息并将 ...

  5. Unity3D ShaderLab法线贴图

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

  6. Unity3D ShaderLab 修改渲染队列进行深度排序

    Unity3D ShaderLab 修改渲染队列进行深度排序 为了更深刻的理解透明度,我们还需要学习一下深度排序,简单来说就是物体被渲染的先后顺序. Unity允许我们通过代码来控制某个特定物体渲染到 ...

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

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

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

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

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

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

随机推荐

  1. Swift和Objective-C混编注意

    前言 Swift已推出数年,与Objective-C相比Swift的语言机制及使用简易程度上更接地气,大大降低了iOS入门门槛.当然这对新入行的童鞋们来讲,的确算是福音,但对于整个iOS编程从业者来讲 ...

  2. C++文件读写练习

    编写一个程序,统计data.txt文件的行数,并将所有行前加上行号后写到data1.txt文件中. 算法提示: 行与行之间以回车符分隔,而getline()函数以回车符作为终止符.因此,可以采用get ...

  3. chrome 模拟点击

    实现进入一个页面后触发一个<a>的点击事件. 由于safari和chrome不支持<a>的click()所以需要对浏览器进行判断 var Sys = {};   var ua ...

  4. win7_oracle11g_64位连接32位PLSQL_Developer

      工具/原料 已经装好的64位Oracle数据库 window7_64位的操作系统 PLSQL_Developer 9.0以上版本(目前只有32位的):下面有下载连接! 官方的 instantcli ...

  5. 46. Permutations——本质和树DFS遍历无异 fun: for i in nums fun(i)

    Given a collection of distinct numbers, return all possible permutations. For example, [1,2,3] have ...

  6. Swift - 自动布局库SnapKit的使用详解3(约束优先级,约束做动画)

    1,约束优先级我们使用SnapKit的时候,还可以定义约束的优先级.这样当约束出现冲突的时候,优先级高的约束覆盖优先级低的约束.具体优先级可以放在约束链的结束处. (1)可以设置如下几种优先级 pri ...

  7. Js笔试题之千分位格式化

    用js实现如下功能,将给定的数字转化成千分位的格式,如把“10000”转化成“10,000”,并考虑到性能方面的因素. 一.首先想到的办法,将数字转换为字符串(toString())再打散成数组(sp ...

  8. Oracle异常处理内容,隐式游标

    异常处理 create or replace procedure pr_test3(v_bh in varchar2,v_xx out t_hq_ryxx%rowtype) is begin sele ...

  9. POJ 3522 Slim Span 最小生成树,暴力 难度:0

    kruskal思想,排序后暴力枚举从任意边开始能够组成的最小生成树 #include <cstdio> #include <algorithm> using namespace ...

  10. SuperGridControl 使用小技巧

    1.显示行号 superGridControl1.PrimaryGrid.ShowRowGridIndex = true; 2.允许调整行头的宽度 superGridControl1.PrimaryG ...