72 lines
1.6 KiB
Markdown
72 lines
1.6 KiB
Markdown
|
## BRDF
|
|||
|
案例中使用了迪士尼模型。
|
|||
|
|
|||
|
## 混合模式
|
|||
|
`SrcBlend`为`One`,`DetBlend`为`OneMinusSrc`
|
|||
|
|
|||
|
## Shader GUI
|
|||
|
在`Shader`{}内添加`CustomEditor“ CustomShaderGUI”`。之后添加脚本:
|
|||
|
```c#
|
|||
|
using UnityEditor;
|
|||
|
using UnityEngine;
|
|||
|
using UnityEngine.Rendering;
|
|||
|
|
|||
|
public class CustomShaderGUI : ShaderGUI {
|
|||
|
MaterialEditor editor;
|
|||
|
Object[] materials;
|
|||
|
MaterialProperty[] properties;
|
|||
|
|
|||
|
public override void OnGUI (
|
|||
|
MaterialEditor materialEditor, MaterialProperty[] properties
|
|||
|
) {
|
|||
|
base.OnGUI(materialEditor, properties);
|
|||
|
editor = materialEditor;
|
|||
|
materials = materialEditor.targets;
|
|||
|
this.properties = properties;
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
之后实现
|
|||
|
```c#
|
|||
|
bool HasProperty (string name) =>
|
|||
|
FindProperty(name, properties, false) != null;
|
|||
|
|
|||
|
void SetProperty (string name, string keyword, bool value) {
|
|||
|
if (SetProperty(name, value ? 1f : 0f)) {
|
|||
|
SetKeyword(keyword, value);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
bool SetProperty (string name, float value) {
|
|||
|
MaterialProperty property = FindProperty(name, properties, false);
|
|||
|
if (property != null) {
|
|||
|
property.floatValue = value;
|
|||
|
return true;
|
|||
|
}
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
void SetKeyword (string keyword, bool enabled) {
|
|||
|
if (enabled) {
|
|||
|
foreach (Material m in materials) {
|
|||
|
m.EnableKeyword(keyword);
|
|||
|
}
|
|||
|
}
|
|||
|
else {
|
|||
|
foreach (Material m in materials) {
|
|||
|
m.DisableKeyword(keyword);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
就可以添加若干自定义Shader属性的`Set`函数了。添加按钮逻辑如下:
|
|||
|
```c#
|
|||
|
bool PresetButton (string name) {
|
|||
|
if (GUILayout.Button(name)) {
|
|||
|
editor.RegisterPropertyChangeUndo(name);
|
|||
|
return true;
|
|||
|
}
|
|||
|
return false;
|
|||
|
}
|
|||
|
```
|