예제 #1
0
        public StencilShadowRenderer(Game game)
        {
            this.game = game;

            var desc = new MaterialPassDesc();
            desc.ManualConstantBuffers = true;
            desc.ShaderFile = "StencilShadow.hlsl";
            desc.BlendStates.RenderTarget[0].IsBlendEnabled = true;
            desc.BlendStates.RenderTarget[0].SourceBlend = BlendOption.SourceAlpha;
            desc.BlendStates.RenderTarget[0].DestinationBlend = BlendOption.InverseSourceAlpha;
            desc.BlendStates.RenderTarget[0].BlendOperation = BlendOperation.Add;
            desc.BlendStates.RenderTarget[0].SourceAlphaBlend = BlendOption.One;
            desc.BlendStates.RenderTarget[0].DestinationAlphaBlend = BlendOption.Zero;
            desc.BlendStates.RenderTarget[0].AlphaBlendOperation = BlendOperation.Add;
            desc.BlendStates.RenderTarget[0].RenderTargetWriteMask = ColorWriteMaskFlags.All;
            desc.DepthStencilStates.IsDepthEnabled = true;
            desc.DepthStencilStates.DepthWriteMask = DepthWriteMask.Zero;
            desc.DepthStencilStates.DepthComparison = Comparison.LessEqual;
            desc.DepthStencilStates.IsStencilEnabled = true;
            desc.DepthStencilStates.StencilReadMask = 1;
            desc.DepthStencilStates.StencilWriteMask = 1;
            desc.DepthStencilStates.FrontFace.FailOperation = StencilOperation.Keep;
            desc.DepthStencilStates.FrontFace.DepthFailOperation = StencilOperation.Keep;
            desc.DepthStencilStates.FrontFace.PassOperation = StencilOperation.Replace;
            desc.DepthStencilStates.FrontFace.Comparison = Comparison.NotEqual;
            desc.StencilRef = 1;
            pass = new MaterialPass(game.Device, desc, "StencilShadow");
            buffer = Material.CreateBuffer<ShaderData>();
        }
예제 #2
0
        public PassHeader(string title, MaterialPassDesc desc)
        {
            InitializeComponent();

            passDesc = desc;

            labelTitle.Text = title;
            labelShader.Text = desc.ShaderFile;
        }
예제 #3
0
파일: SkyBox.cs 프로젝트: woncomp/LiliumLab
        public SkyBox(Game game, ShaderResourceView cubeMap, string debugName = null)
        {
            this.game = game;
            this.cubeMap = cubeMap;
            cube = game.ResourceManager.Mesh.Load(InternalResources.MESH_CUBE);

            MaterialPassDesc desc = new MaterialPassDesc();
            desc.ManualConstantBuffers = true;
            desc.ShaderFile = "Skybox.hlsl";
            desc.RasteriazerStates.CullMode = CullMode.Front;
            desc.DepthStencilStates.DepthWriteMask = DepthWriteMask.Zero;

            pass = new MaterialPass(game.Device, desc, debugName ?? "Skybox" + Debug.NextObjectId);
            buffer = Material.CreateBuffer<Data>();
        }
예제 #4
0
        public TexturePreviewQuad(Game game, Texture2DDescription textureDesc)
        {
            this.game = game;

            var passDesc = new MaterialPassDesc();
            passDesc.ManualConstantBuffers = true;
            passDesc.ShaderFile = "TexturePreview.hlsl";
            passDesc.InputElements = new InputElement[]{
                new InputElement("POSITION", 0, SharpDX.DXGI.Format.R32G32B32_Float, 0, 0),
                new InputElement("TEXCOORD", 0, SharpDX.DXGI.Format.R32G32_Float, 12, 0),
            };
            pass = new MaterialPass(Game.Instance.Device, passDesc, "Preview");

            BuildVertexBuffer(textureDesc);
        }
예제 #5
0
        public Skydome(Device device)
        {
            this.device = device;
            sphere = Mesh.CreateSphere();

            MaterialPassDesc desc = new MaterialPassDesc();
            desc.ManualConstantBuffers = true;
            desc.ShaderFile = "Skydome.hlsl";
            desc.RasteriazerStates.CullMode = CullMode.None;
            desc.DepthStencilStates.IsDepthEnabled = false;
            pass = new MaterialPass(device, desc, "Skydome");
            buffer = Material.CreateBuffer<Data>();

            //Game.Instance.AddControl(new Lilium.Controls.ColorPicker("Bottom", () => data.bottomColor, val => data.bottomColor = val));
            //Game.Instance.AddControl(new Lilium.Controls.ColorPicker("Top", () => data.topColor, val => data.topColor = val));
        }
예제 #6
0
        public LineRenderer(Game game, int capacity = 128, string debugName = null)
        {
            this.game = game;
            this.capacity = capacity;
            this.debugName = debugName;

            vertices = new LineVertex[capacity * 2];
            isDirty = true;
            is3DInvalid = true;

            Desc = new MaterialPassDesc();
            Desc.ManualConstantBuffers = true;
            Desc.ShaderFile = InternalResources.SHADER_DEBUG_LINE;
            Desc.InputElements = new InputElement[]{
                    new InputElement("POSITION", 0, SharpDX.DXGI.Format.R32G32B32_Float, 0, 0),
                    new InputElement("COLOR", 0, SharpDX.DXGI.Format.R32G32B32A32_Float, 12, 0),
                };
            Desc.RasteriazerStates.CullMode = CullMode.None;
        }
예제 #7
0
        public TangentSpaceBasisRenderer(List<MeshVertex> vertices)
        {
            hasTangent = vertices[0].Tangent.LengthSquared() > 0;
            {
                var lineVerticesList = new List<LineVertex>();
                Action<Color> _addLine = (c) =>
                {
                    lineVerticesList.Add(new LineVertex(Vector3.Zero, c));
                    lineVerticesList.Add(new LineVertex(Vector3.Zero, c));
                };
                for (int i = 0; i < vertices.Count; ++i)
                {
                    var v = vertices[i];
                    if (hasTangent)
                    {
                        _addLine(Color.Red);
                        _addLine(Color.Green);
                    }
                    _addLine(Color.Blue);
                }
                lineVertices = lineVerticesList.ToArray();

                updateLineVertices = delegate
                {
                    int i = 0;
                    int j = 0;
                    for (i = 0; i < vertices.Count; ++i)
                    {
                        var v = vertices[i];
                        var origin = v.Position + Config.TBNOffset * v.Normal;

                        if (hasTangent)
                        {
                            lineVertices[j++].Position = origin;
                            lineVertices[j++].Position = origin + v.Tangent;
                            lineVertices[j++].Position = origin;
                            lineVertices[j++].Position = origin + Vector3.Cross(v.Normal, v.Tangent);
                        }
                        lineVertices[j++].Position = origin;
                        lineVertices[j++].Position = origin + v.Normal;
                    }
                };
            }
            {
                var desc = new BufferDescription();
                desc.BindFlags = BindFlags.VertexBuffer;
                desc.Usage = ResourceUsage.Dynamic;
                desc.CpuAccessFlags = CpuAccessFlags.Write;
                desc.OptionFlags = ResourceOptionFlags.None;
                desc.SizeInBytes = Utilities.SizeOf<LineVertex>() * lineVertices.Length;
                desc.StructureByteStride = 0;
                vertexBuffer = new Buffer(Game.Instance.Device, desc);
            }
            {
                var passDesc = new MaterialPassDesc();
                passDesc.ManualConstantBuffers = true;
                passDesc.ShaderFile = InternalResources.SHADER_DEBUG_LINE;
                passDesc.InputElements = new InputElement[]{
                    new InputElement("POSITION", 0, SharpDX.DXGI.Format.R32G32B32_Float, 0, 0),
                    new InputElement("COLOR", 0, SharpDX.DXGI.Format.R32G32B32A32_Float, 12, 0),
                };
                pass = new MaterialPass(Game.Instance.Device, passDesc, "TangentSpaceBasisRenderer");
                matrixBuffer = Material.CreateBuffer<Matrix>();
            }
        }
예제 #8
0
        public MeshPreview(Mesh mesh)
        {
            this.mesh = mesh;

            var game = Game.Instance;

            {
                var desc = new MaterialPassDesc();
                desc.ManualConstantBuffers = true;
                desc.ShaderFile = "MeshPreview.hlsl";

                passFill = new MaterialPass(game.Device, desc, "Preview(Fill)");
            }
            {
                var desc = new MaterialPassDesc();
                desc.ManualConstantBuffers = true;
                desc.ShaderFile = "MeshPreview.hlsl";
                desc.RasteriazerStates.FillMode = FillMode.Wireframe;

                passWireframe = new MaterialPass(game.Device, desc, "Preview(Wireframe)");
            }
            shaderBuffer = Material.CreateBuffer<ShaderData>();
            shaderBuffer.DebugName = "Preview";

            tangentRenderer = new TangentSpaceBasisRenderer(mesh.vertices);
        }
예제 #9
0
 public void Import(ref MaterialPassDesc desc)
 {
     ShaderFile = desc.ShaderFile;
     VertexShaderFunction = desc.VertexShaderFunction;
     PixelShaderFunction = desc.PixelShaderFunction;
     GeometryShaderFunction = desc.GeometryShaderFunction;
     HullShaderFunction = desc.HullShaderFunction;
     DomainShaderFunction = desc.DomainShaderFunction;
 }
예제 #10
0
 public void Export(ref MaterialPassDesc desc)
 {
     desc.ShaderFile = ShaderFile;
     desc.VertexShaderFunction = VertexShaderFunction;
     desc.PixelShaderFunction = PixelShaderFunction;
     desc.GeometryShaderFunction = GeometryShaderFunction;
     desc.HullShaderFunction = HullShaderFunction;
     desc.DomainShaderFunction = DomainShaderFunction;
 }
예제 #11
0
        public void Import(MaterialPassDesc desc)
        {
            ShaderEntry.Import(ref desc);
            RasterizerStates.Import(ref desc.RasteriazerStates);
            BlendStates.Import(ref desc.BlendStates);
            DepthStencilStates.Import(ref desc.DepthStencilStates);
            StencilRef = desc.StencilRef;

            // Other
            InputElements = InputElement.Import(desc.InputElements);
            Textures = MaterialTexture.Import(desc.Textures);
            VariableValues = desc.VariableValues;
        }
예제 #12
0
        public void Export(MaterialPassDesc desc)
        {
            ShaderEntry.Export(ref desc);
            RasterizerStates.Export(ref desc.RasteriazerStates);
            BlendStates.Export(ref desc.BlendStates);
            DepthStencilStates.Export(ref desc.DepthStencilStates);
            desc.StencilRef = StencilRef;

            // Other
            desc.InputElements = InputElement.Export(InputElements);
            desc.Textures = MaterialTexture.Export(Textures);
            desc.VariableValues = VariableValues ?? new Dictionary<string, string>();
        }
예제 #13
0
 public void Export(MaterialDesc desc)
 {
     desc.Passes = new List<MaterialPassDesc>();
     for (int i = 0; i < Passes.Length; ++i)
     {
         var pass = new MaterialPassDesc();
         Passes[i].Export(pass);
         desc.Passes.Add(pass);
     }
 }
예제 #14
0
파일: Grid.cs 프로젝트: woncomp/LiliumLab
        public void Init()
        {
            {
                BuildVertices();
                var desc = new BufferDescription();
                desc.BindFlags = BindFlags.VertexBuffer;
                desc.Usage = ResourceUsage.Default;
                desc.CpuAccessFlags = CpuAccessFlags.None;
                desc.OptionFlags = ResourceOptionFlags.None;
                desc.SizeInBytes = Utilities.SizeOf<LineVertex>() * vertices.Length;
                desc.StructureByteStride = 0;
                vertexBuffer = Buffer.Create(Device, vertices, desc);//new Buffer(Device, desc);
            }
            {
                var passDesc = new MaterialPassDesc();
                passDesc.ManualConstantBuffers = true;
                passDesc.ShaderFile = InternalResources.SHADER_DEBUG_LINE;
                passDesc.InputElements = new InputElement[]{
                    new InputElement("POSITION", 0, SharpDX.DXGI.Format.R32G32B32_Float, 0, 0),
                    new InputElement("COLOR", 0, SharpDX.DXGI.Format.R32G32B32A32_Float, 12, 0),
                };
                passDesc.RasteriazerStates.CullMode = CullMode.None;
                passDesc.DepthStencilStates.DepthWriteMask = DepthWriteMask.Zero;

                pass = new MaterialPass(Game.Instance.Device, passDesc, "Grid");
                matrixBuffer = Material.CreateBuffer<Matrix>();
            }
        }
예제 #15
0
 void LoadShader()
 {
     var passDesc = new MaterialPassDesc();
     passDesc.ManualConstantBuffers = true;
     passDesc.ShaderFile = shaderFile;
     passDesc.InputElements = new InputElement[]{
         new InputElement("POSITION", 0, SharpDX.DXGI.Format.R32G32B32_Float, 0, 0),
         new InputElement("TEXCOORD", 0, SharpDX.DXGI.Format.R32G32_Float, 12, 0),
     };
     Pass = new MaterialPass(Game.Instance.Device, passDesc, debugName);
 }
예제 #16
0
        public void PreviewActive()
        {
            var desc = new ShaderResourceViewDescription();
            desc.Format = tex.Description.Format;
            desc.Dimension = ShaderResourceViewDimension.TextureCube;
            desc.Texture2D.MipLevels = tex.Description.MipLevels;
            desc.Texture2D.MostDetailedMip = 0;
            shaderResourceView = new ShaderResourceView(mGame.Device, tex, desc);
            shaderResourceView.DebugName = "Preview";

            if (shaderResourceView == null) return;

            desc.Dimension = ShaderResourceViewDimension.Texture2DArray;
            desc.Texture2DArray.ArraySize = 1;
            desc.Texture2DArray.MipLevels = tex.Description.MipLevels;
            desc.Texture2DArray.MostDetailedMip = 0;
            mFaces = new ShaderResourceView[6];
            for (int i = 0; i < 6; ++i)
            {
                desc.Texture2DArray.FirstArraySlice = i;
                mFaces[i] = new ShaderResourceView(mGame.Device, tex, desc);
            }

            cube = mGame.ResourceManager.Mesh.Load(InternalResources.MESH_CUBE);
            sphere = mGame.ResourceManager.Mesh.Load(InternalResources.MESH_SPHERE);

            var passDesc = new MaterialPassDesc();
            passDesc.ManualConstantBuffers = true;
            passDesc.ShaderFile = "CubemapPreview.hlsl";
            passCube = new MaterialPass(Game.Instance.Device, passDesc, "Preview(Cube)");

            passDesc.PixelShaderFunction = "PS_Sphere";
            passSphere = new MaterialPass(mGame.Device, passDesc, "Preview(Sphere)");

            skybox = new SkyBox(mGame, shaderResourceView, "Preview");

            mQuad = new TexturePreviewQuad(mGame, tex.Description);
            Light.IsPreviewingTexture = true;
        }