unity xcode如何调用unity vignette

1946人阅读
Shader(115)
Unity3D(148)
说起夜视仪,肯定都会想到屏幕上发绿的游戏特效
夜视仪效果经常用在FPS(第一人称射击)游戏中,
先来看下我们的实现效果:
感觉还不错
本次shader需要用到三种贴图:
1.晕影贴图:
给人一种正带着夜视仪的感觉
2.噪波贴图:
产生雪花状噪波
3.扫描线贴图:
增加夜视仪的真实感
先建立一个shader
先浏览一下变量:
_ScanLineTileTex; 扫描线效果的贴图
噪波贴图:
基于两种颜色或材质的交互创建曲面的随机扰动
通过对两种颜色随机混合,生成噪波效果
&_NoiseTex; 噪波贴图
_VignetteTex;晕影贴图
_Contrast;对比度
& 颜色的鲜明程度
_Brightness;亮度
&& &&& &&& &
_RandomValue;随机值,用在噪波贴图随机uv扰动
_distortion;桶形畸变的扭曲程度
_scale;屏幕放缩比例
_ScanLineTileAmount;扫描线数量(不是确切数量,指程度大小)
_NoiseXS噪波x方向速度
_NoiseYS噪波y方向速度
_NightVisionC夜视仪颜色
Properties {
_MainTex (&Base (RGB)&, 2D) = &white& {}
_Contrast(&Contrast&, Range(0, 4)) = 2
_Brightness (&Brightness&, Range(0, 2)) = 1
_NightVisionColor (&Night Vision Color&, Color) = (1, 1, 1, 1)
_RandomValue (&RandomValue&, Float) = 0
_distortion(&distortion&, Float) = 0.2
_scale(&scale&, Float) = 0.8
_VignetteTex(&Vignette Texture&, 2D) = &white& {}
_ScanLineTileTex(&Scan Line Tile Texture&, 2D) = &white& {}
_ScanLineTileAmount(&Scan Line Tile Amount&, Float) = 4.0
_NoiseTex(&Noise Texture&, 2D) = &white& {}
_NoiseXSpeed(&Noise X Speed&, Float) = 100.0
_NoiseYSpeed(&Noise Y Speed&, Float) = 100.0
我们还要声明一下:
#pragma vertex vert_img&&& 传入的像素信息为vert_img
#pragma fragment frag
&&& 片元着色函数为frag
#pragma fragmentoption ARB_precision_hint_fastest&
片元着色选项。ARB_precision_hint_fastest使用这个标志可以fp16的对像素进行运算,加快渲染
#pragma vertex vert_img
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
镜头桶形失真校正算法,产生桶形畸变效果
将矩形物体拍摄成四边向外凸形成桶形的影像,就称镜头具有负畸变,或桶形畸变
一会需要用此对uv进行变换
传入uv值float2 coord
传出扭曲的uv值
产生了镜头的感觉,增加真实感
float2 barrelDistortion(float2 coord)
float2 h = coord.xy - float2(0.5, 0.5);
float r2 = h.x * h.x + h.y * h.y;
float f = 1.0 + r2 * (_distortion * sqrt(r2));
return f * _scale * h + 0.5;
然后我们开始在frag函数中对片元进行着色
从刚才的桶形畸变函数传出经过处理得uv值distortedUV
获得当前传入摄像头的像素信息renderTex
获取晕影贴图像素信息
vignetteTex = tex2D(_VignetteTex, distortedUV);&& &
扫描线uv 可控扫描线数量
scanLinesUV = half2(i.uv.x * _ScanLineTileAmount, i.uv.y * _ScanLineTileAmount);
获取扫描线贴图像素信息
scanLineTex = tex2D(_ScanLineTileTex, scanLinesUV);
噪波贴图uv
根据时间与随机值变换uv产生扰动效果
noiseUV = half2(i.uv.x + (_RandomValue * _SinTime.z * _NoiseXSpeed),i.uv.y + (_Time.x * _NoiseYSpeed));
获取噪波贴图像素信息
fixed4 noiseTex = tex2D(_NoiseTex, noiseUV);
lum 即 luminosity 亮度值
lum = dot (fixed3(0.299, 0.587, 0.114), renderTex.rgb);
lum += _B//加上可自控的亮度
使饱和度调为零,变成黑白效果,再与夜视镜颜色混合
fixed4 finalColor = (lum *2) + _NightVisionC
再与三种贴图颜色混合得到最终颜色值
finalColor = pow(finalColor, _Contrast);
finalColor *= vignetteT
finalColor *= scanLineTex * noiseT
shader就ok了
fixed4 frag(v2f_img i/*像素信息*/) : COLOR// 片元着色函数
half2 distortedUV = barrelDistortion(i.uv);
//桶形畸变uv
fixed4 renderTex = tex2D(_MainTex, distortedUV);
fixed4 vignetteTex = tex2D(_VignetteTex, distortedUV); //晕影贴图
//扫描线uv 可控扫描线数量
half2 scanLinesUV = half2(i.uv.x * _ScanLineTileAmount, i.uv.y * _ScanLineTileAmount);//_ScanLineTileAmount大小无限制
fixed4 scanLineTex = tex2D(_ScanLineTileTex, scanLinesUV);
//噪波贴图uv
half2 noiseUV = half2(i.uv.x + (_RandomValue * _SinTime.z * _NoiseXSpeed),i.uv.y + (_Time.x * _NoiseYSpeed));
fixed4 noiseTex = tex2D(_NoiseTex, noiseUV);
//lum = luminosity 亮度
fixed lum = dot (fixed3(0.299, 0.587, 0.114), renderTex.rgb);
lum += _B//加上可自控的亮度
//饱和度调为零,变成黑白效果,再与夜视镜颜色混合
fixed4 finalColor = (lum *2) + _NightVisionC//
finalColor = pow(finalColor, _Contrast);//对比度
finalColor *= vignetteT//与晕影贴图混合
finalColor *= scanLineTex * noiseT
return finalC
接下来看看放入摄像头中的c#脚本
建立一个c#脚本
先赋予变量,与上面的shader的变量都差不多,
这就是一会要传入shader的值
&span style=&font-size:12&& #region Variables
public Shader nightVisionS
public float contrast = 2.0f;
public float brightness = 1.0f;
public Color nightVisionColor = Color.
public Texture2D vignetteT
public Texture2D scanLineT
public float scanLineTileAmount = 4.0f;
public Texture2D nightVisionN
public float noiseXSpeed = 100.0f;
public float noiseYSpeed = 100.0f;
public float distortion = 0.2f;
public float scale = 0.8f;
private float randomValue = 0.0f;
private Material curM
#endregion&/span&
动态建立一个纹理
&span style=&font-size:12&& #region Properties
Material material
if(curMaterial == null)
curMaterial = new Material(nightVisionShader);
curMaterial.hideFlags = HideFlags.HideAndDontS
return curM
#endregion&/span&
依旧需要 OnRenderImage()这个函数抓取摄像机的图像
然后我们把各种变量传入shader
通过 Graphics.Blit() 这个函数
可以经过shader的变换处理在输出到我们的显示器中
&span style=&font-size:12&&void OnRenderImage(RenderTexture sourceTexture, RenderTexture destTexture)
if(nightVisionShader != null)
material.SetFloat(&_Contrast&, contrast);
material.SetFloat(&_Brightness&, brightness);
material.SetColor(&_NightVisionColor&, nightVisionColor);
material.SetFloat(&_RandomValue&, randomValue);
material.SetFloat(&_distortion&, distortion);
material.SetFloat(&_scale&,scale);
if(vignetteTexture)
material.SetTexture(&_VignetteTex&, vignetteTexture);
if(scanLineTexture)
material.SetTexture(&_ScanLineTileTex&, scanLineTexture);
material.SetFloat(&_ScanLineTileAmount&, scanLineTileAmount);
if(nightVisionNoise)
material.SetTexture(&_NoiseTex&, nightVisionNoise);
material.SetFloat(&_NoiseXSpeed&, noiseXSpeed);
material.SetFloat(&_NoiseYSpeed&, noiseYSpeed);
Graphics.Blit(sourceTexture, destTexture, material);
Graphics.Blit(sourceTexture, destTexture);
一切ok之后,在脚本调好各种值之后
让我们来看看效果
立马FPS了的感觉= =;
以下全部代码:
&span style=&font-size:12&&using UnityE
using System.C
public class night : MonoBehaviour
#region Variables
public Shader nightVisionS
public float contrast = 2.0f;
public float brightness = 1.0f;
public Color nightVisionColor = Color.
public Texture2D vignetteT
public Texture2D scanLineT
public float scanLineTileAmount = 4.0f;
public Texture2D nightVisionN
public float noiseXSpeed = 100.0f;
public float noiseYSpeed = 100.0f;
public float distortion = 0.2f;
public float scale = 0.8f;
private float randomValue = 0.0f;
private Material curM
#endregion
#region Properties
Material material
if(curMaterial == null)
curMaterial = new Material(nightVisionShader);
curMaterial.hideFlags = HideFlags.HideAndDontS
return curM
#endregion
void Start()
if(!SystemInfo.supportsImageEffects)
if(!nightVisionShader && !nightVisionShader.isSupported)
void OnRenderImage(RenderTexture sourceTexture, RenderTexture destTexture)
if(nightVisionShader != null)
material.SetFloat(&_Contrast&, contrast);
material.SetFloat(&_Brightness&, brightness);
material.SetColor(&_NightVisionColor&, nightVisionColor);
material.SetFloat(&_RandomValue&, randomValue);
material.SetFloat(&_distortion&, distortion);
material.SetFloat(&_scale&,scale);
if(vignetteTexture)
material.SetTexture(&_VignetteTex&, vignetteTexture);
if(scanLineTexture)
material.SetTexture(&_ScanLineTileTex&, scanLineTexture);
material.SetFloat(&_ScanLineTileAmount&, scanLineTileAmount);
if(nightVisionNoise)
material.SetTexture(&_NoiseTex&, nightVisionNoise);
material.SetFloat(&_NoiseXSpeed&, noiseXSpeed);
material.SetFloat(&_NoiseYSpeed&, noiseYSpeed);
Graphics.Blit(sourceTexture, destTexture, material);
Graphics.Blit(sourceTexture, destTexture);
void Update()
contrast = Mathf.Clamp(contrast, 0f,4f);
brightness = Mathf.Clamp(brightness, 0f, 2f);
randomValue = Random.Range(-1f,1f);
distortion = Mathf.Clamp(distortion, -1f,1f);
scale = Mathf.Clamp(scale, 0f, 3f);
void OnDisable()
if(curMaterial)
DestroyImmediate(curMaterial);
&span style=&font-size:12&&Shader &Custom/shaderTest& {
Properties {
_MainTex (&Base (RGB)&, 2D) = &white& {}
_Contrast(&Contrast&, Range(0, 4)) = 2
_Brightness (&Brightness&, Range(0, 2)) = 1
_NightVisionColor (&Night Vision Color&, Color) = (1, 1, 1, 1)
_RandomValue (&RandomValue&, Float) = 0
_distortion(&distortion&, Float) = 0.2
_scale(&scale&, Float) = 0.8
_VignetteTex(&Vignette Texture&, 2D) = &white& {}
_ScanLineTileTex(&Scan Line Tile Texture&, 2D) = &white& {}
_ScanLineTileAmount(&Scan Line Tile Amount&, Float) = 4.0
_NoiseTex(&Noise Texture&, 2D) = &white& {}
_NoiseXSpeed(&Noise X Speed&, Float) = 100.0
_NoiseYSpeed(&Noise Y Speed&, Float) = 100.0
SubShader {
Tags { &RenderType&=&Opaque& }
#pragma vertex vert_img
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest//使用这个标志可以fp16的对像素进行运算
#include &UnityCG.cginc&
uniform sampler2D _MainT
uniform sampler2D _ScanLineTileT//扫描线效果的贴图
//噪波贴图基于两种颜色或材质的交互创建曲面的随机扰动
//通过对两种颜色随机混合,生成噪波效果
uniform sampler2D _NoiseT//噪波贴图
uniform sampler2D _VignetteT//装饰图案,小插图,此处为晕影贴图
fixed _C//对比度
fixed _B//亮度
fixed _RandomV//随机值,用在噪波贴图随机uv扰动
fixed _//扭曲
fixed _//屏幕比例
fixed _ScanLineTileA//扫描线数量
fixed _NoiseXS//噪波x方向速度
fixed _NoiseYS//噪波y方向速度
fixed4 _NightVisionC//夜视镜颜色
struct Input {
float2 uv_MainT
float2 barrelDistortion(float2 coord)
float2 h = coord.xy - float2(0.5, 0.5);
float r2 = h.x * h.x + h.y * h.y;
float f = 1.0 + r2 * (_distortion * sqrt(r2));
return f * _scale * h + 0.5;
fixed4 frag(v2f_img i/*像素信息*/) : COLOR// 片元着色函数
half2 distortedUV = barrelDistortion(i.uv);
//桶形畸变uv
fixed4 renderTex = tex2D(_MainTex, distortedUV);
fixed4 vignetteTex = tex2D(_VignetteTex, distortedUV); //晕影贴图
//扫描线uv 可控扫描线数量
half2 scanLinesUV = half2(i.uv.x * _ScanLineTileAmount, i.uv.y * _ScanLineTileAmount);//_ScanLineTileAmount大小无限制
fixed4 scanLineTex = tex2D(_ScanLineTileTex, scanLinesUV);
//噪波贴图uv
half2 noiseUV = half2(i.uv.x + (_RandomValue * _SinTime.z * _NoiseXSpeed),i.uv.y + (_Time.x * _NoiseYSpeed));
fixed4 noiseTex = tex2D(_NoiseTex, noiseUV);
//lum = luminosity 亮度
fixed lum = dot (fixed3(0.299, 0.587, 0.114), renderTex.rgb);
lum += _B//加上可自控的亮度
//饱和度调为零,变成黑白效果,再与夜视镜颜色混合
fixed4 finalColor = (lum *2) + _NightVisionC//
finalColor = pow(finalColor, _Contrast);//对比度
finalColor *= vignetteT//与晕影贴图混合
finalColor *= scanLineTex * noiseT
return finalC
FallBack &Diffuse&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ------------- by wolf96
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:599017次
积分:8667
积分:8667
排名:第2359名
原创:201篇
转载:155篇
评论:178条
阅读:3318
阅读:14830
阅读:15891
文章:66篇
阅读:225389
(13)(10)(2)(1)(8)(6)(1)(1)(1)(4)(8)(5)(56)(18)(8)(13)(17)(26)(15)(7)(4)(11)(8)(17)(12)(6)(11)(14)(13)(19)(20)(9)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'Unity 5 Tutorial – Lighting and Post-Processing Low Poly Scene | LMHPoly安全检查中...
请打开浏览器的javascript,然后刷新浏览器
< 浏览器安全检查中...
还剩 5 秒&}

我要回帖

更多关于 unity 调用ios 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信