private void CreateShader(MaterialType material, ShadingTechnique shadingTechnique, RenderQueue renderQueue) { if (shadingTechnique == ShadingTechnique.Deferred && RenderQueue == RenderQueue.CustomShaderOpaque) { throw new NotSupportedException("CustomOpaque shaders are not supported yet in Deferred Shading mode."); } this.RenderQueue = renderQueue; this.MaterialType = material; this.ShadingTechnique = shadingTechnique; OpenGLShader shader; this._shader = shader = new OpenGLShader(); _shader.Code = GetDefaultShaderCode(); _shader.Code += string.Format("\n#if defined FRAGMENT_SHADER\n{0}\n#endif\n", Resources.StandardShaders); shader.Define(material.ToString()); switch (material) { case MaterialType.FlatColor: case MaterialType.FlatTextureColor: case MaterialType.FlatVertexColor: break; case MaterialType.DiffuseColor: case MaterialType.DiffuseColorTexture: case MaterialType.DiffuseNormalTextureColor: case MaterialType.ReflectionDiffuseColor: case MaterialType.RimDiffuseColorTexture: case MaterialType.RimReflectionDiffuseTextureColor: shader.Flags = ShaderDefines.USE_LIGHTING; break; default: throw new NotSupportedException(material.ToString()); } InitShader(); }
public Material(string vertexShaderMethod, string fragmentShaderMethod, RenderQueue renderQueue, MaterialOptions options = 0) { this.MaterialType = MaterialType.Custom; this.RenderQueue = renderQueue; this.ShadingTechnique = Graphics.GetCurrent(true).CurrentShadingTechnique; OpenGLShader shader; this._shader = shader = new OpenGLShader(); shader.Code = GetDefaultShaderCode(); if (options.HasFlag(MaterialOptions.NoLighting) == false) { shader.Flags |= ShaderDefines.USE_LIGHTING; } if (string.IsNullOrWhiteSpace(vertexShaderMethod) == false) { shader.Flags |= ShaderDefines.CUSTOM_VERTEX; shader.Code += string.Format("\n#if defined VERTEX_SHADER\n{0}\n#endif\n", vertexShaderMethod); } shader.Code += string.Format("\n#if defined FRAGMENT_SHADER\n{0}\n#endif\n", fragmentShaderMethod); InitShader(); }