gpt4 book ai didi

c# - 如何使用 SharpDX Toolkit 绘制透明的 3D 对象?

转载 作者:太空狗 更新时间:2023-10-29 21:53:57 28 4
gpt4 key购买 nike

我正在开发一个应用程序,该应用程序使用 SharpDX 和 SharpDX 工具包绘制简单的 3D 形状,Geometrics.Desktop 示例对入门非常有帮助。现在,我正在尝试使某些形状透明,为了简单起见,我只是想让该示例中的茶壶模型看起来透明(也许半透明会更精确)。

对于那些不熟悉 Geometrics.Desktop 示例的人,它会以 3D 形式绘制一些简单的原始几何形状。作为一个示例应用程序,它非常简单,因此它是一个非常好的便笺簿,用于试验 SharpDX“Toolkit”库的 3D 功能。

我已将此添加到 LoadContent 方法(在启动时运行一次),以准备 Direct3D 进行混合:

        var blendStateDescription = new BlendStateDescription();

blendStateDescription.AlphaToCoverageEnable = false;

blendStateDescription.RenderTarget[0].IsBlendEnabled = true;
blendStateDescription.RenderTarget[0].SourceBlend = BlendOption.SourceAlpha;
blendStateDescription.RenderTarget[0].DestinationBlend = BlendOption.InverseSourceAlpha;
blendStateDescription.RenderTarget[0].BlendOperation = BlendOperation.Add;
blendStateDescription.RenderTarget[0].SourceAlphaBlend = BlendOption.Zero;
blendStateDescription.RenderTarget[0].DestinationAlphaBlend = BlendOption.Zero;
blendStateDescription.RenderTarget[0].AlphaBlendOperation = BlendOperation.Add;
blendStateDescription.RenderTarget[0].RenderTargetWriteMask = ColorWriteMaskFlags.All;

var blendState = SharpDX.Toolkit.Graphics.BlendState.New(this.GraphicsDevice, blendStateDescription);
this.GraphicsDevice.SetBlendState(blendState);

我已经按如下方式设置了深度模板:

        var depthDisabledStencilDesc = new DepthStencilStateDescription()
{
IsDepthEnabled = false,
DepthWriteMask = DepthWriteMask.All,
DepthComparison = Comparison.Less,
IsStencilEnabled = true,
StencilReadMask = 0xFF,
StencilWriteMask = 0xFF,
// Stencil operation if pixel front-facing.
FrontFace = new DepthStencilOperationDescription()
{
FailOperation = StencilOperation.Keep,
DepthFailOperation = StencilOperation.Increment,
PassOperation = StencilOperation.Keep,
Comparison = Comparison.Always
},
// Stencil operation if pixel is back-facing.
BackFace = new DepthStencilOperationDescription()
{
FailOperation = StencilOperation.Keep,
DepthFailOperation = StencilOperation.Decrement,
PassOperation = StencilOperation.Keep,
Comparison = Comparison.Always
}
};

// Create the depth stencil state.
var depthDisabledStencilState = SharpDX.Toolkit.Graphics.DepthStencilState.New(this.GraphicsDevice, depthDisabledStencilDesc);
//turn z-buffer off
this.GraphicsDevice.SetDepthStencilState(depthDisabledStencilState, 1);

在 Draw 方法中(以帧速率运行并遍历一小部分 3D 模型,绘制每个模型),我添加了下面的代码。它将茶壶移动到视口(viewport)的中心并使其足够大以遮挡其他一些对象。茶壶是最后画的,所以其他模型已经渲染了,所以我真的希望这会在它们上面画一个半透明的茶壶:

// Draw the primitive using BasicEffect
if (i == 6)
{
basicEffect.Alpha = 0.5f;
basicEffect.World *= Matrix.Translation(-x, -y, 0);
basicEffect.World *= Matrix.Scaling(3);
}
else
{
basicEffect.Alpha = 1;
}

primitive.Draw(basicEffect);

(注释和对 Draw 的最终调用是原始示例代码的一部分。)

但是,唉,结果是在其他对象中有一个很大的不透明茶壶:

enter image description here

我需要做什么才能使茶壶透明?

我是否遗漏了什么,或者我是否错误配置了混合状态?

为了完整起见,我还尝试使用 alpha channel 为 50% 的图像对我的对象进行纹理处理,但这仍然会导致对象不透明。

在此先感谢您的帮助!

最佳答案

我将 SourceAlphaBlend 和 DestinationAlphaBlend 设置为零,它可以正常工作。除了那些状态描述对我来说看起来是正确的。此外,请确保在混合状态中禁用 AlphaToCoverage,否则您将看到其他事情表现得很奇怪。

还要确保在绘制每一帧之前设置 BlendState。

关于c# - 如何使用 SharpDX Toolkit 绘制透明的 3D 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26646715/

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