Beispiel #1
0
        public void SetParameter(string varName, object varValue)
        {
            EffectVariable ev = DXEffect.GetVariableByName(varName);

            if (ev.IsValid)
            {
                if (varValue is bool)
                {
                    ev.AsScalar().Set((bool)varValue);
                }
                else if (varValue is int)
                {
                    ev.AsScalar().Set((int)varValue);
                }
                else if (varValue is uint)
                {
                    ev.AsScalar().Set((uint)varValue);
                }
                else if (varValue is float)
                {
                    ev.AsScalar().Set((float)varValue);
                }
                else if (varValue is double)
                {
                    ev.AsScalar().Set((float)(double)varValue);
                }
                else if (varValue is Vector2)
                {
                    ev.AsVector().Set((Vector2)varValue);
                }
                else if (varValue is Vector3)
                {
                    ev.AsVector().Set((Vector3)varValue);
                }
                else if (varValue is Vector4[])
                {
                    ev.AsVector().Set((Vector4[])varValue);
                }
                else if (varValue is Vector4)
                {
                    ev.AsVector().Set((Vector4)varValue);
                }
                else if (varValue is Matrix)
                {
                    ev.AsMatrix().SetMatrix((Matrix)varValue);
                }
                //else if (varValue is DXTexture2DClass) ev.AsShaderResource().SetResource((varValue as DXTexture2DClass).TextureResourceView);
                else if (varValue is ShaderResourceView)
                {
                    ev.AsShaderResource().SetResource(varValue as ShaderResourceView);
                }
                else if (varValue == null)
                {
                    ev.AsShaderResource().SetResource(null);
                }
                else /* ... */ } {
        }
    }
Beispiel #2
0
        public void Render(Device device, ShaderResourceView textureView)
        {
            if (_isDisposed)
            {
                throw new ObjectDisposedException(GetType().Name);
            }

            if (device == null)
            {
                return;
            }

            if (!object.ReferenceEquals(device, _cachedDevice))
            {
                throw new InvalidOperationException(string.Format("Argument {0} and member {1} do not match!", nameof(device), nameof(_cachedDevice)));
            }

            device.InputAssembler.InputLayout       = _vertexLayout;
            device.InputAssembler.PrimitiveTopology = SharpDX.Direct3D.PrimitiveTopology.TriangleList;
            device.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_vertices, 24, 0));


            EffectTechnique technique                   = null;
            EffectPass      pass                        = null;
            EffectVariable  shaderResourceObj           = null;
            EffectShaderResourceVariable shaderResource = null;

            try
            {
                technique         = _effect.GetTechniqueByIndex(0);
                pass              = technique.GetPassByIndex(0);
                shaderResourceObj = _effect.GetVariableByName("ShaderTexture");
                shaderResource    = shaderResourceObj.AsShaderResource();
                shaderResource.SetResource(textureView);

                for (int i = 0; i < technique.Description.PassCount; ++i)
                {
                    pass.Apply();
                    device.Draw(6, 0);
                }
            }
            finally
            {
                Disposer.RemoveAndDispose(ref shaderResource);
                Disposer.RemoveAndDispose(ref shaderResourceObj);
                Disposer.RemoveAndDispose(ref pass);
                Disposer.RemoveAndDispose(ref technique);
            }
        }
Beispiel #3
0
        private void BindTextureFor1DColorProviders()
        {
            _descriptionTextureFor1DColorProvider = new Texture1DDescription()
            {
                ArraySize      = 1,
                BindFlags      = BindFlags.ShaderResource,
                CpuAccessFlags = CpuAccessFlags.Write,
                Format         = Format.R32G32B32A32_Float,
                MipLevels      = 1,
                OptionFlags    = ResourceOptionFlags.None,
                Usage          = ResourceUsage.Dynamic,
                Width          = 1024
            };

            _textureFor1DColorProvider = new Texture1D(_cachedDevice, _descriptionTextureFor1DColorProvider);

            _textureFor1DColorProviderView = new ShaderResourceView(_cachedDevice, _textureFor1DColorProvider);

            _textureFor1DColorProviderVariable = _lightingEffect.GetVariableByName("ColorGradient1DTexture");
            _textureFor1DColorProviderShaderResourceVariable = _textureFor1DColorProviderVariable.AsShaderResource();
            _textureFor1DColorProviderShaderResourceVariable.SetResource(_textureFor1DColorProviderView);
        }
 public override void  数を更新する(EffectVariable 数, 数更新時引数 引数)
 {
     数.AsShaderResource().SetResource(_shaderResource);
 }
Beispiel #5
0
 public override void  数を更新する(EffectVariable 数, 数更新時引数 引数)
 {
     // シェーダーリソースビューを登録。
     数.AsShaderResource().SetResource(_resourceView);
 }
Beispiel #6
0
        public static void CompareVariable(EffectVariable reflectionVariable, Fx10.IEffectVariable variable)
        {
            EffectTypeDescription typeDesc = reflectionVariable.TypeInfo.Description;
            var type = variable.Type;

            Assert.AreEqual(typeDesc.TypeName, type.TypeName);
            Assert.AreEqual(typeDesc.Class, (ShaderVariableClass)type.VariableClass);
            Assert.AreEqual(typeDesc.Type, (ShaderVariableType)type.VariableType);
            Assert.AreEqual(typeDesc.Elements, type.ElementCount);
            Assert.AreEqual(typeDesc.Members, type.MemberCount);
            Assert.AreEqual(typeDesc.Rows, type.Rows);
            Assert.AreEqual(typeDesc.Columns, type.Columns);
            Assert.AreEqual(typeDesc.PackedSize, type.PackedSize);
            Assert.AreEqual(typeDesc.UnpackedSize, type.UnpackedSize);
            Assert.AreEqual(typeDesc.Stride, type.Stride);
            EffectVariableDescription variableDesc = reflectionVariable.Description;

            Assert.AreEqual(variableDesc.Name, variable.Name);
            Assert.AreEqual(variableDesc.Semantic ?? "", variable.Semantic);
            Assert.AreEqual(variableDesc.Flags, (EffectVariableFlags)variable.Flags);
            Assert.AreEqual(variableDesc.AnnotationCount, variable.AnnotationCount);
            //TODO: SharpDX seems defines BufferOffset relative to buffer, but variable is just relative to struct
            //Assert.AreEqual(variableDesc.BufferOffset, variable.BufferOffset == uint.MaxValue ? 0 : variable.BufferOffset);
            Assert.AreEqual(variableDesc.ExplicitBindPoint, variable.ExplicitBindPoint);
            var annotations = GetAnnotations(reflectionVariable);

            if (typeDesc.Class == ShaderVariableClass.Struct)
            {
                //TODO: SharpDx has GetMemberValues on the EffectType.
                for (int i = 0; i < typeDesc.Members; i++)
                {
                    var reflectionMember = reflectionVariable.GetMemberByIndex(i);
                    var member           = variable.Type.Members[i];
                    CompareVariable(reflectionMember, member);
                }
            }
            for (int i = 0; i < annotations.Count; i++)
            {
                var reflectionAnnotation = annotations[i];
                var annotation           = variable.Annotations[i];
                CompareVariable(reflectionAnnotation, annotation);
            }
            if (typeDesc.Type == ShaderVariableType.Blend)
            {
                var specDesc = reflectionVariable
                               .AsBlend()
                               .GetBlendState()
                               .Description;
            }
            if (typeDesc.Type == ShaderVariableType.ConstantBuffer)
            {
                var specDesc = reflectionVariable
                               .AsConstantBuffer()
                               .GetConstantBuffer()
                               .Description;
            }
            if (typeDesc.Type == ShaderVariableType.DepthStencil)
            {
                var specDesc = reflectionVariable
                               .AsDepthStencil()
                               .GetDepthStencilState()
                               .Description;
            }
            if (typeDesc.Type == ShaderVariableType.DepthStencilView)
            {
                var specDesc = reflectionVariable
                               .AsDepthStencilView()
                               .GetDepthStencil()
                               .Description;
            }
            if (typeDesc.Type == ShaderVariableType.Rasterizer)
            {
                var specDesc = reflectionVariable
                               .AsRasterizer()
                               .GetRasterizerState()
                               .Description;
            }
            if (typeDesc.Type == ShaderVariableType.Rasterizer)
            {
                var specDesc = reflectionVariable
                               .AsRasterizer()
                               .GetRasterizerState()
                               .Description;
            }
            if (typeDesc.Type == ShaderVariableType.RenderTargetView)
            {
                var specDesc = reflectionVariable
                               .AsRenderTargetView()
                               .GetRenderTarget()
                               .Description;
            }
            if (typeDesc.Type == ShaderVariableType.Sampler)
            {
                var specDesc = reflectionVariable
                               .AsSampler()
                               .GetSampler()
                               .Description;
                var stateAnnotations = (variable as Fx10.EffectObjectVariable).Assignments;
            }
            if (typeDesc.Type == ShaderVariableType.PixelShader ||
                typeDesc.Type == ShaderVariableType.VertexShader ||
                typeDesc.Type == ShaderVariableType.GeometryShader)
            {
                var shader = reflectionVariable
                             .AsShader();
            }
            if (false)
            {
                var shader = reflectionVariable
                             .AsShaderResource();
            }
        }
Beispiel #7
0
 public override void  数を更新する(EffectVariable subscribeTo, 数更新時引数 variable)
 {
     // ターゲットオブジェクトに依存しない
     subscribeTo.AsShaderResource().SetResource(variable.材質.テクスチャ);
 }
Beispiel #8
0
 public override void  数を更新する(EffectVariable 数, 数更新時引数 引数)
 {
     // ターゲットオブジェクトに依存しない
     数.AsShaderResource().SetResource(引数.材質.トゥーンテクスチャ);
 }
        public override void  数を更新する(EffectVariable 数, 数更新時引数 引数)
        {
            // スワップチェーンの強参照を取得する。

            if (!(引数.SwapChain.TryGetTarget(out var swapChain)))
            {
                return;     // 失敗したら無視
            }
            // スワップチェーンのバックバッファを取得する。

            using (var backBuffer = swapChain.GetBackBuffer <Texture2D>(0))
            {
                #region " 未作成またはバックバッファといろいろ異なっている場合、Texture2D と ShaderResourceView を作成する。"
                //----------------
                if (null == _Texture2D ||
                    null == _ShaderResourceView ||
                    backBuffer.Description.Width != _Texture2D.Description.Width ||
                    backBuffer.Description.Height != _Texture2D.Description.Height ||
                    backBuffer.Description.Format != _Texture2D.Description.Format)
                {
                    数.AsShaderResource().SetResource(null);
                    _ShaderResourceView?.Dispose();
                    _Texture2D?.Dispose();

                    // バックバッファと同じサイズ・同じフォーマットのテクスチャを作成する。

                    _Texture2D = new Texture2D(
                        RenderContext.Instance.DeviceManager.D3DDevice,
                        new Texture2DDescription {
                        ArraySize         = 1,
                        BindFlags         = BindFlags.ShaderResource,
                        CpuAccessFlags    = CpuAccessFlags.None,    // CPUからアクセス不要
                        Format            = backBuffer.Description.Format,
                        Width             = backBuffer.Description.Width,
                        Height            = backBuffer.Description.Height,
                        MipLevels         = 1,
                        OptionFlags       = ResourceOptionFlags.None,
                        SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0),
                        Usage             = ResourceUsage.Default,
                    });

                    // テクスチャのシェーダーリソースビューを作成する。

                    _ShaderResourceView = new ShaderResourceView(
                        RenderContext.Instance.DeviceManager.D3DDevice,
                        _Texture2D,
                        new ShaderResourceViewDescription {
                        Format    = _Texture2D.Description.Format,
                        Dimension = SharpDX.Direct3D.ShaderResourceViewDimension.Texture2D,
                        Texture2D = new ShaderResourceViewDescription.Texture2DResource {
                            MipLevels       = 1,
                            MostDetailedMip = 0,
                        },
                    });


                    // シェーダーリソースビューを変数に設定する。

                    数.AsShaderResource().SetResource(_ShaderResourceView);
                }
                //----------------
                #endregion


                // 現在のバックバッファの内容を Texture2D に複写する。

                RenderContext.Instance.DeviceManager.D3DDeviceContext.CopyResource(backBuffer, _Texture2D);
            }
        }
        public override void  数を更新する(EffectVariable 数, 数更新時引数 引数)
        {
            // 深度ステンシルビューを取得する。
            RenderContext.Instance.DeviceManager.D3DDeviceContext.OutputMerger.GetRenderTargets(out var depthStencilView);

            using (depthStencilView)
                using (var depthStencilBuffer = depthStencilView.ResourceAs <Texture2D>())
                {
                    #region " 未作成または深度ステンシルバッファといろいろ異なっている場合、Texture2D と ShaderResourceView を作成する。"
                    //----------------
                    if (null == _Texture2D ||
                        null == _ShaderResourceView ||
                        depthStencilBuffer.Description.Width != _Texture2D.Description.Width ||
                        depthStencilBuffer.Description.Height != _Texture2D.Description.Height ||
                        depthStencilBuffer.Description.Format != _Texture2D.Description.Format)
                    {
                        数.AsShaderResource().SetResource(null);
                        _ShaderResourceView?.Dispose();
                        _Texture2D?.Dispose();

                        // 深度ステンシルバッファと同じサイズ・同じフォーマットのテクスチャを作成する。

                        _Texture2D = new Texture2D(
                            RenderContext.Instance.DeviceManager.D3DDevice,
                            new Texture2DDescription {
                            ArraySize         = 1,
                            BindFlags         = BindFlags.DepthStencil | BindFlags.ShaderResource,
                            CpuAccessFlags    = CpuAccessFlags.None, // CPUからアクセス不要
                            Format            = SharpDX.DXGI.Format.R32_Typeless,
                            Width             = depthStencilBuffer.Description.Width,
                            Height            = depthStencilBuffer.Description.Height,
                            MipLevels         = 1,
                            OptionFlags       = ResourceOptionFlags.None,
                            SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0),
                            Usage             = ResourceUsage.Default,
                        });

                        // テクスチャのシェーダーリソースビューを作成する。

                        _ShaderResourceView = new ShaderResourceView(
                            RenderContext.Instance.DeviceManager.D3DDevice,
                            _Texture2D,
                            new ShaderResourceViewDescription {
                            Format    = SharpDX.DXGI.Format.R32_Float,
                            Dimension = SharpDX.Direct3D.ShaderResourceViewDimension.Texture2D,
                            Texture2D = new ShaderResourceViewDescription.Texture2DResource {
                                MipLevels       = 1,
                                MostDetailedMip = 0,
                            },
                        });


                        // シェーダーリソースビューを変数に設定する。

                        数.AsShaderResource().SetResource(_ShaderResourceView);
                    }
                    //----------------
                    #endregion


                    // 深度ステンシルバッファの内容を Texture2D に複写する。

                    RenderContext.Instance.DeviceManager.D3DDeviceContext.CopyResource(depthStencilBuffer, _Texture2D);
                }
        }