背景: 我使用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) 我正在尝试使用.NET 3.5下的简单音频应用程序(最好是在VB.NET中,但很乐意使用C#).我想做的是:
我注意到的第一件事是基本.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示例代码可用于开始...
我试图在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)
我尝试过的:
我已经尝试过很多东西(并经过大量搜索)来尝试确定问题是由于抖动渲染请求计时,还是问题是否进一步进入渲染过程.
(不用说,这是非常"测试"代码):
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) 有谁知道可能导致我在C#Managed DirectX应用程序中看到的奇怪工件的原因.以下是我遇到的问题的屏幕截图:

你正在看的是一些平面下面有一个平面的地形.
这必须是Z-Buffer问题,但我无法解决它.有没有其他人遇到同样的问题?它让我疯了!
我有一个很奇怪的问题。我在即时窗口中运行它:
?(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()行为方式发生变化。
这是一个非常深刻的主题我猜,所以任何有洞察信息的网址也很乐意接受.我一直在使用本机directx工作,从未管理过.另一方面,主要是在开发不需要高级GPU渲染的其他类型的应用程序时,我通常坚持使用C#等托管代码.开始越来越喜欢C#,我一直在考虑尝试一些托管的directx.
所以我的问题是如果使用托管directx有任何显着的缺点和优点.当然,我最感兴趣的是潜在的缺点.
如果我不回答我可能不得不去.那我明天一定要回答第一件事!我期待着听到您的回复.
乔纳斯
我一直在努力寻找任何资源来帮助我使用高级着色器语言和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特定部分的帮助,考虑到我要发布的问题和代码数量,我真的只是寻找一些帮助寻找资源!
我已经将一个完美的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) 我知道管理和非托管DirectX之间的区别.我的问题是,如果我决定以托管directX作为起点,它是否有助于我更好地理解非托管DirectX.老实说,我唯一看到的不同之处是你如何发起和访问资源.矩阵数学是矩阵,无论如何,如果我在托管中学习它,那么我应该没有管理