예제 #1
0
        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();
        }
예제 #2
0
        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();
        }