在移动平台,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 }
BRDFGenerator

相关文章: