【Unity Shaders】游戏性和画面特效——创建一个夜视效果的画面特效

现在你的画面特效脚本系统应该已经建立好了,现在我们来实现具体的脚本和Shader。

首先,我们来填写NightVisionEffect.cs脚本的主要代码。

  1. 第一步我们要定义一些需要在面板中显示的变量,以便让用户进行调整。在脚本中添加如下代码:
    	#region Variables
    	public Shader nightVisionShader;
    
    	public float contrast = 2.0f;
    	public float brightness = 1.0f;
    	public Color nightVisionColor = Color.white;
    
    	public Texture2D vignetteTexture;
    
    	public Texture2D scanLineTexture;
    	public float scanLineTileAmount = 4.0f;
    
    	public Texture2D nightVisionNoise;
    	public float noiseXSpeed = 100.0f;
    	public float noiseYSpeed = 100.0f;
    
    	public float distortion = 0.2f;
    	public float scale = 0.8f;
    	
    	private Material curMaterial;
    	private float randomValue = 0.0f;
    	#endregion
  2. 下面,我们需要填充OnRenderImage函数。在这个函数里,我们将要把上述变量传递给Shader,使得Shader可以使用这些数据来处理render texture:
    	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("_ScanLineTex", scanLineTexture);
    				material.SetFloat("_ScanLineTileAmount", scanLineTileAmount);
    			}
    
    			if (nightVisionNoise) {
    				material.SetTexture("_NoiseTex", nightVisionNoise);
    				material.SetFloat("_NoiseXSpeed", noiseXSpeed);
    				material.SetFloat("_NoiseYSpeed", noiseYSpeed);
    			}
    
    			Graphics.Blit(sourceTexture, destTexture, material);
    		} else {
    			Graphics.Blit(sourceTexture, destTexture);
    		}
    	}
  3. 最后,我们需要保证一些变量的范围。这些范围可以根据需要后续更改:
    	void Update () {
    		contrast = Mathf.Clamp(contrast, 0.0f, 4.0f);
    		brightness = Mathf.Clamp(brightness, 0.0f, 2.0f);
    		distortion = Mathf.Clamp(distortion, -1.0f, 1.0f);
    		scale = Mathf.Clamp(scale, 0.0f, 3.0f);
    		randomValue = Random.Range(-1.0f, 1.0f);
    	}

接下来,我们来实现关键的Shader部分。

  1. 首先,还是添加一些新的Properties:
    	Properties {
    		_MainTex ("Base (RGB)", 2D) = "white" {}
    		_VignetteTex ("Vignette Texture", 2D) = "white" {}
    		_ScanLineTex ("

猜你喜欢

转载自blog.csdn.net/qq_21743659/article/details/143189909