标签: direct3d

是否有可能在纯Python中编写像魔兽世界一样大的3D游戏?

是否有可能在纯Python中编写像魔兽世界一样大的3D游戏?假设使用DirectX/D3D绑定或OpenGL绑定.

如果没有,那么用Python做这样一个项目最大的阻碍是什么?我知道游戏往往属于C和C++领域,但有时候人们会习惯做事!

任何信息都有助于满足我的好奇心.

编辑:

GIL会发布关于3d客户端性能的重大问题吗?使用say,OpenGL或DirectX绑定与本机使用库的一般性能损失是什么?

python 3d direct3d

11
推荐指数
8
解决办法
8087
查看次数

3D角色/模型创作者

我正在使用XNA/C#创建一个3D游戏的项目,游戏将使用很多3d角色.

看看目前的3D游戏,有些人创造了近数百个角色,这让我觉得有一些优秀的3D角色/模特创作者.

为了缩小样本,游戏将拥有像"大追逐"游戏这样的角色.在XNA开发中有一些好的(和简单的)角色模型创建者?当然,免费更好,但我也会得到付费版本.

编辑:另一个问题是关于角色的运动.步行,跳跃,坐姿等动作是由"角色创造者工具"或游戏"创造"的?

xna direct3d 3d-modelling

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

阻止特定c#winform的桌面共享或检测桌面共享

在开发检查软件时,我有一个要求防止通过TeamViewer,AnyDesk,Ammyy Admin等应用程序共享桌面,或者至少阻止对其进行检测。我们的考试软件是用C#开发的,它是一种winform逐一呈现问题。

我不认为检测如此简单,因为它们有多种捕获屏幕桌面复制API,BitBlt,Direct3D,DirectX,DirectShow等方法。

因此,我开始探索如何防止在启动桌面共享时显示我的c#winform。为此,到目前为止,我已经尝试了以下操作:

  1. 由于我们的应用程序将在Windows 7及更高版本上运行,因此我通过检查设置SetWindowDisplayAffinityWDA_MONITOR对Winform 启用保护的桌面组合来利用DWM(停止窗口管理器)。通过在我开始桌面共享时执行此操作,远程控制的计算机可以看到表单上的黑色层。但是,并非所有桌面共享应用程序都具有相同的行为。就像TeamViewer的行为一样,但Ammyy Admin的行为却像AnyDesk。某些应用程序如何显示黑层而有些则不显示?我还能做些什么吗?
if (winForm != null)
{
    if (Protect)
        result = SetWindowDisplayAffinity(winForm.Handle, WDA_MONITOR);
    else
        result = SetWindowDisplayAffinity(winForm.Handle, WDA_NONE);
}
Run Code Online (Sandbox Code Playgroud)

我编码的这种方法并不完全适用于所有桌面共享应用程序,因此,是否有100%的解决方案可以防止/检测桌面共享?

如果您尝试了VLC播放器的“ DirectX(DirectDraw)视频输出”,那么此输出方法也将执行相同的操作SetWindowDisplayAffinity,当启动任何桌面共享应用程序时,它将在视频上显示黑色图层,而我测试了该功能是否可与将近9种桌面共享应用程序一起使用知道怎么做?可以用c#winform完成吗?

更新29-05-2019

检查VLC代码后,我知道它们正在使用DirectDraw进行硬件覆盖。因此,我创建了vc ++项目并使用d3d9并创建了具有红色表面的覆盖,现在,如果我将机器移开,则红色的表单将显示黑色。答对了!!解决了一半问题。

现在,我正在尝试为该窗口设置透明度,以便覆盖将在我的C#应用​​程序的顶部,并且考生可以进行考试,如果进行远程考试,则覆盖将以黑色显示。为了使窗口透明,我使用了DwmExtendFrameIntoClientAreawinapi,但是现在在远程也可以将其显示为透明。有什么办法吗?

c# directx winapi direct3d win32gui

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

Direct2D深度缓冲区

我需要绘制一个形状列表,我正在使用Direct2D.我从文件中获取形状列表.列表已排序,文件中元素的顺序表示将绘制这些形状的顺序.所以,如果例如文件指定在相同的位置和相同大小的两个矩形,只有第二个将是可见的(因为第一将被覆盖).

鉴于我的形状列表,我按以下方式进行绘图:

list<Shape> shapes;

for (const auto& shape : shapes)
   shape.draw();
Run Code Online (Sandbox Code Playgroud)

很容易看出,如果我有两个形状,我无法反转绘图操作的顺序,这意味着我必须确保shape2将始终绘制shape1,依此类推.接下来我无法使用多个线程来绘制我的形状,这在性能方面是一个巨大的劣势.

我读到Direct3D支持深度缓冲区(或z缓冲区),它为每个像素指定了它的z坐标,这样只会绘制"可见"像素(更接近观察者的on),无论顺序如何形状是绘制的.当我读取文件时,我有每个形状的深度信息.

有没有办法在Direct2D中使用深度缓冲区,或类似的技术允许我使用多个线程来绘制我的形状?

c++ directx direct3d direct2d depth-buffer

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

什么是不同的HLSL采样器类型?

我目前正在使用DX9/SM3,关于HLSL采样器的MSDN文档似乎非常缺乏解释如何使用不同采样器类型的方法.更糟糕的是,他们试图在一篇文章中介绍DX9和DX10,所以他们将所有关键词混在一起:

sampler Name = SamplerType {Texture = < texture_variable >; [ state_name = state_value ;] ...};

...

SamplerType

[in]采样器类型,它是以下之一:sampler,sampler1D,sampler2D,sampler3D,samplerCUBE,sampler_state,SamplerState.

Direct3D 9和Direct3D 10之间的差异:

Direct3D 10支持一种额外的采样器类型:SamplerComparisonState.

我觉得与这篇文章相反的SamplerState是DX10.实际上我看到的所有代码都sampler_state用于SamplerType.BasicHLSL(DX9)的一个简单示例:

sampler MeshTextureSampler =
sampler_state
{
    Texture = <g_MeshTexture>;
    MipFilter = LINEAR;
    MinFilter = LINEAR;
    MagFilter = LINEAR;
};
Run Code Online (Sandbox Code Playgroud)

为什么所有不同的_SamplerType_s都存在,何时使用,比方说samplersampler2D代替sampler_state?你需要获取的时候,无论如何,如要明确tex2D,texCUBE又怎样是怎么回事?

directx shader direct3d hlsl

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

在Direct3D中挣扎着顶点和索引缓冲区

我已经尝试了许多个月,学习如何IDirect3DVertexBuffer9IDirect3DIndexBuffer9工作.我读过多本书,电子书和论坛,但我仍然无法理解他们的工作方式.有人可以帮我理解它们的工作方式以及它们如何连接在一起吗?

PS:我试过搜索相关问题,但没有什么比我感兴趣了.

谢谢.

c++ indexing buffer direct3d vertex

9
推荐指数
2
解决办法
2321
查看次数

将预编译的HLSL着色器加载到内存中以与CreatePixelShader一起使用

我需要将一个已编译的像素着色器加载到内存中以与CreatePixelShader一起使用,但我不能使用任何 D3DX调用.

我怎样才能做到这一点?

(我使用Visual Studio 2010作为编译器,使用C++作为语言)

c++ direct3d hlsl

9
推荐指数
2
解决办法
9869
查看次数

Windows Phone:登录到控制台

免责声明:我对MSFT技术世界很陌生,大约一个月前才启动Windows Phone开发.

我无法弄清楚如何从C#和C++(Direct3D)Windows Phone 8应用程序中将信息记录到Visual Studio输出窗口.这可能吗?

我正在以调试模式构建,目标是Windows Phone 8,在XDE模拟器中运行,我的开发机器是安装了VS2012 Ultimate的Windows 8机箱.我的应用程序运行正常,我的Direct3D场景渲染正常,但我无法记录任何东西!这使得跟踪代码执行变得困难并迫使我使用断点(在许多情况下这可能是过度杀伤).

我一直在寻找各种各样的方法(OutputDebugString就是其中之一).我在MSDN上看不到任何关于此的内容 - 为什么这里没有记录?

c++ logging direct3d windows-phone windows-phone-8

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

是否可以通过D3DImage和ANGLE将OpenGL ES代码与WPF应用程序一起使用?

摘要(TL:DR版)

最终,我们的目标是能够在WPF应用程序中本地使用OpenGL ES代码(即不是SharpGL等),并且无需空域或驱动程序问题,可以使用Google的ANGLE项目.

背景:

我喜欢OpenGL而不是DirectX的一个原因是它的跨平台功能.它在OS X和Linux以及通过ES的Android和iOS上都提供了出色的支持.但是,在Windows上,使用它会受到驱动程序问题的影响,或者更糟糕的是,许多卡只是没有正确实现它.

输入Google的ANGLE项目或Almost-Native-Graphics-Layer-Engine.

ANGLE是围绕Direct3D实现的OpenGL ES 2.0包装器,这意味着您可以编写OpenGL ES 2.0代码以在Windows上运行,而无需实际的OpenGL驱动程序.它不仅通过了ES兼容性测试,而且实际上是Chrome如何完成所有图形渲染,包括WebGL,所以它绝对是一种经过验证的技术.

问题:

我们知道WPF有一个D3DImage控件,它允许你在WPF中托管Direct3D渲染,并且它可以通过将其输出正确地堆叠到WPF渲染线程来消除空域问题.我的问题是,因为ANGLE是通过Direct3D实现的,而D3DImage是Direct3D渲染的目标,是否可以将两者结合起来,允许我们编写OpenGL ES代码并将其托管在Windows上的WPF应用程序中,所有这些都没有驱动程序或空域问题?

这将是我们的"圣杯".

然而,由于ANGLE希望使用自己的D3Dmage控件创建的D3D表面上的ANGLE目标,因此我一直在围绕墙壁进行攻击.我不确定这是否可能.我甚至无法在任何人的任何地方找到一篇文章或参考文献,更不用说尝试它了.

尽管如此,我们的目标是让我们的共享,跨平台OpenGL(或ES)代码在WPF应用程序中工作,而不会出现空域问题或OpenGL驱动程序要求.我建议使用ANGLE/D3DImage只是......一次尝试.到目前为止,这是我提出的"手段",但这只是我们目标的潜在手段,而不是目标本身.任何能让我们得到同样解决方案的东西都会受到欢迎.

opengl wpf direct3d opengl-es d3dimage

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

在窗口模式下在Windows 10上等待VBLANK的正确方法

等待VBLANK在窗口模式下呈现在Windows 10上的正确方法是什么?目前我正在做以下事情:

D3DKMTWaitForVerticalBlankEvent(&waitData);
swapchain->Present(0, 0);
Run Code Online (Sandbox Code Playgroud)

然而,这会导致偶尔的口吃.我目前关于口吃的理论如下:
DWM在VBLANK事件之前的某个时间完成合成,然后在VBLANK间隔期间,DWM尝试尽可能快地写入前端缓冲区.因此,如果Present在VBLANK间隔中调用,则可能在DWM写入前缓冲区后发生.这是我头脑中的画面: 坏

因此,Present(1, 0)在VBLANK之前调用更正确的方法来使用DWM对窗口的后台缓冲区进行排队.然后调用D3DKMTWaitForVerticalBlankEvent等到下一个VBLANK.那是:

swapchain->Present(1, 0);
D3DKMTWaitForVerticalBlankEvent(&waitData);
Run Code Online (Sandbox Code Playgroud)

有相应的图片: 好 第二种方法似乎完美无缺,不再有任何口吃.

我的问题是: 在VBLANK区间中出现的正确方法什么, 我的理论是正确的还是有更复杂/更简单的事情发生?还有什么资源可以了解这种互动的更多信息吗?

潜在有用的链接:
MSDN Present
DXGI最佳实践
DXGI可等待交换链
D3DKMTWaitForVerticalBlankEvent

编辑: 不确定这应该是答案还是编辑.经过一些谷歌搜索后,我发现尼古拉斯钢铁的这个解释似乎与我的理论一致

由于Windows不会暴露VBlank中断,因此没有确定的方法可以准确检测VBlank何时发生,并且显示/ GPU不一定需要生成一个(此外,'当前扫描线'信息由例如IDirect3DDevice9给出:: GetRasterStatus可能不准确).因此,程序通常会轮询VBlank或依赖Direct3D/OpenGL来为它们执行此操作.

程序在VBlank期间显示视频帧以避免撕裂,因为显示器将很乐意切换到新帧中画.使用Windows Vista中的合成器和更高版本的Windows,这些程序仍将检测VBlank并且仅在其中呈现帧,因为他们认为它们直接呈现视频帧,而实际上视频帧首先进入合成器.发送到合成器的帧(来自PC上的任何正在运行的程序)将由合成器排队,并合并在一起以在VBlank期间交换/复制到位.

此系统可能出现的问题:

1)VBlank的程序轮询可能会错过组合.这将导致帧排队等待下一个合成,这意味着前一帧将显示两倍长.

2)更糟的是,下一帧可能不会错过组合物,和最终重写先前排队帧 - 所以你结束了重复的帧,随后跳过的帧.

3)程序的VSync实现可能自然无法检测VBlank(持续时间很短),导致它等到下一个VBlank和风险问题1和/或2.

4)这些问题甚至可能结合起来产生重复和/或遗漏帧的"完美风暴".

正如您所看到的,此轮询设置并不理想,而且当合成器存在时更糟糕.有许多问题可能导致新视频帧无法显示,导致前一帧显示的时间超过预期,并可能完全跳过新帧!

解决方案是使用合成器而不是合成器.立即和之后呈现新的视频帧,调用将阻塞的命令,直到合成器完成它的任务(DwmFlush).这将确保在每个VBlank周期之间向合成器呈现最多1个新视频帧.只要合成器处于活动状态,您也不必担心自己对VBlank进行轮询.

所以最好的办法是:

if (DWM.isEnabled()) 
{ 
    present(); 
    DwmFlush(); 
} 
else 
{
    waitForVBlank(); 
    present(); 
}
Run Code Online (Sandbox Code Playgroud)

另一个编辑: 对于未来的读者,还有另外两种等待VBLANK的方法,我不知道它们是什么IDXGIOutput::WaitForVBlank,IDirectDraw7::WaitForVerticalBlank后者被弃用了.

directx winapi direct3d dwm dxgi

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