private IndirectionTexture createColorVertexMaterial(Technique technique, MaterialDescription description, bool alpha, bool depthCheck) { //Create depth check pass if needed var pass = createDepthPass(technique, description, alpha, depthCheck); //Setup this pass setupCommonPassAttributes(description, alpha, pass); //Setup material specific depth values pass.setSceneBlending(SceneBlendType.SBT_TRANSPARENT_ALPHA); pass.setDepthFunction(CompareFunction.CMPF_LESS_EQUAL); pass.setDepthWriteEnabled(false); //Material specific, setup shaders pass.setVertexProgram("colorvertex\\vs"); if (alpha) { pass.setFragmentProgram("colorvertex\\fsAlpha"); } else { pass.setFragmentProgram("colorvertex\\fs"); } return(null); }
private MaterialPtr createFromDescription(MaterialDescription description, bool alpha) { String name = description.Name; if (description.CreateAlphaMaterial && alpha) //Is this an automatic alpha material? { name += "Alpha"; } MaterialPtr material = MaterialManager.getInstance().create(name, GroupName, false, null); CreateMaterial createMaterial = createUnifiedMaterial; if (description.IsSpecialMaterial && !specialMaterialFuncs.TryGetValue(description.SpecialMaterial, out createMaterial)) { Logging.Log.Error("Could not find special material creation function {0} for material {1} in {2}.", description.SpecialMaterial, description.Name, description.SourceFile); createMaterial = createUnifiedMaterial; //Attempt to create something, out above clears this variable } IndirectionTexture indirectionTex = createMaterial(material.Value.getTechnique(0), description, alpha, true); if (alpha) { //Create no depth check technique Technique technique = material.Value.createTechnique(); technique.setLodIndex(1); technique.createPass(); createMaterial(technique, description, alpha, false); } //If we have an indirection texture we need to seup the virtual texturing, if not no additional techniques will be created and the //entity must disable itself for feedback buffer rendering somehow (likely visibility mask). if (indirectionTex != null) { String vertexShaderName = shaderFactory.createFeedbackVertexProgram(indirectionTex.FeedbackBufferVPName, description.NumHardwareBones, description.NumHardwarePoses); String fragmentShaderName = shaderFactory.createFeedbackBufferFP(indirectionTex.FeedbackBufferFPName); indirectionTex.setupFeedbackBufferTechnique(material.Value, vertexShaderName); int count = 0; if (!indirectionTextureUsageCounts.TryGetValue(indirectionTex.Id, out count)) { indirectionTextureUsageCounts.Add(indirectionTex.Id, 0); } else { indirectionTextureUsageCounts[indirectionTex.Id] = count + 1; } } material.Value.compile(); material.Value.load(); createdMaterials.Add(material.Value, new MaterialInfo(material.Value, indirectionTex)); return(material); }
private Pass createDepthPass(Technique technique, MaterialDescription description, bool alpha, bool depthCheck) { var pass = technique.getPass(0); //Make sure technique has one pass already defined if ((alpha || description.HasOpacityValue) && depthCheck) { //Setup depth check pass pass.setColorWriteEnabled(false); pass.setDepthBias(-1.0f); pass.setSceneBlending(SceneBlendType.SBT_TRANSPARENT_ALPHA); pass.setVertexProgram(shaderFactory.createDepthCheckVertexProgram("DepthCheckVP", description.NumHardwareBones, description.NumHardwarePoses)); pass.setFragmentProgram(shaderFactory.createHiddenFP("HiddenFP")); pass = technique.createPass(); //Get another pass } return(pass); }
//-------------------------------------- //Specific material creation funcs //-------------------------------------- private IndirectionTexture createUnifiedMaterial(Technique technique, MaterialDescription description, bool alpha, bool depthCheck) { //Create depth check pass if needed var pass = createDepthPass(technique, description, alpha, depthCheck); if (description.NoDepthWriteAlpha) { pass.setDepthWriteEnabled(false); pass.setDepthCheckEnabled(true); pass.setSceneBlending(SceneBlendType.SBT_TRANSPARENT_ALPHA); pass.setDepthFunction(CompareFunction.CMPF_LESS_EQUAL); } else { pass.setDepthWriteEnabled(description.EnableDepthWrite); pass.setDepthCheckEnabled(description.EnableDepthCheck); pass.setSceneBlending(description.SceneBlending); pass.setDepthFunction(description.DepthFunction); } //Setup this pass setupCommonPassAttributes(description, alpha, pass); //Setup shaders TextureMaps textureMaps; pass.setFragmentProgram(shaderFactory.createFragmentProgram(description, alpha, out textureMaps)); pass.setVertexProgram(shaderFactory.createUnifiedVertexProgram(description, textureMaps)); if ((textureMaps & TextureMaps.Opacity) == TextureMaps.Opacity || description.HasOpacityValue) { pass.setSceneBlending(SceneBlendType.SBT_TRANSPARENT_ALPHA); pass.setDepthFunction(CompareFunction.CMPF_LESS_EQUAL); } //Setup Textures IndirectionTexture indirectionTex = null; switch (textureMaps) { case TextureMaps.Normal: indirectionTex = setupNormalTextures(description, pass); break; case TextureMaps.Normal | TextureMaps.Diffuse: indirectionTex = setupNormalDiffuseTextures(description, pass); break; case TextureMaps.Normal | TextureMaps.Diffuse | TextureMaps.Specular: indirectionTex = setupNormalDiffuseSpecularTextures(description, pass); break; case TextureMaps.Normal | TextureMaps.Diffuse | TextureMaps.Opacity: indirectionTex = setupNormalDiffuseOpacityTextures(description, pass); break; case TextureMaps.Normal | TextureMaps.Diffuse | TextureMaps.Opacity | TextureMaps.Specular: indirectionTex = setupNormalDiffuseSpecularOpacityTextures(description, pass); break; case TextureMaps.Normal | TextureMaps.Opacity: indirectionTex = setupNormalOpacityTextures(description, pass); break; } using (var gpuParams = pass.getFragmentProgramParameters()) { if (indirectionTex != null) { virtualTextureManager.setupVirtualTextureFragmentParams(gpuParams, indirectionTex); } if (description.HasGlossMap) { gpuParams.Value.setNamedConstant("glossyStart", description.GlossyStart); gpuParams.Value.setNamedConstant("glossyRange", description.GlossyRange); } if ((textureMaps & TextureMaps.Opacity) == 0 && description.HasOpacityValue) { gpuParams.Value.setNamedConstant("opacity", description.OpacityValue); } } return(indirectionTex); }
private Pass(IntPtr pass, Technique parent) { this.pass = pass; this.parent = parent; }