コード例 #1
0
ファイル: GlowPS.cs プロジェクト: OkashiKami/Odyssey
        public GlowPS()
        {
            Name             = "GlowPS";
            Type             = ShaderType.Pixel;
            KeyPart          = new TechniqueKey(ps: PixelShaderFlags.Diffuse | PixelShaderFlags.DiffuseMap);
            FeatureLevel     = FeatureLevel.PS_4_0_Level_9_1;
            EnableSeparators = true;
            var inputStruct = SpriteVS.VSOut;

            inputStruct.Name = "input";

            InputStruct  = inputStruct;
            OutputStruct = Struct.PixelShaderOutput;
            Texture tDiffuse = Texture.Diffuse;
            Texture tGlow    = new Texture {
                Name = "tGlow", Type = Shaders.Type.Texture2D
            };
            Variable sLinearWrap = Sampler.MinMagMipLinearWrap;
            var      cbFrame     = CBFrame;

            Add(sLinearWrap);
            Add(tDiffuse);
            Add(tGlow);
            Add(cbFrame);

            TextureSampleNode nTexSample = new TextureSampleNode
            {
                Coordinates = new ReferenceNode {
                    Value = InputStruct[Param.SemanticVariables.Texture]
                },
                Texture   = tDiffuse,
                Sampler   = sLinearWrap,
                IsVerbose = true,
                Output    = new Vector {
                    Name = "cDiffuse", Type = Shaders.Type.Float4
                }
            };

            TextureSampleNode nGlowSample = new TextureSampleNode
            {
                Coordinates = new ReferenceNode {
                    Value = InputStruct[Param.SemanticVariables.Texture]
                },
                Texture   = tGlow,
                Sampler   = sLinearWrap,
                IsVerbose = true,
                Output    = new Vector {
                    Name = "cGlow", Type = Shaders.Type.Float4
                }
            };

            UnaryFunctionNode nSaturate = new UnaryFunctionNode
            {
                Input1 = new AdditionNode
                {
                    Input1 = nTexSample,
                    Input2 = new MultiplyNode
                    {
                        Input1 = nGlowSample,
                        Input2 = new ReferenceNode {
                            Value = cbFrame[Param.Floats.GlowStrength]
                        },
                        Parenthesize = true
                    }
                },
                Function = HlslIntrinsics.Saturate
            };

            Result = new PSOutputNode
            {
                FinalColor = nSaturate,
                Output     = OutputStruct
            };
        }
コード例 #2
0
        public WireframePS()
        {
            Name             = "WireframePS";
            Type             = ShaderType.Pixel;
            KeyPart          = new TechniqueKey(ps: PixelShaderFlags.Diffuse, sm: ShaderModel.SM_4_0_Level_9_3);
            FeatureLevel     = FeatureLevel.PS_4_0_Level_9_3;
            EnableSeparators = true;
            var inputStruct = WireframeVS.VertexPositionTextureIntensityBarycentricOut;

            inputStruct.Name = "input";
            InputStruct      = inputStruct;
            OutputStruct     = Struct.PixelShaderOutput;
            Structs.ConstantBuffer cbInstance = ConstantBuffer.CBMaterial;

            Struct material = (Struct)cbInstance[Param.Struct.Material];

            Add(cbInstance);

            IVariable position    = InputStruct[Param.SemanticVariables.ObjectPosition];
            IVariable diffuse     = material[Param.Material.Diffuse];
            IVariable specular    = material[Param.Material.Specular];
            IVariable intensity   = InputStruct[Param.SemanticVariables.Intensity];
            IVariable texture     = InputStruct[Param.SemanticVariables.Texture];
            IVariable barycentric = InputStruct[Param.SemanticVariables.Barycentric];

            //2
            UnaryFunctionNode fWidth = new UnaryFunctionNode
            {
                Input1 = new ReferenceNode()
                {
                    Value = barycentric
                },
                Function = HlslIntrinsics.Fwidth,
                Output   = new Vector()
                {
                    Type = Shaders.Type.Float3, Name = "d"
                },
                IsVerbose = true
            };

            //TrinaryFunctionNode smoothstep = new TrinaryFunctionNode()
            //{
            //    Input1 = new ConstantNode() {Value = new[] {0f, 0f, 0f}},
            //    Input2 = new MultiplyNode() {Input1 = new ScalarNode() {Value = 1.5f}, Input2 = fWidth},
            //    Input3 = new ReferenceNode() {Value = barycentric},
            //    Function = HLSLIntrinsics.Smoothstep,
            //    IsVerbose = true,
            //    Output = new Vector() {  Type = Shaders.Type.Float3, Name = "a3"}
            //};

            TrinaryFunctionNode smoothstep = new TrinaryFunctionNode()
            {
                Input1 = fWidth,
                Input2 = new MultiplyNode()
                {
                    Input1 = new ScalarNode()
                    {
                        Value = 3f
                    }, Input2 = fWidth
                },
                Input3 = new ReferenceNode()
                {
                    Value = barycentric
                },
                Function  = HlslIntrinsics.Smoothstep,
                IsVerbose = true,
                Output    = new Vector()
                {
                    Type = Shaders.Type.Float3, Name = "a3"
                }
            };

            BinaryFunctionNode minDistanceXY = new BinaryFunctionNode()
            {
                Input1 = new SwizzleNode
                {
                    Input   = smoothstep,
                    Swizzle = new[] { Swizzle.X }
                },
                Input2 = new SwizzleNode
                {
                    Input   = smoothstep,
                    Swizzle = new[] { Swizzle.Y }
                },
                Function = HlslIntrinsics.Min,
            };
            BinaryFunctionNode edgeIntensity = new BinaryFunctionNode()
            {
                Input1 = minDistanceXY,
                Input2 = new SwizzleNode
                {
                    Input   = smoothstep,
                    Swizzle = new[] { Swizzle.Z }
                },
                Function = HlslIntrinsics.Min,
                Output   = new Vector()
                {
                    Type = Shaders.Type.Float, Name = "minDistance"
                },
                IsVerbose = true
            };

            MultiplyNode objectDiffuse = new MultiplyNode()
            {
                Input1 = new ReferenceNode()
                {
                    Value = diffuse
                },
                Input2 = new CastNode
                {
                    Input = new SwizzleNode
                    {
                        Input = new ReferenceNode {
                            Value = intensity
                        },
                        Swizzle = new[] { Swizzle.X, Swizzle.Y, Swizzle.Z, Swizzle.Null }
                    },
                    Mask   = new[] { "0", "0", "0", "1" },
                    Output = new Vector()
                    {
                        Type = Shaders.Type.Float4, Name = "intensity4"
                    }
                },
                Output = new Vector()
                {
                    Type = Shaders.Type.Float4, Name = "diffuse"
                },
                IsVerbose = true
            };

            TrinaryFunctionNode finalColor = new TrinaryFunctionNode()
            {
                Input1 = new ReferenceNode()
                {
                    Value = specular
                },
                Input2   = objectDiffuse,
                Input3   = edgeIntensity,
                Function = HlslIntrinsics.Lerp
            };

            Result = new PSOutputNode
            {
                FinalColor = finalColor,
                Output     = OutputStruct
            };
        }
コード例 #3
0
        public BloomExtractPS()
        {
            Name             = "BloomExtractPS";
            Type             = ShaderType.Pixel;
            KeyPart          = new TechniqueKey(ps: PixelShaderFlags.Diffuse | PixelShaderFlags.DiffuseMap);
            FeatureLevel     = FeatureLevel.PS_4_0_Level_9_1;
            EnableSeparators = true;
            var inputStruct = SpriteVS.VSOut;

            inputStruct.Name = "input";

            InputStruct  = inputStruct;
            OutputStruct = Struct.PixelShaderOutput;
            Texture tDiffuse    = Texture.Diffuse;
            Sampler sLinearWrap = Sampler.MinMagMipLinearWrap;
            var     cbFrame     = CBFrame;

            Add(sLinearWrap);
            Add(tDiffuse);
            Add(cbFrame);

            TextureSampleNode nTexSample = new TextureSampleNode
            {
                Coordinates = new ReferenceNode {
                    Value = InputStruct[Param.SemanticVariables.Texture]
                },
                Texture   = tDiffuse,
                Sampler   = sLinearWrap,
                IsVerbose = true,
                Output    = new Vector {
                    Name = "cDiffuse", Type = Shaders.Type.Float4
                }
            };

            UnaryFunctionNode nSaturate = new UnaryFunctionNode
            {
                Input1 = new DivisionNode()
                {
                    Input1 = new SubtractionNode()
                    {
                        Input1 = nTexSample,
                        Input2 = new ReferenceNode()
                        {
                            Value = cbFrame[Param.Floats.BloomThreshold]
                        },
                        Parenthesize = true
                    },
                    Input2 = new SubtractionNode()
                    {
                        Input1 = new ScalarNode()
                        {
                            Value = 1.0f
                        },
                        Input2 = new ReferenceNode()
                        {
                            Value = cbFrame[Param.Floats.BloomThreshold]
                        },
                        Parenthesize = true
                    }
                },
                Function = HlslIntrinsics.Saturate
            };

            Result = new PSOutputNode
            {
                FinalColor = nSaturate,
                Output     = OutputStruct
            };
        }
コード例 #4
0
ファイル: PhongPS.cs プロジェクト: OkashiKami/Odyssey
        public PhongPS()
        {
            Name             = "PhongPS";
            Type             = ShaderType.Pixel;
            KeyPart          = new TechniqueKey(ps: PixelShaderFlags.Diffuse | PixelShaderFlags.Specular);
            FeatureLevel     = FeatureLevel.PS_4_0_Level_9_1;
            EnableSeparators = true;
            var input = Struct.VertexPositionNormalTextureOut;

            input.Name   = "input";
            InputStruct  = input;
            OutputStruct = Struct.PixelShaderOutput;

            Structs.ConstantBuffer cbStatic   = CBLight;
            Structs.ConstantBuffer cbFrame    = CBFrame;
            Structs.ConstantBuffer cbInstance = ConstantBuffer.CBMaterial;

            Struct pointLight = (Struct)cbStatic[Param.Struct.PointLight];
            Struct material   = (Struct)cbInstance[Param.Struct.Material];

            Add(cbStatic);
            Add(cbFrame);
            Add(cbInstance);

            CastNode vWorldPos = new CastNode
            {
                Input = new SwizzleNode {
                    Input = new ReferenceNode {
                        Value = InputStruct[Param.SemanticVariables.WorldPosition]
                    }
                    , Swizzle = new[] { Swizzle.X, Swizzle.Y, Swizzle.Z }
                },
                Output = new Vector {
                    Type = Shaders.Type.Float3, Name = "vWorldPos",
                },
                IsVerbose = true
            };

            SubtractionNode vLightDirection = new SubtractionNode
            {
                Input1 = new ReferenceNode {
                    Value = pointLight[Param.Light.Position]
                },
                Input2 = vWorldPos,
            };

            SubtractionNode vViewDirection = new SubtractionNode
            {
                Input1 = new ReferenceNode {
                    Value = cbFrame[Param.Vectors.CameraPosition]
                },
                Input2 = vWorldPos,
            };

            ReferenceNode nNormal = new ReferenceNode {
                Value = InputStruct[Param.SemanticVariables.Normal]
            };

            UnaryFunctionNode normalizeNormal = new UnaryFunctionNode
            {
                Input1   = nNormal,
                Function = HlslIntrinsics.Normalize,
                Output   = new Vector {
                    Type = nNormal.Output.Type, Name = "vNormal"
                },
                IsVerbose = true,
            };

            UnaryFunctionNode normalizeViewDirection = new UnaryFunctionNode
            {
                Input1   = vViewDirection,
                Function = HlslIntrinsics.Normalize,
                Output   = new Vector {
                    Type = vViewDirection.Output.Type, Name = "vViewDirection"
                },
                IsVerbose = true,
            };

            UnaryFunctionNode normalizeLightDirection = new UnaryFunctionNode
            {
                Input1   = vLightDirection,
                Function = HlslIntrinsics.Normalize,
                Output   = new Vector {
                    Type = vLightDirection.Output.Type, Name = "vLightDirection"
                },
                IsVerbose = true,
            };

            InvertNode vLightDirectionInv = new InvertNode
            {
                Input = normalizeLightDirection,
                //Output = new Vector { Type = Shaders.Type.Float3, Name = "vLightDirection" },
            };

            PhongLightingNode nPhongLighting = new PhongLightingNode
            {
                Light = new ReferenceNode {
                    Value = pointLight
                },
                Material = new ReferenceNode {
                    Value = material
                },
                ViewDirection  = normalizeViewDirection,
                Normal         = normalizeNormal,
                LightDirection = vLightDirectionInv,
                Specular       = true,
            };

            Result = new PSOutputNode
            {
                FinalColor = nPhongLighting,
                Output     = OutputStruct
            };
        }