ActiveFields GetActiveFieldsFromMasterNode(PBRMasterNode masterNode, ShaderPass pass) { var activeFields = new ActiveFields(); var baseActiveFields = activeFields.baseInstance; // Graph Vertex if (masterNode.IsSlotConnected(PBRMasterNode.PositionSlotId) || masterNode.IsSlotConnected(PBRMasterNode.VertNormalSlotId) || masterNode.IsSlotConnected(PBRMasterNode.VertTangentSlotId)) { baseActiveFields.Add("features.graphVertex"); } // Graph Pixel (always enabled) baseActiveFields.Add("features.graphPixel"); if (masterNode.IsSlotConnected(PBRMasterNode.AlphaThresholdSlotId) || masterNode.GetInputSlots <Vector1MaterialSlot>().First(x => x.id == PBRMasterNode.AlphaThresholdSlotId).value > 0.0f) { baseActiveFields.Add("AlphaClip"); } if (masterNode.model == PBRMasterNode.Model.Specular) { baseActiveFields.Add("SpecularSetup"); } if (masterNode.IsSlotConnected(PBRMasterNode.NormalSlotId)) { baseActiveFields.Add("Normal"); } // Keywords for transparent // #pragma shader_feature _SURFACE_TYPE_TRANSPARENT if (masterNode.surfaceType != ShaderGraph.SurfaceType.Opaque) { // transparent-only defines baseActiveFields.Add("SurfaceType.Transparent"); // #pragma shader_feature _ _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY if (masterNode.alphaMode == AlphaMode.Alpha) { baseActiveFields.Add("BlendMode.Alpha"); } else if (masterNode.alphaMode == AlphaMode.Additive) { baseActiveFields.Add("BlendMode.Add"); } else if (masterNode.alphaMode == AlphaMode.Premultiply) { baseActiveFields.Add("BlendMode.Premultiply"); } } return(activeFields); }
private static HashSet <string> GetActiveFieldsFromMasterNode(INode iMasterNode, Pass pass) { HashSet <string> activeFields = new HashSet <string>(); PBRMasterNode masterNode = iMasterNode as PBRMasterNode; if (masterNode == null) { return(activeFields); } if (masterNode.twoSided.isOn) { activeFields.Add("DoubleSided"); if (pass.ShaderPassName != "SHADERPASS_VELOCITY") // HACK to get around lack of a good interpolator dependency system { // we need to be able to build interpolators using multiple input structs // also: should only require isFrontFace if Normals are required... activeFields.Add("DoubleSided.Mirror"); // TODO: change this depending on what kind of normal flip you want.. activeFields.Add("FragInputs.isFrontFace"); // will need this for determining normal flip mode } } switch (masterNode.model) { case PBRMasterNode.Model.Metallic: break; case PBRMasterNode.Model.Specular: activeFields.Add("Material.SpecularColor"); break; default: // TODO: error! break; } if (masterNode.IsSlotConnected(PBRMasterNode.AlphaThresholdSlotId) || masterNode.GetInputSlots <Vector1MaterialSlot>().First(x => x.id == PBRMasterNode.AlphaThresholdSlotId).value > 0.0f) { activeFields.Add("AlphaTest"); } if (masterNode.surfaceType != SurfaceType.Opaque) { activeFields.Add("SurfaceType.Transparent"); if (masterNode.alphaMode == AlphaMode.Alpha) { activeFields.Add("BlendMode.Alpha"); } else if (masterNode.alphaMode == AlphaMode.Additive) { activeFields.Add("BlendMode.Add"); } // By default PBR node will take the fog activeFields.Add("AlphaFog"); } else { // opaque-only defines } return(activeFields); }
private static ActiveFields GetActiveFieldsFromMasterNode(AbstractMaterialNode iMasterNode, Pass pass) { var activeFields = new ActiveFields(); var baseActiveFields = activeFields.baseInstance; PBRMasterNode masterNode = iMasterNode as PBRMasterNode; if (masterNode == null) { return(activeFields); } if (masterNode.twoSided.isOn) { baseActiveFields.Add("DoubleSided"); if (pass.ShaderPassName != "SHADERPASS_MOTION_VECTORS") // HACK to get around lack of a good interpolator dependency system { // we need to be able to build interpolators using multiple input structs // also: should only require isFrontFace if Normals are required... baseActiveFields.Add("DoubleSided.Mirror"); // TODO: change this depending on what kind of normal flip you want.. baseActiveFields.Add("FragInputs.isFrontFace"); // will need this for determining normal flip mode } } switch (masterNode.model) { case PBRMasterNode.Model.Metallic: break; case PBRMasterNode.Model.Specular: baseActiveFields.Add("Material.SpecularColor"); break; default: // TODO: error! break; } if (masterNode.IsSlotConnected(PBRMasterNode.AlphaThresholdSlotId) || masterNode.GetInputSlots <Vector1MaterialSlot>().First(x => x.id == PBRMasterNode.AlphaThresholdSlotId).value > 0.0f) { baseActiveFields.Add("AlphaTest"); } switch (masterNode.normalDropOffSpace) { case NormalDropOffSpace.Tangent: baseActiveFields.AddAll("features.NormalDropOffTS"); break; case NormalDropOffSpace.Object: baseActiveFields.AddAll("features.NormalDropOffOS"); break; case NormalDropOffSpace.World: baseActiveFields.AddAll("features.NormalDropOffWS"); break; default: UnityEngine.Debug.LogError("Unknown normal drop off space: " + masterNode.normalDropOffSpace); break; } if (masterNode.surfaceType != UnityEditor.ShaderGraph.SurfaceType.Opaque) { baseActiveFields.Add("SurfaceType.Transparent"); if (masterNode.alphaMode == AlphaMode.Alpha) { baseActiveFields.Add("BlendMode.Alpha"); } else if (masterNode.alphaMode == AlphaMode.Additive) { baseActiveFields.Add("BlendMode.Add"); } // By default PBR node will take the fog baseActiveFields.Add("AlphaFog"); } else { // opaque-only defines } return(activeFields); }
private static HashSet <string> GetActiveFieldsFromMasterNode(INode iMasterNode, Pass pass) { HashSet <string> activeFields = new HashSet <string>(); PBRMasterNode masterNode = iMasterNode as PBRMasterNode; if (masterNode == null) { return(activeFields); } if (masterNode.twoSided.isOn) { activeFields.Add("DoubleSided"); if (pass.ShaderPassName != "SHADERPASS_VELOCITY") // HACK to get around lack of a good interpolator dependency system { // we need to be able to build interpolators using multiple input structs // also: should only require isFrontFace if Normals are required... activeFields.Add("DoubleSided.Mirror"); // TODO: change this depending on what kind of normal flip you want.. activeFields.Add("FragInputs.isFrontFace"); // will need this for determining normal flip mode } } switch (masterNode.model) { case PBRMasterNode.Model.Metallic: break; case PBRMasterNode.Model.Specular: activeFields.Add("Material.SpecularColor"); break; default: // TODO: error! break; } if (masterNode.IsSlotConnected(PBRMasterNode.AlphaThresholdSlotId) || masterNode.GetInputSlots <Vector1MaterialSlot>().First(x => x.id == PBRMasterNode.AlphaThresholdSlotId).value > 0.0f) { activeFields.Add("AlphaTest"); } // Keywords for transparent // #pragma shader_feature _SURFACE_TYPE_TRANSPARENT if (masterNode.surfaceType != SurfaceType.Opaque) { // transparent-only defines activeFields.Add("SurfaceType.Transparent"); // #pragma shader_feature _ _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY if (masterNode.alphaMode == AlphaMode.Alpha) { activeFields.Add("BlendMode.Alpha"); } else if (masterNode.alphaMode == AlphaMode.Additive) { activeFields.Add("BlendMode.Add"); } // else if (masterNode.alphaMode == PBRMasterNode.AlphaMode.PremultiplyAlpha) // TODO // { // defines.AddShaderChunk("#define _BLENDMODE_PRE_MULTIPLY 1", true); // } } else { // opaque-only defines } // enable dithering LOD crossfade // #pragma multi_compile _ LOD_FADE_CROSSFADE // TODO: We should have this keyword only if VelocityInGBuffer is enable, how to do that ? //#pragma multi_compile VELOCITYOUTPUT_OFF VELOCITYOUTPUT_ON return(activeFields); }