Beispiel #1
0
 public void SetTextureBindingSlots(ShaderTextureBindingSlots bindingSlots)
 {
     if (_textureBindingSlots != bindingSlots)
     {
         PlatformSetShaderTextureBindingSlots(bindingSlots);
         _textureBindingSlots = bindingSlots;
     }
 }
Beispiel #2
0
 public Material(
     RenderContext rc,
     ShaderSet shaderSet,
     ShaderConstantBindings constantBindings,
     ShaderTextureBindingSlots textureBindingSlots,
     DefaultTextureBindingInfo[] defaultTextureBindings)
 {
     _rc                    = rc;
     ShaderSet              = shaderSet;
     ConstantBindings       = constantBindings;
     TextureBindingSlots    = textureBindingSlots;
     DefaultTextureBindings = defaultTextureBindings;
 }
Beispiel #3
0
        public Material GetMaterial(
            RenderContext rc,
            string vertexShaderName,
            string geometryShaderName,
            string fragmentShaderName,
            MaterialVertexInput vertexInputs,
            MaterialInputs <MaterialGlobalInputElement> globalInputs,
            MaterialInputs <MaterialPerObjectInputElement> perObjectInputs,
            MaterialTextureInputs textureInputs)
        {
            MaterialKey key = new MaterialKey()
            {
                VertexShaderName   = vertexShaderName,
                FragmentShaderName = fragmentShaderName,
                GeometryShaderName = geometryShaderName,
                VertexInputs       = vertexInputs,
                GlobalInputs       = globalInputs
            };

            Material m;

            if (!_materials.TryGetValue(key, out m))
            {
                Shader            vs          = _factory.CreateShader(ShaderType.Vertex, vertexShaderName);
                Shader            fs          = _factory.CreateShader(ShaderType.Fragment, fragmentShaderName);
                VertexInputLayout inputLayout = _factory.CreateInputLayout(vs, vertexInputs);

                ShaderSet shaderSet;
                if (geometryShaderName != null)
                {
                    Shader gs = _factory.CreateShader(ShaderType.Geometry, geometryShaderName);
                    shaderSet = _factory.CreateShaderSet(inputLayout, vs, gs, fs);
                }
                else
                {
                    shaderSet = _factory.CreateShaderSet(inputLayout, vs, fs);
                }

                ShaderConstantBindings    constantBindings = _factory.CreateShaderConstantBindings(rc, shaderSet, globalInputs, perObjectInputs);
                ShaderTextureBindingSlots textureSlots     = _factory.CreateShaderTextureBindingSlots(shaderSet, textureInputs);
                m = new Material(rc, shaderSet, constantBindings, textureSlots, _factory.CreateDefaultTextureBindingInfos(rc, textureInputs));

                if (!_materials.TryAdd(key, m))
                {
                    return(_materials[key]);
                }
            }

            return(m);
        }
Beispiel #4
0
        public Material CreateMaterial(
            RenderContext rc,
            string vertexShaderName,
            string fragmentShaderName,
            MaterialVertexInput[] vertexInputs,
            MaterialInputs <MaterialGlobalInputElement> globalInputs,
            MaterialInputs <MaterialPerObjectInputElement> perObjectInputs,
            MaterialTextureInputs textureInputs)
        {
            Shader                    vs               = CreateShader(ShaderType.Vertex, vertexShaderName);
            Shader                    fs               = CreateShader(ShaderType.Fragment, fragmentShaderName);
            VertexInputLayout         inputLayout      = CreateInputLayout(vs, vertexInputs);
            ShaderSet                 shaderSet        = CreateShaderSet(inputLayout, vs, fs);
            ShaderConstantBindings    constantBindings = CreateShaderConstantBindings(rc, shaderSet, globalInputs, perObjectInputs);
            ShaderTextureBindingSlots textureSlots     = CreateShaderTextureBindingSlots(shaderSet, textureInputs);

            DefaultTextureBindingInfo[] defaultTextureInfos = CreateDefaultTextureBindingInfos(rc, textureInputs);

            return(new Material(rc, shaderSet, constantBindings, textureSlots, defaultTextureInfos));
        }
Beispiel #5
0
        private Material CreateMaterial(RenderContext rc)
        {
            ResourceFactory   factory     = rc.ResourceFactory;
            Shader            vs          = factory.CreateShader(ShaderType.Vertex, "text-vertex");
            Shader            fs          = factory.CreateShader(ShaderType.Fragment, "text-fragment");
            VertexInputLayout inputLayout = factory.CreateInputLayout(vs, new MaterialVertexInput(TextVertex.SizeInBytes,
                                                                                                  new MaterialVertexInputElement("in_position", VertexSemanticType.Position, VertexElementFormat.Float2),
                                                                                                  new MaterialVertexInputElement("in_texCoords", VertexSemanticType.TextureCoordinate, VertexElementFormat.Float2),
                                                                                                  new MaterialVertexInputElement("in_color", VertexSemanticType.Color, VertexElementFormat.Byte4)));
            ShaderSet shaderSet = factory.CreateShaderSet(inputLayout, vs, fs);

            _constantBindings = factory.CreateShaderConstantBindings(rc, shaderSet,
                                                                     MaterialInputs <MaterialGlobalInputElement> .Empty,
                                                                     new MaterialInputs <MaterialPerObjectInputElement>(
                                                                         new MaterialPerObjectInputElement("ProjectionMatrixBuffer", MaterialInputType.Matrix4x4, 64),
                                                                         new MaterialPerObjectInputElement("TextOffsetBuffer", MaterialInputType.Float4, 16),
                                                                         new MaterialPerObjectInputElement("AtlasInfoBuffer", MaterialInputType.Custom, 16)));
            ShaderTextureBindingSlots textureSlots = factory.CreateShaderTextureBindingSlots(shaderSet, new MaterialTextureInputs(new ManualTextureInput("FontAtlas")));
            Material material = new Material(rc, shaderSet, _constantBindings, textureSlots);

            return(material);
        }
Beispiel #6
0
        private void InitializeContextObjects(AssetDatabase ad, RenderContext rc)
        {
            ResourceFactory factory = rc.ResourceFactory;

            _vb = factory.CreateVertexBuffer(new[] { new VertexPosition(Vector3.Zero) }, new VertexDescriptor(12, 1), false);
            _ib = factory.CreateIndexBuffer(new[] { 0 }, false);
            Shader            vertexShader   = factory.CreateShader(ShaderType.Vertex, "geometry-vertex");
            Shader            geometryShader = factory.CreateShader(ShaderType.Geometry, _geometryShaderName);
            Shader            fragmentShader = factory.CreateShader(ShaderType.Fragment, "geometry-frag");
            VertexInputLayout inputLayout    = factory.CreateInputLayout(
                vertexShader, new MaterialVertexInput(12, new MaterialVertexInputElement("in_position", VertexSemanticType.Position, VertexElementFormat.Float3)));
            ShaderSet shaderSet = factory.CreateShaderSet(inputLayout, vertexShader, geometryShader, fragmentShader);
            ShaderConstantBindings constantBindings = factory.CreateShaderConstantBindings(rc, shaderSet,
                                                                                           new MaterialInputs <MaterialGlobalInputElement>(
                                                                                               new MaterialGlobalInputElement("ProjectionMatrixBuffer", MaterialInputType.Matrix4x4, "ProjectionMatrix"),
                                                                                               new MaterialGlobalInputElement("ViewMatrixBuffer", MaterialInputType.Matrix4x4, "ViewMatrix"),
                                                                                               new MaterialGlobalInputElement("CameraInfoBuffer", MaterialInputType.Custom, "CameraInfo")
                                                                                               ),
                                                                                           new MaterialInputs <MaterialPerObjectInputElement>(
                                                                                               new MaterialPerObjectInputElement("WorldMatrixBuffer", MaterialInputType.Matrix4x4, _worldProvider.DataSizeInBytes)));
            ShaderTextureBindingSlots slots = factory.CreateShaderTextureBindingSlots(shaderSet, MaterialTextureInputs.Empty);

            _material = new Material(rc, shaderSet, constantBindings, slots, Array.Empty <DefaultTextureBindingInfo>());
        }
Beispiel #7
0
        private readonly RenderContext _rc; // TODO: Temporary, remove when Material.UseTexture is obsolete.

        public Material(RenderContext rc, ShaderSet shaderSet, ShaderConstantBindings constantBindings, ShaderTextureBindingSlots textureBindingSlots)
            : this(rc, shaderSet, constantBindings, textureBindingSlots, Array.Empty <DefaultTextureBindingInfo>())
        {
        }
Beispiel #8
0
        private void InitializeContextObjects(AssetDatabase ad, RenderContext rc)
        {
            ResourceFactory factory = rc.ResourceFactory;
            MeshData        sphere  = ad.LoadAsset <ObjFile>(new AssetID("Models/Sphere.obj")).GetFirstMesh();

            Vector3[] spherePositions = sphere.GetVertexPositions();
            _sphereGeometryVB = factory.CreateVertexBuffer(spherePositions.Length * 12, false);
            _sphereGeometryVB.SetVertexData(spherePositions, new VertexDescriptor(12, 1));
            _ib = sphere.CreateIndexBuffer(factory, out _indexCount);

            Random r     = new Random();
            int    width = InstanceRows;

            InstanceData[] instanceData = new InstanceData[width * width * width];
            for (int z = 0; z < width; z++)
            {
                for (int y = 0; y < width; y++)
                {
                    for (int x = 0; x < width; x++)
                    {
                        instanceData[z * width * width + y * width + x] = new InstanceData(
                            new Vector3(x * 10, y * 10, z * 10),
                            new RgbaFloat((float)r.NextDouble(), (float)r.NextDouble(), (float)r.NextDouble(), (float)r.NextDouble()));
                    }
                }
            }

            _instanceVB = factory.CreateVertexBuffer(instanceData.Length * InstanceData.SizeInBytes, false);
            _instanceVB.SetVertexData(instanceData, new VertexDescriptor(InstanceData.SizeInBytes, 2, 0, IntPtr.Zero));

            {
                Shader            vs          = factory.CreateShader(ShaderType.Vertex, "instanced-simple-vertex");
                Shader            fs          = factory.CreateShader(ShaderType.Fragment, "instanced-simple-frag");
                VertexInputLayout inputLayout = factory.CreateInputLayout(
                    vs,
                    new MaterialVertexInput(VertexPosition.SizeInBytes, new MaterialVertexInputElement("in_position", VertexSemanticType.Position, VertexElementFormat.Float3)),
                    new MaterialVertexInput(
                        InstanceData.SizeInBytes,
                        new MaterialVertexInputElement("in_offset", VertexSemanticType.TextureCoordinate, VertexElementFormat.Float3, VertexElementInputClass.PerInstance, 1),
                        new MaterialVertexInputElement("in_color", VertexSemanticType.Color, VertexElementFormat.Float4, VertexElementInputClass.PerInstance, 1)));
                ShaderSet shaderSet = factory.CreateShaderSet(inputLayout, vs, fs);
                ShaderConstantBindings constantBindings = factory.CreateShaderConstantBindings(rc, shaderSet,
                                                                                               new MaterialInputs <MaterialGlobalInputElement>(
                                                                                                   new MaterialGlobalInputElement("ProjectionMatrixBuffer", MaterialInputType.Matrix4x4, "ProjectionMatrix"),
                                                                                                   new MaterialGlobalInputElement("ViewMatrixBuffer", MaterialInputType.Matrix4x4, "ViewMatrix")),
                                                                                               new MaterialInputs <MaterialPerObjectInputElement>(
                                                                                                   new MaterialPerObjectInputElement("WorldMatrixBuffer", MaterialInputType.Matrix4x4, 16)));
                ShaderTextureBindingSlots textureSlots = factory.CreateShaderTextureBindingSlots(shaderSet, MaterialTextureInputs.Empty);
                _material = new Material(rc, shaderSet, constantBindings, textureSlots, Array.Empty <DefaultTextureBindingInfo>());
            }

            //Shader vertexShader = factory.CreateShader(ShaderType.Vertex, "instanced-simple-vertex");
            //Shader fragmentShader = factory.CreateShader(ShaderType.Fragment, "instanced-simple-frag");
            //VertexInputLayout inputLayout = factory.CreateInputLayout(
            //    vertexShader,
            //    new MaterialVertexInput(VertexPosition.SizeInBytes, new MaterialVertexInputElement("in_position", VertexSemanticType.Position, VertexElementFormat.Float3)),
            //    new MaterialVertexInput(
            //        InstanceData.SizeInBytes,
            //        new MaterialVertexInputElement("in_offset", VertexSemanticType.TextureCoordinate, VertexElementFormat.Float3, VertexElementInputClass.PerInstance, 1),
            //        new MaterialVertexInputElement("in_color", VertexSemanticType.Color, VertexElementFormat.Float4, VertexElementInputClass.PerInstance, 1)));
            //ShaderSet shaderSet = factory.CreateShaderSet(inputLayout, vertexShader, fragmentShader);
            //ShaderConstantBindings constantBindings = factory.CreateShaderConstantBindings(
            //    rc,
            //    shaderSet,
            //    new MaterialInputs<MaterialGlobalInputElement>(
            //        new MaterialGlobalInputElement("ProjectionMatrixBuffer", MaterialInputType.Matrix4x4, "ProjectionMatrix"),
            //        new MaterialGlobalInputElement("ViewMatrixBuffer", MaterialInputType.Matrix4x4, "ViewMatrix")),
            //    new MaterialInputs<MaterialPerObjectInputElement>(
            //        new MaterialPerObjectInputElement("WorldMatrixBuffer", MaterialInputType.Matrix4x4, 16)));
            //ShaderTextureBindingSlots textureSlots = factory.CreateShaderTextureBindingSlots(shaderSet, MaterialTextureInputs.Empty);
            //_material = factory.CreateMaterial(rc, shaderSet, constantBindings, textureSlots);

            //_material = factory.CreateMaterial(rc, "instanced-simple-vertex", "instanced-simple-frag",
            //    new MaterialVertexInput(12, new MaterialVertexInputElement("in_position", VertexSemanticType.Position, VertexElementFormat.Float3)),
            //    new MaterialVertexInput(
            //        InstanceData.SizeInBytes,
            //        new MaterialVertexInputElement("in_offset", VertexSemanticType.TextureCoordinate, VertexElementFormat.Float3, VertexElementInputClass.PerInstance, 1),
            //        new MaterialVertexInputElement("in_color", VertexSemanticType.Color, VertexElementFormat.Float4, VertexElementInputClass.PerInstance, 1)),
            //    new MaterialInputs<MaterialGlobalInputElement>(
            //        new MaterialGlobalInputElement("ProjectionMatrixBuffer", MaterialInputType.Matrix4x4, "ProjectionMatrix"),
            //        new MaterialGlobalInputElement("ViewMatrixBuffer", MaterialInputType.Matrix4x4, "ViewMatrix")),
            //    new MaterialInputs<MaterialPerObjectInputElement>(
            //        new MaterialPerObjectInputElement("WorldMatrixBuffer", MaterialInputType.Matrix4x4, 16)),
            //    MaterialTextureInputs.Empty);
        }
Beispiel #9
0
 protected abstract void PlatformSetShaderTextureBindingSlots(ShaderTextureBindingSlots bindingSlots);