谁能告诉我如何在C#中挂钩/覆盖DirectX游戏?
我已经尝试使用全屏C#窗口来重叠游戏,但它不会.经过一番研究后,我发现我需要挂钩游戏,然后显示C#窗口.
任何人都可以解释我会怎么做?我可以在DirectX游戏上显示C#表单吗?
我已经安装了.net 4.0以及XNA 4.0.前段时间我使用Microsoft.DirectX播放一些音乐,现在当我尝试重做工作时,我找不到参考.平台上的新更改是否修改或移动了引用中的某些内容?
此致,Alexandru Badescu
在DirectX移动照明示例中,以下列方式生成圆柱体:
for( DWORD i=0; i<50; i++ )
{
FLOAT theta = (2*D3DMX_PI*i)/(50-1);
pVertices[2*i+0].position = D3DMXVECTOR3( (float)sin(theta),-1.0f, (float)cos(theta) );
pVertices[2*i+0].normal = D3DMXVECTOR3( (float)sin(theta), 0.0f, (float)cos(theta) );
pVertices[2*i+1].position = D3DMXVECTOR3( (float)sin(theta), 1.0f, (float)cos(theta) );
pVertices[2*i+1].normal = D3DMXVECTOR3( (float)sin(theta), 0.0f, (float)cos(theta) );
}
Run Code Online (Sandbox Code Playgroud)
是否有类似的方法在DirectX Mobile中生成球体的顶点(如三角形条带或其他方式)?(AFAIK没有D3DMXCreateSphere方法)
最后的解决方案.感谢四分之一的帮助.
void CreateSphere()
{
const int iFactor = 20;
int iPos = 0;
arr_Vertices = new CUSTOMVERTEX[ui_VCount];
ui_ShapeCount = iFactor *iFactor * 2; // use when rendering
float arrV[iFactor* iFactor][3];
for (DWORD j= 0; j < iFactor; j …Run Code Online (Sandbox Code Playgroud) 我听说OpenGL和DirectX调用实际上是由视频驱动程序转换为特定于卡的调用.我也知道,有时一个新的视频驱动程序可以在没有开发人员做任何事情的情况下将视频游戏的性能提高50%.如果我想对视频卡进行细粒度控制,这是否可以达到DX/OpenGL以下的水平?Nvidia/AMD是否会发布特定于供应商的API?
在MSDN文档解释说,在DirectX 11有多种方法以编程方式填充的DirectX 11质地:
(1)使用默认使用纹理创建纹理,并使用内存中的数据对其进行初始化
(2)使用动态用法创建纹理,使用DeviceContext Map获取指向纹理内存的指针,写入它,然后使用Unmap指示你已完成(此时我猜它被复制到gpu)
(3)使用分段用法创建纹理,并按照与动态纹理相同的步骤进行,但是通过调用ID3D11DeviceContext.CopyResource来使用此分段纹理依次填充(非不可变)默认或动态纹理.
然而,文档并没有解释每种方法的优缺点,而且我对directx还是一个新手,所以对我来说一点也不清楚.
在directx 11中以编程方式创建纹理的每种方法的优缺点是什么?
旁注:我已经读过,在分段纹理的上下文中,从gpu 读回不是缓冲的,所以你必须做自己的双缓冲.但我不知道这是否准确,是否适用于使用分段纹理(甚至真正意味着什么)写作.
第二方面注意: Map方法文档说它获取了一个指向子资源中数据的指针,并拒绝GPU访问该子资源.当GPU想要访问其底层数据已被Map调用的纹理时,它会做什么?失速?(我问,因为这听起来像是我询问的利弊的一部分)
是否可以在Nvidia 3D Vision硬件上运行Java3D应用程序?
我有一个可以在立体3D中运行的现有Java3D应用程序.在过去,我总是使用OpenGL渲染器和四缓冲立体声在Quadro卡上运行应用程序.
我现在可以使用nVidia 3D Vision系统(带有GeForce GTX 460M)的笔记本电脑.从文档中可以看出,如果我使用DirectX绑定并让nVidia驱动程序处理立体声,应该可以在立体声中运行我的应用程序,但是,似乎并非如此.
如果我使用j3d.rend = d3d运行Java3D应用程序,则nVidia 3D Vision API似乎不会将其识别为DirectX应用程序.
如何让nVidia 3D Vision驱动程序检测Java3D应用程序并以立体3D渲染?
我在HLSL中实现了这个问题中描述的螺旋GLSL着色器,但结果并不相同.我认为这是因为mod我已经fmod在HLSL中翻译了GLSL 中的函数.我怀疑只有在fmod函数输入中有负数时才会出现此问题.
我已经尝试mod通过调用我已经制作的函数替换调用来执行GLSL文档中描述的函数并且它可以工作:
mod返回xmodulo 的值y.计算方法如下x - y * floor(x/y).
我使用的工作代码fmod是:
float mod(float x, float y)
{
return x - y * floor(x/y)
}
Run Code Online (Sandbox Code Playgroud)
与GLSL相比mod,MSDN表示 HLSL fmod功能可以做到这一点:
计算浮点余数,使得
x = i * y + f其中i,整数f具有与其相同的符号x,并且绝对值f小于绝对值y.
我使用了HLSL到GLSL转换器,并将该fmod函数翻译为mod.但是,我不知道我是否可以假设mod转换为fmod …
我已经为C#天搜索和测试不同类型的渲染库了好几周了.到目前为止,我还没有找到一个适用于多窗口渲染设置的单个库.要求是能够在12+监视器设置(财务图表)上运行程序,而无需在快速计算机上进行延迟.每个窗口需要每秒更新多次.虽然执行此CPU需要执行大量密集和时间关键任务,因此必须将一些负担转移到GPU.这就是硬件渲染的步骤,换句话说就是DirectX或OpenGL.
我已经尝试过使用Windows窗体的GDI +,并认为它对我的需求来说太慢了.我已经通过OpenTK(在Windows窗体控件上)尝试了OpenGL,它看起来相当快(我还有一些测试可以在它上面运行)但是很难正常工作(很难找到/编写好的文本渲染库).最近我通过SharpDX尝试了DirectX9,DirectX10和Direct2D以及Windows窗体.我为每个窗口尝试了一个单独的设备,并且单个设备/多个交换链接近.所有这些都导致多个窗口的性能非常差.例如,如果我将目标FPS设置为20并在不同的监视器上打开4个全屏窗口,则整个操作系统开始严重滞后.渲染只是将屏幕清除为黑色,不渲染基元.此测试的CPU使用率约为0%,GPU使用率约为10%,我不知道 了解这里的瓶颈是什么?我的开发计算机非常快,i7 2700k,AMD HD7900,16GB内存因此测试肯定应该在这个上运行.
相比之下,我在C++/Win32 API一个设备/多个交换链上做了一些DirectX9测试,我可以打开遍布4个监视器工作区的100个窗口(上面有3D茶壶旋转),并且仍然拥有完全负责的操作系统(fps是当然在渲染窗口上掉落到5左右,这是我期望运行100个同时渲染的东西).
有谁知道在C#上进行多窗口渲染的任何好方法,还是我被迫用C++重新编写我的程序来获得性能(主要的痛苦)?我想在进入C++路线之前,我正在给OpenGL另一个镜头.我会在这里报告任何发现.
试验方法参考:
对于C#DirectX单设备多交换链测试,我使用了这个优秀答案的方法: 每台显示器显示不同的图像directX 10
Direct3D10版本:
我创建了d3d10device和DXGIFactory,如下所示:
D3DDev = new SharpDX.Direct3D10.Device(SharpDX.Direct3D10.DriverType.Hardware,
SharpDX.Direct3D10.DeviceCreationFlags.None);
DXGIFac = new SharpDX.DXGI.Factory();
Run Code Online (Sandbox Code Playgroud)
然后像这样初始化渲染窗口:
var scd = new SwapChainDescription();
scd.BufferCount = 1;
scd.ModeDescription = new ModeDescription(control.Width, control.Height,
new Rational(60, 1), Format.R8G8B8A8_UNorm);
scd.IsWindowed = true;
scd.OutputHandle = control.Handle;
scd.SampleDescription = new SampleDescription(1, 0);
scd.SwapEffect = SwapEffect.Discard;
scd.Usage = Usage.RenderTargetOutput;
SC = new SwapChain(Parent.DXGIFac, Parent.D3DDev, scd);
var backBuffer = Texture2D.FromSwapChain<Texture2D>(SC, 0);
_rt = new RenderTargetView(Parent.D3DDev, backBuffer);
Run Code Online (Sandbox Code Playgroud)
在每次渲染迭代时执行的绘图命令很简单:
Parent.D3DDev.ClearRenderTargetView(_rt, new Color4(0, 0, …Run Code Online (Sandbox Code Playgroud) 我一整天都在研究,并没有走得太远.我在Windows 7上,使用directx 11.(我的最终输出是DX11纹理上的视频帧)我想解码一些非常大的H.264视频文件,而CPU(使用libav)则没有剪了它.
我已经看过了使用DXVA2的libav的hwaccel功能,但是当我需要创建一个IDirectXVideoDecoder时,它只能用一个D3D9接口来创建.(我没有使用DX11)
每当我查看DXVA文档时,它都没有引用DX11,是在DX10或11中删除了吗?(无法找到任何关于此的确认,也没有任何说明DXVA2是多余的,可能是它被DXVA-HD超越了吗?)
然后我查看了媒体基础SDK,因为它看起来像我应该用于DX11 ...但我的标题中没有类型(文档说只是包括,但这没有产生任何东西).他们还指定了最少的窗口8来使用它.
我相信使用MF我需要windows 8 SDK,它现在包含所有directx libs/headers.
因此,这与Windows 7存在差距...是否有可能获得硬件加速视频解码?如果是的话,我应该使用哪种API?
我想使用C++/DirectX/XAML开发通用Windows应用程序.但似乎没有办法逃避微软的C++/CLI语言.当你创建一个pty项目时,我已经浏览了默认的代码,而且它都是C++/CLI.