gpt4 book ai didi

windows-8 - SharpDX:启用混合状态

转载 作者:行者123 更新时间:2023-12-02 22:26:51 27 4
gpt4 key购买 nike

我正在尝试让“SharpDX.Direct3D11.DeviceContext.OutputMerger.Blendstate”工作。没有这个,我就有了不错的场景(带有纹理的多边形,用于太空射手)。我在过去三年里做过 OpenGL 图形,所以我认为它可能和 OpenGL 一样简单——只需启用混合并设置正确的 Dst/Src 模式。但是如果我设置一个新的 BlendStateDescription,所有输出都是黑色的,即使“RenderTarget[x].IsBlendEnabled”设置为“false”。我搜索了一个教程或其他东西,并找到了一个 - 但它使用了效果。所以我的问题很简单——我必须在 SharpDX 中使用技术和效果吗?没有其他方法可以简单混合了吗?

这是我所做的:

mBackBuffer = Texture2D.FromSwapChain<Texture2D>(mSwapChain, 0);
mRenderView = new RenderTargetView(mDevice, mBackBuffer);
mContext.OutputMerger.SetTargets(mDepthStencilView, mRenderView);
mContext.OutputMerger.SetBlendState(new BlendState(mDevice, new BlendStateDescription()), new SharpDX.Color4(1.0f), -1);

mContext.OutputMerger.BlendState.Description.RenderTarget[0].IsBlendEnabled = true;
mContext.OutputMerger.BlendState.Description.RenderTarget[0].SourceBlend = BlendOption.SourceAlpha;
mContext.OutputMerger.BlendState.Description.RenderTarget[0].DestinationBlend = BlendOption.InverseSourceAlpha;
mContext.OutputMerger.BlendState.Description.RenderTarget[0].BlendOperation = BlendOperation.Add;
mContext.OutputMerger.BlendState.Description.RenderTarget[0].SourceAlphaBlend = BlendOption.One;
mContext.OutputMerger.BlendState.Description.RenderTarget[0].DestinationAlphaBlend = BlendOption.Zero;
mContext.OutputMerger.BlendState.Description.RenderTarget[0].AlphaBlendOperation = BlendOperation.Add;
mContext.OutputMerger.BlendState.Description.RenderTarget[0].RenderTargetWriteMask = ColorWriteMaskFlags.All;

而且,即使只是简单地做:

mContext.OutputMerger.SetBlendState(new BlendState(mDevice, new BlendStateDescription()), new SharpDX.Color4(1.0f), -1);
mContext.OutputMerger.BlendState.Description.RenderTarget[0].IsBlendEnabled = false;

输出全是黑色..也许我只需要更改像素着色器中的某些内容?

最佳答案

Direct3D11 中的所有资源都是不可变的,因此当您创建新的 Blendstate(mDevice, new BlendStateDescription()) 时,您以后无法更改描述。正常的工作流程是:

var blendDescription = new BlendDescription();blendDescription.RenderTarget[0].IsBlendEnabled = .. // set all values [...]var blendState = new BlendState(device, blendDescription);context.OutputMerger.SetBlendState(blendState, ...);

还需要将资源对象存储在某个地方,并在您完全使用完它们后将其释放(对于混合状态,大部分时间是在您的应用程序结束时),否则您会发生内存泄漏。

我建议您在不确定 API 用法时更仔细地查看一些 Direct3D11 C++ 示例。此外,我建议您阅读 Frank.D.Luna 撰写的“使用 DirectX 11 进行 3D 游戏编程简介”等书籍,这本书非常适合开始和学习 Direct3D11 API。

关于windows-8 - SharpDX:启用混合状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12856304/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com