void DoSpecularMetallicArea(Material material) { SpecularMode specularMode = (SpecularMode)material.GetInt("_SpecularMode"); if (specularMode == SpecularMode.BlinnPhong) { if (specularMap.textureValue == null) { m_MaterialEditor.TexturePropertyTwoLines(Styles.specularMapText, specularMap, specularColor, Styles.smoothnessText, smoothness); } else { m_MaterialEditor.TexturePropertySingleLine(Styles.specularMapText, specularMap); m_MaterialEditor.ShaderProperty(reflectanceMin, Styles.reflectanceMinText.text, 2); m_MaterialEditor.ShaderProperty(reflectanceMax, Styles.reflectanceMaxText.text, 2); } } else if (specularMode == SpecularMode.Metallic) { if (metallicMap.textureValue == null) { m_MaterialEditor.TexturePropertyTwoLines(Styles.metallicMapText, metallicMap, metallic, Styles.smoothnessText, smoothness); } else { m_MaterialEditor.TexturePropertySingleLine(Styles.metallicMapText, metallicMap); } } }
DefaultSampler(int FirstHitSamples, int MaxBounces, bool DirectLighting, bool SoftShadows, LightMode LM, SpecularMode SM) { this.FirstHitSamples = FirstHitSamples; this.MaxBounces = MaxBounces; this.DirectLighting = DirectLighting; this.SoftShadows = SoftShadows; LightMode = LM; SpecularMode = SM; }
public void SetSpecularMode(SpecularMode s) { SpecularMode = s; }
public override void Deserialize(string key, string value) { switch (key) { case "lgpr": lightPrecision = (LightPrecision)int.Parse(value); break; case "limd": lightMode = (LightMode)int.Parse(value); break; case "uamb": useAmbient = bool.Parse(value); break; case "mssp": maskedSpec = bool.Parse(value); break; case "bkdf": bakedLight = bool.Parse(value); break; case "spmd": specularMode = (SpecularMode)int.Parse(value); break; case "trmd": transparencyMode = (TransparencyMode)int.Parse(value); break; case "grmd": glossRoughMode = (GlossRoughMode)int.Parse(value); break; /*case "shdc": * shadowCast = bool.Parse( value ); * break; * case "shdr": * shadowReceive = bool.Parse( value ); * break;*/ case "lico": lightCount = (LightCount)int.Parse(value); break; case "lmpd": bakedLight |= bool.Parse(value); break; case "lprd": bakedLight |= bool.Parse(value); break; case "hqlp": highQualityLightProbes = bool.Parse(value); break; case "rprd": reflectprobed = bool.Parse(value); break; case "enco": energyConserving = bool.Parse(value); break; case "rmgx": remapGlossExponentially = bool.Parse(value); break; case "imps": includeMetaPass = bool.Parse(value); break; case "rpth": renderPath = (RenderPath)int.Parse(value); break; } }
public override float DrawInner(ref Rect r) { float prevYpos = r.y; r.y = 0; r.xMin += 20; r.y += 20; renderPath = (RenderPath)UndoableContentScaledToolbar(r, "Render Path", (int)renderPath, strRenderPath, "render path"); if (renderPath == RenderPath.Deferred) { if (lightMode != LightMode.PBL) { lightMode = LightMode.PBL; } if (ps.catBlending.autoSort == false) { ps.catBlending.autoSort = true; } if (ps.catBlending.blendModePreset != BlendModePreset.Opaque) { ps.catBlending.blendModePreset = BlendModePreset.Opaque; ps.catBlending.ConformBlendsToPreset(); } } r.y += 20; if (renderPath == RenderPath.Deferred) { GUI.enabled = false; UndoableContentScaledToolbar(r, "Light Mode", (int)LightMode.PBL, strLightMode, "light mode"); GUI.enabled = true; } else { lightMode = (LightMode)UndoableContentScaledToolbar(r, "Light Mode", (int)lightMode, strLightMode, "light mode"); } r.y += 20; if (IsPBL()) { specularMode = (SpecularMode)UndoableContentScaledToolbar(r, "Specular Mode", (int)specularMode, strSpecularMode, "specular mode"); r.y += 20; } GUI.enabled = ps.HasSpecular(); glossRoughMode = (GlossRoughMode)UndoableContentScaledToolbar(r, "Gloss Mode", (int)glossRoughMode, strGlossRoughMode, "gloss mode"); r.y += 20; GUI.enabled = true; GUI.enabled = ps.HasAlpha(); // Has Opacity connected transparencyMode = (TransparencyMode)UndoableContentScaledToolbar(r, "Transparency Mode", (int)transparencyMode, strTransparencyMode, "transparency mode"); r.y += 20; GUI.enabled = true; if (ps.catLighting.IsPBL() == false) { UndoableConditionalToggle(r, ref remapGlossExponentially, usableIf: ps.HasGloss() && renderPath != RenderPath.Deferred, disabledDisplayValue: renderPath == RenderPath.Deferred ? true : false, label: "Remap gloss from [0-1] to " + ((renderPath == RenderPath.Deferred) ? "[0-128]" : "[1-2048]"), undoSuffix: "gloss remap" ); r.y += 20; } if (lightMode == LightMode.Unlit || lightMode == LightMode.PBL) { GUI.enabled = false; } { //bool b = energyConserving; if (lightMode == LightMode.PBL) { GUI.Toggle(r, true, "Energy Conserving"); // Dummy display of a checked energy conserve } else { energyConserving = UndoableToggle(r, energyConserving, "Energy Conserving", "energy conservation", null); } //energyConserving = GUI.Toggle( r, energyConserving, "Energy Conserving" ); r.y += 20; GUI.enabled = true; } GUI.enabled = renderPath == RenderPath.Forward; lightCount = (LightCount)UndoableContentScaledToolbar(r, "Light Count", (int)lightCount, strLightCount, "light count"); GUI.enabled = true; r.y += 20; //lightPrecision = (LightPrecision)ContentScaledToolbar(r, "Light Quality", (int)lightPrecision, strLightPrecision ); // TODO: Too unstable for release //r.y += 20; UndoableConditionalToggle(r, ref bakedLight, usableIf: ps.HasDiffuse() && lightMode != LightMode.Unlit, disabledDisplayValue: false, label: "Lightmap & light probes", undoSuffix: "lightmap & light probes" ); r.y += 20; bool wantsMetaPass = ps.catLighting.bakedLight && (ps.HasDiffuse() || ps.HasEmissive()); UndoableConditionalToggle(r, ref includeMetaPass, usableIf: wantsMetaPass, disabledDisplayValue: false, label: "Write meta pass (light bounce coloring)", undoSuffix: "write meta pass" ); r.y += 20; //includeMetaPass = UndoableToggle( r, includeMetaPass, "Write meta pass (light bounce coloring)", "write meta pass", null ); //r.y += 20; highQualityLightProbes = UndoableToggle(r, highQualityLightProbes, "Per-pixel light probe sampling", "per-pixel light probe sampling", null); r.y += 20; UndoableConditionalToggle(r, ref reflectprobed, usableIf: ps.HasSpecular() && lightMode != LightMode.Unlit, disabledDisplayValue: false, label: "Reflection probe support", undoSuffix: "reflection probe support" ); r.y += 20; /*shadowCast = GUI.Toggle( r, shadowCast, "Cast shadows" ); * r.y += 20; * shadowReceive = GUI.Toggle( r, shadowReceive, "Receive shadows" ); * r.y += 20;*/ //GUI.enabled = IsLit(); /* * UndoableConditionalToggle( r, ref geometricAntiAliasing, * usableIf: ps.HasSpecular() && ps.catLighting.IsPBL(), * disabledDisplayValue: false, * label: "Geometric specular anti-aliasing", * undoSuffix: "geometric specular anti-aliasing" * ); * r.y += 20; */ UndoableConditionalToggle(r, ref useAmbient, usableIf: !bakedLight && ps.catLighting.IsLit(), disabledDisplayValue: bakedLight, label: "Receive Ambient Light", undoSuffix: "receive ambient light" ); r.y += 20; /* * if(lightprobed){ * GUI.enabled = false; * GUI.Toggle( r, true, "Receive Ambient Light" ); * GUI.enabled = true; * }else{ * useAmbient = GUI.Toggle( r, useAmbient, "Receive Ambient Light" ); * }*/ //r.y += 20; /* DISABLED DUE TO CAUSING TOO MANY ARTIFACTS * if(ps.catLighting.HasSpecular() && renderPath == RenderPath.Forward){ * maskedSpec = UndoableToggle( r, maskedSpec, "Mask directional light specular by shadows", "directional light specular shadow masking", null ); * } else { * GUI.enabled = false; * GUI.Toggle( r, false, "Mask directional light specular by shadows" ); * GUI.enabled = true; * } * r.y += 20;*/ r.y += prevYpos; return((int)r.yMax); }
static void SetMaterialKeywords(Material material) { // Note: keywords must be based on Material value not on MaterialProperty due to multi-edit & material animation // (MaterialProperty value might come from renderer material property block) SetKeyword(material, "_NORMALMAP", material.GetTexture("_BumpMap") || material.GetTexture("_DetailNormalMap")); SpecularMode specularMode = (SpecularMode)material.GetInt("_SpecularMode"); if (specularMode == SpecularMode.BlinnPhong) { SetKeyword(material, "_SPECGLOSSMAP", material.GetTexture("_SpecGlossMap")); } else if (specularMode == SpecularMode.Metallic) { SetKeyword(material, "_METALLICGLOSSMAP", material.GetTexture("_MetallicGlossMap")); } SetKeyword(material, "S_SPECULAR_NONE", specularMode == SpecularMode.None); SetKeyword(material, "S_SPECULAR_BLINNPHONG", specularMode == SpecularMode.BlinnPhong); SetKeyword(material, "S_SPECULAR_METALLIC", specularMode == SpecularMode.Metallic); SetKeyword(material, "S_OCCLUSION", material.GetTexture("_OcclusionMap")); SetKeyword(material, "_PARALLAXMAP", material.GetTexture("_ParallaxMap")); SetKeyword(material, "_DETAIL_MULX2", material.GetTexture("_DetailAlbedoMap") || material.GetTexture("_DetailNormalMap")); SetKeyword(material, "S_OVERRIDE_LIGHTMAP", material.GetTexture("g_tOverrideLightmap")); SetKeyword(material, "S_UNLIT", material.GetInt("g_bUnlit") == 1); SetKeyword(material, "S_WORLD_ALIGNED_TEXTURE", material.GetInt("g_bWorldAlignedTexture") == 1); bool shouldEmissionBeEnabled = ShouldEmissionBeEnabled(material.GetColor("_EmissionColor")); SetKeyword(material, "_EMISSION", shouldEmissionBeEnabled); // Setup lightmap emissive flags MaterialGlobalIlluminationFlags flags = material.globalIlluminationFlags; if ((flags & (MaterialGlobalIlluminationFlags.BakedEmissive | MaterialGlobalIlluminationFlags.RealtimeEmissive)) != 0) { flags &= ~MaterialGlobalIlluminationFlags.EmissiveIsBlack; if (!shouldEmissionBeEnabled) { flags |= MaterialGlobalIlluminationFlags.EmissiveIsBlack; } material.globalIlluminationFlags = flags; } // Reflectance constants float flReflectanceMin = material.GetFloat("g_flReflectanceMin"); float flReflectanceMax = material.GetFloat("g_flReflectanceMax"); material.SetFloat("g_flReflectanceScale", Mathf.Max(flReflectanceMin, flReflectanceMax) - flReflectanceMin); material.SetFloat("g_flReflectanceBias", flReflectanceMin); // World aligned texture constants Vector4 worldAlignedTextureNormal = material.GetVector("g_vWorldAlignedTextureNormal"); Vector3 normal = new Vector3(worldAlignedTextureNormal.x, worldAlignedTextureNormal.y, worldAlignedTextureNormal.z); normal = (normal.sqrMagnitude > 0.0f) ? normal : Vector3.up; Vector3 tangentU = Vector3.zero, tangentV = Vector3.zero; Vector3.OrthoNormalize(ref normal, ref tangentU, ref tangentV); material.SetVector("g_vWorldAlignedNormalTangentU", new Vector4(tangentU.x, tangentU.y, tangentU.z, 0.0f)); material.SetVector("g_vWorldAlignedNormalTangentV", new Vector4(tangentV.x, tangentV.y, tangentV.z, 0.0f)); // Static combo skips if (material.GetInt("g_bUnlit") == 1) { material.DisableKeyword("_NORMALMAP"); material.EnableKeyword("S_SPECULAR_NONE"); material.DisableKeyword("S_SPECULAR_BLINNPHONG"); material.DisableKeyword("S_SPECULAR_METALLIC"); material.DisableKeyword("_METALLICGLOSSMAP"); material.DisableKeyword("_SPECGLOSSMAP"); material.DisableKeyword("S_OVERRIDE_LIGHTMAP"); } }