在移动平台,BRDF的计算会消耗较多的ALU,同时对于BRDF计算结果的精度要求没有这么高。一种优化的方式是将BRDF的部分复杂计算,预计算存储到纹理中。已增加一张BRDF贴图和纹理采样器的代价,来节约ALU。
将BRDF预计算存储到纹理的方式有很多,使用C#实现或者Unity2018的新的Custom Render Texture都可以很方便的实现功能。
作为一个Compute Shader的入门,这里使用Compute Shader,也就是计算着色器来实现我们的需求。
首先,我们新建一个C#脚本,BRDFGenerator.cs
1 using UnityEditor; 2 using UnityEngine; 3 using System.Collections; 4 using System.Collections.Generic; 5 public class BRDFGenerator : ScriptableWizard 6 { 7 public ComputeShader computeShader; 8 public int size=256; 9 // public RenderTexture rt; 10 public Material mat; 11 private int _kernel; 12 [MenuItem("Texture Generator/BRDF Texture Generator")] 13 static void CreateWizard() 14 { 15 // ScriptableWizard.DisplayWizard<t>("Create Light", "Create", "Apply"); 16 ScriptableWizard.DisplayWizard<BRDFGenerator>("BRDF Texture Generator", "生成"); 17 //If you don't want to use the secondary button simply leave it out: 18 } 19 private void OnEnable() 20 { 21 Debug.Log("Start!"); 22 } 23 void OnWizardCreate() 24 { 25 RenderTexture renderTexture = new RenderTexture(size,size,0,RenderTextureFormat.ARGB32); 26 renderTexture.enableRandomWrite = true; 27 renderTexture.Create(); 28 // rt.enableRandomWrite = true; 29 mat.SetTexture("_MainTex", renderTexture); 30 float temp = size / 1.0f; 31 _kernel = computeShader.FindKernel("CSMain"); 32 computeShader.SetTexture(_kernel, "Result", renderTexture); 33 computeShader.SetFloat("size", temp); 34 computeShader.Dispatch(_kernel, renderTexture.width / 8, renderTexture.height / 8, 1); 35 Debug.Log("Sucess!"); 36 } 37 38 void OnWizardUpdate() 39 { 40 helpString = "BRDF"; 41 } 42 43 }