protected void BuildMaterials() { //Create materials for each blending mode //Blending modes cannot be changed by MaterialPropertyBlocks, //so we need to have a separate material to pass to each layer based on its setting _materials = new Dictionary <ShaderBlendMode, Material>(); HashSet <Shader> layerShaders = new HashSet <Shader>(); foreach (Depthkit_ZeroDaysLookLayer layer in _layers) { if (layer != null && layer.Shader != null) { layerShaders.Add(layer.Shader); } } foreach (BlendMode mode in BlendMode.GetValues(typeof(BlendMode))) { foreach (Shader shader in layerShaders) { ShaderBlendMode sbm = new ShaderBlendMode(shader, mode); Material mat = new Material(shader); mat.SetInt("_SrcMode", (int)GetSrcMode(mode)); mat.SetInt("_DstMode", (int)GetDstMode(mode)); mat.SetInt("_BlendEnum", (int)mode); _materials.Add(sbm, mat); } } }
public ParsedShader(IReadOnlyDictionary <string, ShaderUniformDefinition> uniforms, IReadOnlyDictionary <string, ShaderVaryingDefinition> varyings, IList <ShaderFunctionDefinition> functions, ShaderLightMode lightMode, ShaderBlendMode blendMode) { Uniforms = uniforms; Varyings = varyings; Functions = functions; LightMode = lightMode; BlendMode = blendMode; }
public ParsedShader(IReadOnlyDictionary <string, ShaderUniformDefinition> uniforms, IReadOnlyDictionary <string, ShaderVaryingDefinition> varyings, IReadOnlyDictionary <string, ShaderConstantDefinition> constants, IList <ShaderFunctionDefinition> functions, ShaderLightMode lightMode, ShaderBlendMode blendMode, ShaderPreset preset) { Uniforms = uniforms; Varyings = varyings; Functions = functions; LightMode = lightMode; BlendMode = blendMode; Preset = preset; Constants = constants; }
void Update() { if (_layersDirty) { _layers = GetComponentsInChildren <HologramLayer>(); if (_layers == null) { Debug.LogError("No Layers Found"); return; } _layersDirty = false; _materialsDirty = true; } //build materials if shaders are not set or have changed if (_materialsDirty) { BuildMaterials(); _materialsDirty = false; } //draw the layers Matrix4x4 transformmat = Matrix4x4.TRS(transform.position, transform.rotation, transform.localScale); Material m; if (_layers != null) { foreach (HologramLayer layer in _layers) { if (layer == null) { continue; } ShaderBlendMode materialKey = new ShaderBlendMode(layer.Shader, layer.BlendMode); if (_materials.ContainsKey(materialKey)) { m = _materials[materialKey]; SetMaterialProperties(m); layer.Draw(transformmat, m); } else { Debug.LogError("Blending Mode / Shader combo not found in Materials: " + layer.Shader + " " + layer.BlendMode); _materialsDirty = true; } } } }
public override void Draw() { CreateRequiredLayers(); if (Texture == null) { //Don't render if the parent texture is null return; } _occludeLayer.enabled = _selfOcclusion; if (_layersDirty || _layers == null) { _layers = GetComponentsInChildren <Depthkit_ZeroDaysLookLayer>(); if (_layers == null) { Debug.LogError("No Layers Found"); return; } _layersDirty = false; _materialDirty = true; } //build materials if shaders are not set or have changed if (_materialDirty || _materials == null) { BuildMaterials(); _materialDirty = false; } //draw the layers Matrix4x4 transformmat = Matrix4x4.TRS(transform.position, transform.rotation, transform.localScale); Material m; if (_layers != null) { foreach (Depthkit_ZeroDaysLookLayer layer in _layers) { if (layer == null) { continue; } if (_metadataChanged) { layer.SetBounds(_bounds); } ShaderBlendMode materialKey = new ShaderBlendMode(layer.Shader, layer.BlendMode); if (_materials.ContainsKey(materialKey)) { m = _materials[materialKey]; SetMaterialProperties(m); layer.Draw(transformmat, m); } else { Debug.LogError("Blending Mode / Shader combo not found in Materials: " + layer.Shader + " Blend Mode: " + layer.BlendMode); _materialDirty = true; } } _metadataChanged = false; } }