- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在开发一个应用程序,该应用程序使用 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 的最终调用是原始示例代码的一部分。)
但是,唉,结果是在其他对象中有一个很大的不透明茶壶:
我需要做什么才能使茶壶透明?
我是否遗漏了什么,或者我是否错误配置了混合状态?
为了完整起见,我还尝试使用 alpha channel 为 50% 的图像对我的对象进行纹理处理,但这仍然会导致对象不透明。
在此先感谢您的帮助!
最佳答案
我将 SourceAlphaBlend 和 DestinationAlphaBlend 设置为零,它可以正常工作。除了那些状态描述对我来说看起来是正确的。此外,请确保在混合状态中禁用 AlphaToCoverage,否则您将看到其他事情表现得很奇怪。
还要确保在绘制每一帧之前设置 BlendState。
关于c# - 如何使用 SharpDX Toolkit 绘制透明的 3D 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26646715/
我目前正在使用SharpDX SourceVoice在WP8应用程序中播放wav文件,该文件可以很好地播放单个文件。 但是,我找不到在没有在SourceVoice上注册事件并排队下一个文件的情况下循环
如何在构建时在 SharpDX 中编译顶点和像素着色器?您可以在“Direct3D Rendering Cookbook”中读到的方法是使用 HLSLCompiler.CompileFromFile。
我正在使用 SharpDX 2.5.0 并且我有一个游戏类,我尝试禁用固定时间步长,但是它似乎不起作用,我仍然得到 59-60 FPS。我只画了一个犹他茶壶,所以我很确定它一定能以更高的速度(比如 1
我使用 easyhook 和 SharpDX 从 DirectX 游戏中获取 fps 数据。有时它有效。但是,当我下次启动它时(可能只是几分钟后),它会抛出异常 System.IO.FileNotFo
我在弄清楚如何使用 SharpDX 设置动态 VertexBuffer 和 IndexBuffer 时遇到了很多问题。 我必须在用户按下屏幕的地方生成三角形。 我想我必须设置一个转换函数,将我的屏幕坐
我正在尝试在我的窗口大小更改后立即对后备缓冲区实现更新。所以我的对象不会被拉伸(stretch)。所以我试了一下 _renderForm.Resize += OnRenderFormOnResize;
我正在使用 SharpDX 编写 C# Direct2D 应用程序,但是我可以理解 C++ 中提供的答案/示例。 我想呈现文本并更改某些字符的宽度以使其看起来像图片: 字母B扩大到200%,字母D缩小
我正在尝试从 SharpDX.DataStream 获取像素。我每秒执行此操作 25 次,这会导致大量内存使用。我想我缺少某种清理工作。 一旦我开始调用 GetColor 方法,内存使用量就开始上升。
我正在尝试让“SharpDX.Direct3D11.DeviceContext.OutputMerger.Blendstate”工作。没有这个,我就有了不错的场景(带有纹理的多边形,用于太空射手)。我
我正在尝试让“SharpDX.Direct3D11.DeviceContext.OutputMerger.Blendstate”工作。没有这个,我就有了不错的场景(带有纹理的多边形,用于太空射手)。我
此代码每 100 毫秒运行一次。内存使用量不断增加,直到达到 1.5 GB,然后崩溃。 void takeScreenShot() { Surface s; s = CaptureSc
我们正在使用 SharpDX 开发 Windows 8 Metro 应用程序.现在我们必须在 Rectangle 中声明一组字符串.为此,我们尝试使用 SharpDX.DrawingSizeF 找出字
我是 sharpdx 的新手。 我目前的工作流程是用户可以使用网络摄像头或任何摄像头设备拍摄照片。现在我正在为用户开发新功能。用户可以在图像顶部绘制任何内容,例如 (mspaint drawing).
首先,如果这是问这个问题的错误地方,我深表歉意,我在其他地方找不到答案。 我已将 SharpDX 引用导入到我的 C# 项目中,但是,SharpDX.Windows 引用不存在。我试过从网站下载它并使
SharpDX 有一个 RenderLoop,它在渲染循环中运行给定的委托(delegate): RenderLoop.Run(m_RenderForm, () => { // Do stuf
我在互联网上四处寻找代码,试图找到允许我从常规字体(而不是 Sprite 字体)绘制文本的代码,但只找到了对我毫无帮助的片段。 有人有完整的源文件可以让我使用 SharpDX 和 D3D11/Dire
(这个问题是基于对 this 其他问题的进一步调查,但不是同一个问题,这是关于绘画问题的非常具体的问题。) 我正在尝试绘制一个重叠在目标窗口上的透明表面,问题是我不知道如何将其涂成透明,所以现在我的表
我正在将 SharpDX.WPF 项目用于 WPF 功能,与 SharpDX 附带的工具包相比,它似乎是一个易于理解的低开销库(具有相同的问题!) 首先:我使用以下方法为最新的 SharpDX 修复了
我已经使用SharpDX.XAudio2了几天,虽然事情在很大程度上是积极的(到处都是奇怪的软件怪癖),但以下问题却使我完全陷入困境: 我正在使用VS2015在C#.NET中工作。 我正在尝试同时播放
我在 Direct2D 下使用 SharpDx 开发 Metro 应用程序。我使用 deviceContext 画了一些图片。如何将图片保存为 png 文件? 最佳答案 解决方案: public
我是一名优秀的程序员,十分优秀!