标签: managed-directx

为什么此代码抛出System.ExecutionEngineException

背景: 我使用DirectX 9.0托管库将3d点数组转换为2d屏幕坐标.为了速度,我使用UnsafeNativeMethods来完成所有的转换.

问题: 如果我的自定义行裁剪功能被使用,我的应用程序就会死掉,而不会抛出任何异常,我花了一段时间才弄清楚它是无法捕获的 System.ExecutionEngineException.由于剪切功能的最后两行,我已经缩小了它的范围.

List<Vector3> verticesAfterClipping = new List<Vector3>;
public unsafe void ClipLine(Line lineToClip)
{
    this.verticesAfterClipping.Clear();

    // Clipping algorithm happens here... (this is psuedo-code of what it does)
    foreach(Vertex in lineToClip.Vertices)
    {
        bool thisIsClipped =   // Set to whether this vertex is clipped
        bool lastWasClipped =  // Set to whether last vertex was clipped

        if(thisIsClipped == false && lastWasClipped == true)
        {
            verticesAfterClipping.Add( /* intersection on clipping plane */ );
            verticesAfterClipping.Add( /* thisVertex */ );
        } …
Run Code Online (Sandbox Code Playgroud)

c# exception managed-directx

11
推荐指数
1
解决办法
3万
查看次数

在.NET应用程序中使用音频的推荐方法?

我正在尝试使用.NET 3.5下的简单音频应用程序(最好是在VB.NET中,但很乐意使用C#).我想做的是:

  • 从(默认)Windows音频输入设备以8位每采样PCM格式连续录制音频
  • 对于捕获的每N个字节,对原始音频进行一些分析(一些RMS和/或SPL计算 - 基本上你需要一个漂亮的VU条形图东西)
  • 如果在分析后发现音频片段很有趣,请使用压缩文件格式(例如MP3)保存

我注意到的第一件事是基本.NET Framework中的音频支持几乎不存在.谷歌搜索了一些示例代码,主要是使用Managed DirectX.然而,缺乏MSDN文档,库的复古(2004)以及VS.NET 2008中的以下威胁性MDA异常使我确信这是一个死胡同:

Message: DLL 'Microsoft.DirectX.dll' is attempting managed execution inside 
OS Loader lock. Do not attempt to run managed code inside a DllMain or image
initialization function since doing so can cause the application to hang.
Run Code Online (Sandbox Code Playgroud)

...我认为松散地翻译为"甚至不尝试使用这些东西." 我在这里遗漏了什么,或者Managed DirectX真的死了吗?另一个StackOverlow问题表明XNA是Managed DirectX的替代品,但它缺乏我需要的那种低级功能.

那么,哪个API或第三方库对.NET下的音频开发实际上有用呢?使用COM互操作或P/Invoke是可以接受的,只要有一些不错的.NET示例代码可用于开始...

.net c# vb.net audio managed-directx

7
推荐指数
1
解决办法
2676
查看次数

使用SharpDX在WPF中滚动图像时生涩的动画

我试图在WPF应用程序中通过SharpDX使用DirectX11在窗口中平滑地滚动一些图像.

一点背景:

图像是信号返回,随时间变化,从文件加载并作为纹理数组加载到D3D中,图像本身呈现为一系列纹理四边形(一系列相邻的矩形,在很长的水平线上) ).设置视口,使左右边缘表示时间偏移,并且信号显示在这些时间之间的时间段内.DirectX实现非常简单; 四个顶点生成一次,一个非常小的每帧缓冲区包含一个简单的2D世界视图变换,根据当前可见范围/缩放等更新缩放和平移.据我所知,D3D实现不是我遇到的问题的一部分 - 它确实是一个非常简单的设置,并且似乎渲染非常快(应该如此),虽然我确实有一些更好的东西(根据需要从磁盘传输纹理),但我有禁用所有这些并运行非常简单(小)纹理,而我尝试解决我遇到的问题..

问题:

当可见时间范围被动画化时,图像的滚动不平滑.图像在很多时候"抖动",坦率地看起来很糟糕(当它不抖动时,它看起来很棒).

设置:

DirectX渲染到D3DImage,在幕后进行一些工作以使DX11工作 - 此代码取自https://sharpdxwpf.codeplex.com/

有多个D3DImages(最多总共4个),排列在一个网格中(我已经测试了两个,两个都包含相同时间段的信号并一起动画).

这些D3DImages由DrawingVisual(由自定义FrameworkElement托管)绘制,它们被用作ImageBrush的源.frameworkelement对象根据需要触发渲染,绘图视觉处理D3D渲染调用并绘制一个矩形以使用D3DImage画笔填充控件.

使用WPF DoubleAnimation动画时间范围值.当前显示的视觉效果通过INotifyPropertyChanged绑定到此值,并在每次更改时触发渲染(通过InvalidateVisual).

DrawingVisual呈现代码,由"位置"值(可见时间范围的开始)的更改触发:

// update scene per-frame buffer first, with world-view transform
using (DrawingContext dc = RenderOpen()
{
    _scene.Renderer.Render(_draw_args);
    _image.Invalidate();

    dc.DrawRectangle(_brush, null, new Rect(viewer.RenderSize));
}
Run Code Online (Sandbox Code Playgroud)

我尝试过的:

我已经尝试过很多东西(并经过大量搜索)来尝试确定问题是由于抖动渲染请求计时,还是问题是否进一步进入渲染过程.

  1. 挂钩到CompositionTarget.Rendering首先通过CompositionTarget.Rendering驱动位置值的更新,并将剩余的进程保持原样(即元素对此值的更改做出反应):

(不用说,这是非常"测试"代码):

Stopwatch rsw;
long last_time = 0;
void play()
{
    rsw = new Stopwatch();
    last_time = 0;
    rsw.Start();
    CompositionTarget.Rendering += rendering;
}

void rendering(object sender, EventArgs e)
{
    double update_distance = rsw.ElapsedMilliseconds - last_time;
    Position += …
Run Code Online (Sandbox Code Playgroud)

wpf directx-11 managed-directx sharpdx

5
推荐指数
1
解决办法
887
查看次数

DirectX Z-Buffer问题

有谁知道可能导致我在C#Managed DirectX应用程序中看到的奇怪工件的原因.以下是我遇到的问题的屏幕截图:

在此输入图像描述

你正在看的是一些平面下面有一个平面的地形.

  • 在左边你可以看到地形前面的平面,即使它不应该是可见的(它在下面)
  • 在中间有一个过渡阶段,你可以看到我所谓的'百叶窗'
  • 在右侧,它显示正确

这必须是Z-Buffer问题,但我无法解决它.有没有其他人遇到同样的问题?它让我疯了!

c# directx xna zbuffer managed-directx

3
推荐指数
1
解决办法
568
查看次数

System.Convert.ToDouble(decimal) 给出两个不同的答案

我有一个很奇怪的问题。我在即时窗口中运行它:

?(System.Convert.ToDouble(2458963.229671001113318401517D))

2458963.229671001
Run Code Online (Sandbox Code Playgroud)

这是我所期望的!

然后,稍后在我的应用程序中,初始化 Managed DirectX 后,我得到以下信息:

?(System.Convert.ToDouble(2458963.229671001113318401517D))

2458963.25
Run Code Online (Sandbox Code Playgroud)

在我的代码中达到那个点后,永远之后System.Convert.ToDouble()将返回截断和错误的结果。

我已经隔离了导致这种System.Convert.ToDouble()行为变化的单行:

new Device(adapterOrdinal, dType, this, flags, m_presentParams); 
Run Code Online (Sandbox Code Playgroud)

这是一个Microsoft.DirectX.Direct3D.Device对象,来自:

// Assembly: Microsoft.DirectX.Direct3D, Version=1.0.2902.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Run Code Online (Sandbox Code Playgroud)

我不确定为什么创建 aMicrosoft.DirectX.Direct3D.Device会导致System.Convert.ToDouble()行为方式发生变化。

c# precision managed-directx

3
推荐指数
1
解决办法
61
查看次数

管理DirectX

这是一个非常深刻的主题我猜,所以任何有洞察信息的网址也很乐意接受.我一直在使用本机directx工作,从未管理过.另一方面,主要是在开发不需要高级GPU渲染的其他类型的应用程序时,我通常坚持使用C#等托管代码.开始越来越喜欢C#,我一直在考虑尝试一些托管的directx.

所以我的问题是如果使用托管directx有任何显着的缺点和优点.当然,我最感兴趣的是潜在的缺点.

如果我不回答我可能不得不去.那我明天一定要回答第一件事!我期待着听到您的回复.

乔纳斯

directx managed-directx

2
推荐指数
1
解决办法
340
查看次数

DirectX9中的简单HLSL发光/模糊效果

我一直在努力寻找任何资源来帮助我使用高级着色器语言和DirectX 9托管库编写简单的辉光/模糊着色器.

我需要做的就是将一系列CustomVertex.TransformedColored顶点绘制成简单的线条,然后通过HLSL效果模糊/发光.

我已经在互联网上搜索了大约三天的一些结果,但我找不到一个非常好的教程或示例.我对HLSL有一个基本的了解,但我不太了解如何编写这个着色器(我已经阅读了3本DirectX书籍中的HLSL章节).

这是一些(删节)代码:

CustomVertex.TransformedColored[] glowVertices = new CustomVertex.TransformedColored[4];
glowVertices[0] = new CustomVertex.TransformedColored(random.Next(this.render.Width), random.Next(this.render.Height), 1, 1, Color.Cyan.ToArgb());
glowVertices[1] = new CustomVertex.TransformedColored(random.Next(this.render.Width), random.Next(this.render.Height), 1, 1, Color.Blue.ToArgb());
glowVertices[2] = new CustomVertex.TransformedColored(random.Next(this.render.Width), random.Next(this.render.Height), 1, 1, Color.Cyan.ToArgb());
glowVertices[3] = new CustomVertex.TransformedColored(random.Next(this.render.Width), random.Next(this.render.Height), 1, 1, Color.Blue.ToArgb());

this.device.BeginScene();
int passes = this.glowEffect.Begin(0);
for (int i = 0; i < passes; i++)
 {
     this.glowEffect.BeginPass(i);
     this.device.DrawUserPrimitives(PrimitiveType.LineStrip, glowVertices.Length - 1, glowVertices);
     this.glowEffect.EndPass();
 }
 this.glowEffect.End();
 this.device.EndScene();
Run Code Online (Sandbox Code Playgroud)

我想我不是在寻找HLSL特定部分的帮助,考虑到我要发布的问题和代码数量,我真的只是寻找一些帮助寻找资源!

c# hlsl glow directx-9 managed-directx

2
推荐指数
1
解决办法
5148
查看次数

使用MDX时缺少Direct3D.dll依赖项

我已经将一个完美的MDX代码片段带到了Windows 2008R2(安装了所有DX驱动程序),并且得到了以下相当奇怪的错误.知道这可能是什么意思吗?

System.BadImageFormatException: Could not load file or assembly 'Microsoft.DirectX.Direct3D.dll' or one of its dependencies.  is not a valid Win32 application. (Exception from HRESULT: 0x800700C1)
File name: 'Microsoft.DirectX.Direct3D.dll'
   at Nesteruk.MdxConsole.Console..ctor(Boolean fullScreen, Int32 charWidth, Int32 charHeight, Int32 windowWidth, Int32 windowHeight)
   at Nesteruk.MdxConsole.Console..ctor(Viewport viewport) in c:\Users\Dmitri.EUPHORIA\Projects\Open-Source\MdxConsole\MdxConsole\Console.cs:line 67
   at Nesteruk.MdxConsole.Console.NewConsole(Int32 width, Int32 height) in c:\Users\Dmitri.EUPHORIA\Projects\Open-Source\MdxConsole\MdxConsole\Console.cs:line 471
   at MdxConsoleDemo.Program.Everything() in c:\Users\Dmitri.EUPHORIA\Projects\Open-Source\MdxConsole\MdxConsoleDemo\Program.cs:line 51
   at MdxConsoleDemo.Program.Main() in c:\Users\Dmitri.EUPHORIA\Projects\Open-Source\MdxConsole\MdxConsoleDemo\Program.cs:line 30
Run Code Online (Sandbox Code Playgroud)

c# directx mdx managed-directx

1
推荐指数
1
解决办法
4868
查看次数

管理DirectX作为起点

我知道管理和非托管DirectX之间的区别.我的问题是,如果我决定以托管directX作为起点,它是否有助于我更好地理解非托管DirectX.老实说,我唯一看到的不同之处是你如何发起和访问资源.矩阵数学是矩阵,无论如何,如果我在托管中学习它,那么我应该没有管理

c++ directx visual-studio managed-directx

0
推荐指数
1
解决办法
285
查看次数