Пример #1
0
 /// <summary>
 /// <p>Creates an effect from a binary effect or file.</p>
 /// </summary>
 /// <param name="dataRef"><dd>  <p>Blob of compiled effect data.</p> </dd></param>
 /// <param name="dataLength"><dd>  <p>Length of the data blob.</p> </dd></param>
 /// <param name="fXFlags"><dd>  <p>No effect flags exist. Set to zero.</p> </dd></param>
 /// <param name="deviceRef"><dd>  <p>Pointer to the <strong><see cref="SharpDX.Direct3D11.Device"/></strong> on which to create Effect resources.</p> </dd></param>
 /// <param name="effectOut"><dd>  <p>Address of the newly created <strong><see cref="SharpDX.Direct3D11.Effect"/></strong> interface.</p> </dd></param>
 /// <param name="srcName">No documentation.</param>
 /// <returns><p>The return value is one of the values listed in Direct3D 11 Return Codes.</p></returns>
 /// <remarks>
 /// <p><strong>Note</strong>??You must use Effects 11 source to build  your effects-type application. For more info about using Effects 11 source, see Differences Between Effects 10 and Effects 11.</p>
 /// </remarks>
 /// <include file='.\..\Documentation\CodeComments.xml' path="/comments/comment[@id='D3DX11CreateEffectFromMemory']/*"/>
 /// <msdn-id>ff476273</msdn-id>
 /// <unmanaged>HRESULT D3DX11CreateEffectFromMemory([In, Buffer] const void* pData,[In] SIZE_T DataLength,[In] unsigned int FXFlags,[In] ID3D11Device* pDevice,[Out, Fast] ID3DX11Effect** ppEffect,[In, Optional] const char* srcName)</unmanaged>
 /// <unmanaged-short>D3DX11CreateEffectFromMemory</unmanaged-short>
 public static void CreateEffectFromMemory(System.IntPtr dataRef,
                                           SharpDX.PointerSize dataLength,
                                           int fXFlags,
                                           SharpDX.Direct3D11.Device deviceRef,
                                           SharpDX.Direct3D11.Effect effectOut,
                                           string srcName)
 {
     unsafe
     {
         IntPtr         effectOut_ = IntPtr.Zero;
         IntPtr         srcName_   = Utilities.StringToHGlobalAnsi(srcName);
         SharpDX.Result __result__;
         if (IntPtr.Size == 4)
         {
             __result__ = D3DX11CreateEffectFromMemory_11_1_x86(dataRef, dataLength, fXFlags, deviceRef.NativePointer, out effectOut_, srcName_);
         }
         else
         {
             __result__ = D3DX11CreateEffectFromMemory_11_1_x64(dataRef, dataLength, fXFlags, deviceRef.NativePointer, out effectOut_, srcName_);
         }
         ((SharpDX.Direct3D11.Effect)effectOut).NativePointer = effectOut_;
         Marshal.FreeHGlobal(srcName_);
         __result__.CheckError();
     }
 }
Пример #2
0
 protected override void DisposeResource()
 {
     if (effect != null)
     {
         effect.Dispose();
         effect = null;
     }
 }
Пример #3
0
        public Effect(PPDDevice device, byte[] bytes) : base(device)
        {
            textureSetHandles = new HashSet <EffectHandleBase>();
            effect            = new SharpDX.Direct3D11.Effect((SharpDX.Direct3D11.Device)((PPDFramework.DX11.PPDDevice)device).Device, bytes);
            var tech = effect.GetTechniqueByIndex(0);

            vertexDeclaration = Vertex.VertexDeclarationFactoryManager.Factory.Create(device, this);
        }
Пример #4
0
        public void 初期化する(object model, SharpDX.Direct3D11.Effect d3dEffect)
        {
            var d3dDevice = RenderContext.Instance.DeviceManager.D3DDevice;
            var モデル       = (PMXモデル)model;


            // 入力頂点リストを作成する。

            var 頂点リスト = new List <CS_INPUT>();

            for (int i = 0; i < モデル.頂点リスト.Count; i++)
            {
                this._頂点データを頂点レイアウトリストに追加する(モデル.頂点リスト[i], 頂点リスト);
            }

            this.入力頂点リスト = 頂点リスト.ToArray();


            // インデックスバッファを作成する。内容は モデルの面リスト で初期化。

            var インデックスリスト = new List <uint>();

            foreach (面 surface in モデル.面リスト)
            {
                インデックスリスト.Add(surface.頂点1);
                インデックスリスト.Add(surface.頂点2);
                インデックスリスト.Add(surface.頂点3);
            }

            this.D3Dインデックスバッファ = CGHelper.D3Dバッファを作成する(インデックスリスト, d3dDevice, SharpDX.Direct3D11.BindFlags.IndexBuffer);


            // 頂点データストリームを作成する。内容は空。

            this._頂点データストリーム = new DataStream(this.入力頂点リスト.Length * CS_INPUT.SizeInBytes, canRead: true, canWrite: true);


            // D3Dスキニングバッファを作成する。内容は空。

            this.D3Dスキニングバッファ = new SharpDX.Direct3D11.Buffer(
                d3dDevice,
                new SharpDX.Direct3D11.BufferDescription {
                SizeInBytes         = CS_INPUT.SizeInBytes * this.入力頂点リスト.Length,
                Usage               = SharpDX.Direct3D11.ResourceUsage.Default,
                BindFlags           = SharpDX.Direct3D11.BindFlags.ShaderResource | SharpDX.Direct3D11.BindFlags.UnorderedAccess,
                CpuAccessFlags      = SharpDX.Direct3D11.CpuAccessFlags.None,
                OptionFlags         = SharpDX.Direct3D11.ResourceOptionFlags.BufferStructured, // 構造化バッファ
                StructureByteStride = CS_INPUT.SizeInBytes,
            });

            D3Dスキニングバッファをリセットする = true;    // 今はストリームもスキニングバッファも空なので、描画前に設定するようフラグを立てておく。


            // 頂点バッファを作成する。

            this.D3D頂点バッファ = new SharpDX.Direct3D11.Buffer(
                d3dDevice,
                new SharpDX.Direct3D11.BufferDescription {
                SizeInBytes    = VS_INPUT.SizeInBytes * this.入力頂点リスト.Length,
                Usage          = SharpDX.Direct3D11.ResourceUsage.Default,
                BindFlags      = SharpDX.Direct3D11.BindFlags.VertexBuffer | SharpDX.Direct3D11.BindFlags.ShaderResource | SharpDX.Direct3D11.BindFlags.UnorderedAccess, // 非順序アクセス
                CpuAccessFlags = SharpDX.Direct3D11.CpuAccessFlags.None,
                OptionFlags    = SharpDX.Direct3D11.ResourceOptionFlags.BufferAllowRawViews,                                                                             // 生ビューバッファ
            });

            // 頂点シェーダー用の入力レイアウトを作成する。

            this.D3D頂点レイアウト = new SharpDX.Direct3D11.InputLayout(
                d3dDevice,
                d3dEffect.GetTechniqueByName("DefaultObject").GetPassByIndex(0).Description.Signature,
                VS_INPUT.VertexElements);


            // コンピュートシェーダー入力用のシェーダーリソースビューを作成する。

            this.D3DスキニングバッファSRView = new SharpDX.Direct3D11.ShaderResourceView(
                d3dDevice,
                this.D3Dスキニングバッファ,  // 構造化バッファ
                new SharpDX.Direct3D11.ShaderResourceViewDescription {
                Format    = SharpDX.DXGI.Format.Unknown,
                Dimension = SharpDX.Direct3D.ShaderResourceViewDimension.ExtendedBuffer,
                BufferEx  = new SharpDX.Direct3D11.ShaderResourceViewDescription.ExtendedBufferResource {
                    FirstElement = 0,
                    ElementCount = this.入力頂点リスト.Length,
                },
            });


            // コンピュートシェーダー出力用の非順序アクセスビューを作成する。

            this.D3D頂点バッファビューUAView = new SharpDX.Direct3D11.UnorderedAccessView(
                d3dDevice,
                this.D3D頂点バッファ,
                new SharpDX.Direct3D11.UnorderedAccessViewDescription {
                Format    = SharpDX.DXGI.Format.R32_Typeless,
                Dimension = SharpDX.Direct3D11.UnorderedAccessViewDimension.Buffer,
                Buffer    = new SharpDX.Direct3D11.UnorderedAccessViewDescription.BufferResource {
                    FirstElement = 0,
                    ElementCount = VS_INPUT.SizeInBytes * 入力頂点リスト.Length / 4,
                    Flags        = SharpDX.Direct3D11.UnorderedAccessViewBufferFlags.Raw,
                },
            });

            // 定数バッファを作成する。

            this._D3DBoneTransデータストリーム = new DataStream(this.入力頂点リスト.Length * _D3DBoneTrans.SizeInBytes, canRead: true, canWrite: true);

            this._D3DBoneTrans定数バッファ = new SharpDX.Direct3D11.Buffer(
                d3dDevice,
                new SharpDX.Direct3D11.BufferDescription {
                SizeInBytes = 入力頂点リスト.Length * _D3DBoneTrans.SizeInBytes,
                BindFlags   = SharpDX.Direct3D11.BindFlags.ConstantBuffer,
            });

            this._D3DBoneLocalPositionデータストリーム = new DataStream(this.入力頂点リスト.Length * _D3DBoneLocalPosition.SizeInBytes, canRead: true, canWrite: true);

            this._D3DBoneLocalPosition定数バッファ = new SharpDX.Direct3D11.Buffer(
                d3dDevice,
                new SharpDX.Direct3D11.BufferDescription {
                SizeInBytes = 入力頂点リスト.Length * _D3DBoneLocalPosition.SizeInBytes,
                BindFlags   = SharpDX.Direct3D11.BindFlags.ConstantBuffer,
            });

            this._D3DBoneQuaternionデータストリーム = new DataStream(this.入力頂点リスト.Length * _D3DBoneQuaternion.SizeInBytes, canRead: true, canWrite: true);

            this._D3DBoneQuaternion定数バッファ = new SharpDX.Direct3D11.Buffer(
                d3dDevice,
                new SharpDX.Direct3D11.BufferDescription {
                SizeInBytes = 入力頂点リスト.Length * _D3DBoneQuaternion.SizeInBytes,
                BindFlags   = SharpDX.Direct3D11.BindFlags.ConstantBuffer,
            });
        }