现在你的画面特效脚本系统应该已经建立好了,现在我们来实现具体的脚本和Shader。
首先,我们来填写NightVisionEffect.cs脚本的主要代码。
- 第一步我们要定义一些需要在面板中显示的变量,以便让用户进行调整。在脚本中添加如下代码:
#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
- 下面,我们需要填充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); } }
- 最后,我们需要保证一些变量的范围。这些范围可以根据需要后续更改:
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部分。
- 首先,还是添加一些新的Properties:
Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _VignetteTex ("Vignette Texture", 2D) = "white" {} _ScanLineTex ("