/// <summary> /// ブレンディング ステートを名指定でセットする /// </summary> /// <param name="name">ブレンディング ステート名</param> /// <param name="bs">ブレンディング ステート</param> /// <param name="c4">ブレンディング係数の配列です。RGBA の成分ごとに 1 つずつあります。</param> /// <param name="sampleMask">32 ビットのサンプル カバレッジです。</param> /// <param name="data">成功した場合、ブレンディング ステートの番号を返す。失敗した場合は-1を返す。</param> /// <returns></returns> public int CreateBlendState(string name, BlendStateDescription bs, RawColor4 c4, int sampleMask, out MCBlendStateData data) { int ret = m_no; data = null; if (m_nameDataIdx.ContainsKey(name)) { if (!m_nameDataIdx[name].TryGetTarget(out data)) { m_nameDataIdx.Remove(name); } else { return(-1); } } MCBlendStateData bsData = new MCBlendStateData(App, m_no, name); bsData.OnCreateDevice(App.DXDevice); bsData.SetBlendDesc(bs); bsData.SetBlendFactor(c4); bsData.SetSampleMask(sampleMask); m_numDataIdx.Add(m_no, bsData); bsData.CreateBlendState(); m_nameDataIdx.Add(name, new WeakReference <MCBlendStateData>(bsData)); ++m_no; return(ret); }
/// <summary> /// ブレンディング ステート名指定で取得する /// </summary> /// <param name="name">ブレンディング ステート名</param> /// <param name="data"></param> /// <returns>nameで指定した名前が存在した場合trueを返す。無い場合はfalseを返す</returns> public bool GetBlendState(string name, out MCBlendStateData data) { data = null; if (!m_nameDataIdx.ContainsKey(name)) { if (!m_nameDataIdx[name].TryGetTarget(out data)) { m_nameDataIdx.Remove(name); return(false); } } return(true); }
/// <summary> /// ブレンディング ステートを番号指定で取得する /// </summary> /// <param name="no">ブレンディング ステート番号</param> /// <param name=""></param> /// <param name=""></param> /// <returns>noで指定した番号が存在した場合trueを返す。無い場合はfalseを返す</returns> public bool GetBlendState(int no, out MCBlendStateData data) { if (m_numDataIdx.ContainsKey(no)) { data = m_numDataIdx[no]; } else { data = null; return(false); } return(true); }
/// <summary> /// デバイス作成時の処理 /// </summary> /// <param name="device"></param> /// <returns>通常、エラーが発生しなかった場合は MC_S_OK を返すようにプログラムする。</returns> internal int OnCreateDevice(Device device) { if (!m_isInitCreate) { int i; int sampleMask = -1; MCBlendStateData tmp; RawColor4 c4 = new RawColor4(); BlendStateDescription bsDesc; MCBlendStateData.D3D11_BLEND_DESC_Init(out bsDesc); // Default CreateBlendState("DEFAULT", bsDesc, c4, sampleMask, out tmp); // ALPHAブレンド bsDesc.AlphaToCoverageEnable = false; bsDesc.IndependentBlendEnable = false; for (i = 0; i < 8; i++) { bsDesc.RenderTarget[i].IsBlendEnabled = true; bsDesc.RenderTarget[i].SourceBlend = BlendOption.SourceAlpha; bsDesc.RenderTarget[i].DestinationBlend = BlendOption.InverseSourceAlpha; bsDesc.RenderTarget[i].BlendOperation = SharpDX.Direct3D11.BlendOperation.Add; bsDesc.RenderTarget[i].SourceAlphaBlend = BlendOption.One; bsDesc.RenderTarget[i].DestinationAlphaBlend = BlendOption.One; bsDesc.RenderTarget[i].AlphaBlendOperation = SharpDX.Direct3D11.BlendOperation.Add; bsDesc.RenderTarget[i].RenderTargetWriteMask = ColorWriteMaskFlags.All; } CreateBlendState("ALPHA", bsDesc, c4, sampleMask, out tmp); //SourceAlphaBlend = ONE; //DestinationAlphaBlend = ZERO; // 加算合成用 bsDesc.AlphaToCoverageEnable = false; bsDesc.IndependentBlendEnable = false; for (i = 0; i < 8; i++) { bsDesc.RenderTarget[i].IsBlendEnabled = true; bsDesc.RenderTarget[i].SourceBlend = BlendOption.SourceAlpha; bsDesc.RenderTarget[i].DestinationBlend = BlendOption.One; bsDesc.RenderTarget[i].BlendOperation = SharpDX.Direct3D11.BlendOperation.Add; bsDesc.RenderTarget[i].SourceAlphaBlend = BlendOption.One; bsDesc.RenderTarget[i].DestinationAlphaBlend = BlendOption.Zero; bsDesc.RenderTarget[i].AlphaBlendOperation = SharpDX.Direct3D11.BlendOperation.Add; bsDesc.RenderTarget[i].RenderTargetWriteMask = ColorWriteMaskFlags.All; } CreateBlendState("ADD", bsDesc, c4, sampleMask, out tmp); // 減算合成用 bsDesc.AlphaToCoverageEnable = false; bsDesc.IndependentBlendEnable = false; for (i = 0; i < 8; i++) { bsDesc.RenderTarget[i].IsBlendEnabled = true; bsDesc.RenderTarget[i].SourceBlend = BlendOption.SourceAlpha; bsDesc.RenderTarget[i].DestinationBlend = BlendOption.One; bsDesc.RenderTarget[i].BlendOperation = SharpDX.Direct3D11.BlendOperation.ReverseSubtract; bsDesc.RenderTarget[i].SourceAlphaBlend = BlendOption.One; bsDesc.RenderTarget[i].DestinationAlphaBlend = BlendOption.Zero; bsDesc.RenderTarget[i].AlphaBlendOperation = SharpDX.Direct3D11.BlendOperation.Add; bsDesc.RenderTarget[i].RenderTargetWriteMask = ColorWriteMaskFlags.All; } CreateBlendState("SUBTRACT", bsDesc, c4, sampleMask, out tmp); // 乗算合成用ブレンドステート bsDesc.AlphaToCoverageEnable = false; bsDesc.IndependentBlendEnable = false; for (i = 0; i < 8; i++) { bsDesc.RenderTarget[i].IsBlendEnabled = true; bsDesc.RenderTarget[i].SourceBlend = BlendOption.Zero; bsDesc.RenderTarget[i].DestinationBlend = BlendOption.SourceColor; bsDesc.RenderTarget[i].BlendOperation = SharpDX.Direct3D11.BlendOperation.Add; bsDesc.RenderTarget[i].SourceAlphaBlend = BlendOption.One; bsDesc.RenderTarget[i].DestinationAlphaBlend = BlendOption.Zero; bsDesc.RenderTarget[i].AlphaBlendOperation = SharpDX.Direct3D11.BlendOperation.Add; bsDesc.RenderTarget[i].RenderTargetWriteMask = ColorWriteMaskFlags.All; } CreateBlendState("MULTIPLE", bsDesc, c4, sampleMask, out tmp); m_isInitCreate = true; } else { foreach (var val in m_numDataIdx) { val.Value.OnCreateDevice(device); } } return(0); }