shader入门精要读书笔记29 屏幕后处理 亮度、饱和度、对比度

一、使用屏幕后处理效果 进行更改 亮度、饱和度、对比度

声明一个摄像机上的脚本BrightnessSaturationAndContrast,继承上一节的基类用来调用相关函数。

思想大概就是:
先创建一个函数,用来继承基类,那么我们就可以使用相关函数进行材质创建,调用函数。
然后我们创建一个Shader赋值给上面脚本(脚本内使用Shader创建材质),用来进行特效处理。

脚本代码:

using UnityEngine;
using System.Collections;

public class BrightnessSaturationAndContrast : PostEffectsBase {

	public Shader briSatConShader;
	private Material briSatConMaterial;
	public Material material {			//声明shader并根据shader创建材质
		get {
			briSatConMaterial = CheckShaderAndCreateMaterial(briSatConShader, briSatConMaterial);
			return briSatConMaterial;
		}  
	}

	[Range(0.0f, 3.0f)]
	public float brightness = 1.0f;		//亮度

	[Range(0.0f, 3.0f)]
	public float saturation = 1.0f;		//饱和度

	[Range(0.0f, 3.0f)]
	public float contrast = 1.0f;		//对比度

	void OnRenderImage(RenderTexture src, RenderTexture dest) {		//使用这个函数进行特效处理
		if (material != null) {		//这里会检查材质是否可用,
			material.SetFloat("_Brightness", brightness);		//可用的话设置材质相应参数
			material.SetFloat("_Saturation", saturation);
			material.SetFloat("_Contrast", contrast);

			Graphics.Blit(src, dest, material);		//使用Blit函数传递材质的Shader进行处理src,在传递出给dest
		} else {
			Graphics.Blit(src, dest);		//如果材质不可用,直接不进行处理。
		}
	}
}

Shader:

Shader "Unity Shaders Book/Chapter 12/Brightness Saturation And Contrast" {
	Properties {
		_MainTex ("Base (RGB)", 2D) = "white" {}		//之前说的Blit函数src参数会传递给_MainTex,我们使用这个来接收src。

		//实际上我们不需要创建下面这三个属性,因为我们是通过摄像机上的脚本进行设置这三个参数的,摄像机中可以直接改变
		//并且我们的材质是临时创建的,并没用需要在材质面板上去调节这三个参数
		_Brightness ("Brightness", Float) = 1			//亮度、、饱和度、对比度、
		_Saturation("Saturation", Float) = 1		
		_Contrast("Contrast", Float) = 1
	}
	SubShader {
		Pass {  
			ZTest Always Cull Off ZWrite Off		//屏幕后处理通常都要设置,“标配”:关闭深度写入
			
			CGPROGRAM  
			#pragma vertex vert  
			#pragma fragment frag  
			  
			#include "UnityCG.cginc"  
			  
			sampler2D _MainTex;  
			half _Brightness;
			half _Saturation;
			half _Contrast;
			  
			struct v2f {
				float4 pos : SV_POSITION;
				half2 uv: TEXCOORD0;
			};
			  
			v2f vert(appdata_img v) {		//直接使用appdata_img结构体,它包含了顶点坐标纹理坐标等分量,是UnityCG.cginc中的。
				v2f o;
				
				o.pos = UnityObjectToClipPos(v.vertex);
				
				o.uv = v.texcoord;
				
				return o;
			}
		
			fixed4 frag(v2f i) : SV_Target {
				fixed4 renderTex = tex2D(_MainTex, i.uv);  
				  
				// Apply brightness
				fixed3 finalColor = renderTex.rgb * _Brightness;		//对采样得出的像素颜色添加亮度
				
				// Apply saturation
				fixed luminance = 0.2125 * renderTex.r + 0.7154 * renderTex.g + 0.0721 * renderTex.b;		//计算亮度值:颜色分量×特定系数。
				fixed3 luminanceColor = fixed3(luminance, luminance, luminance);		//用亮度值创建了一个饱和度为0的颜色值。
				finalColor = lerp(luminanceColor, finalColor, _Saturation);			//使用_Saturation插值luminanceColor和finalColor,用来调整饱和度。
				
				// Apply contrast
				fixed3 avgColor = fixed3(0.5, 0.5, 0.5);		//创建对比度为0的颜色值。各分量都是0.5。
				finalColor = lerp(avgColor, finalColor, _Contrast);		//使用_Contrast进行插值,得到调整对比度后的颜色值。
				
				return fixed4(finalColor, renderTex.a);		//返回最终结果。
			}  
			  
			ENDCG
		}  
	}
	
	Fallback Off
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值