我正在寻找一种在 Python 中截取 DirectX 游戏截图的方法。我已经尝试使用 PIL 和其他东西,但我最终只得到黑色屏幕截图。我看到项目 directpython11 提供了对某些 DirectX 内容的 Python 绑定,但我没有找到与外部 DirectX 应用程序屏幕截图相关的任何内容。
我有点迷茫,任何帮助将不胜感激;)。
PS:我在 Windows 7 上使用 Python 2.7.3 32 位编码。
谢谢
我试图用 dx11 绘制一个简单的正方形,但每个三角形的索引顺序决定了它是否出现。我在光栅化器状态下将剔除模式设置为无,但它似乎没有任何改变。
如果我将第一个三角形的顶点指定为 0, 1, 2 而不是 2, 1, 0 则三角形不会出现。所以我的问题是,无论剔除模式如何,我都需要以特定方式对三角形的顶点进行排序吗?
PS我正在绘制三角形列表而不是条带。
UINT indices[] = {2, 1, 0,
1, 3, 0};
MeshVertex vertices[] =
{
{ Vector3(1.0f, 1.0f, 0.0f)}, //Top Right
{ Vector3(-1.0f, -1.0f, 0.0f)}, //Bottom Left
{ Vector3(1.0f, -1.0f, 0.0f)}, //Bottom Right
{ Vector3(-1.0f, 1.0f, 0.0f)} //Top Left
};
mesh = new Mesh(vertices, indices, 4, 6, shader);
Run Code Online (Sandbox Code Playgroud) 此代码每100毫秒运行一次.内存使用率不断增加,直到达到1.5 GB然后崩溃.
void takeScreenShot()
{
Surface s;
s = CaptureScreen();
pictureBox1.Image = new Bitmap(Surface.ToStream(s, ImageFileFormat.Bmp));
s.Dispose();
}
public Surface CaptureScreen()
{
int width = Screen.PrimaryScreen.Bounds.Width;
int height = Screen.PrimaryScreen.Bounds.Height;
Device device = new Device(new Direct3D(), 0, DeviceType.Hardware, IntPtr.Zero, CreateFlags.HardwareVertexProcessing, new PresentParameters(width, height));
DisplayMode disp = device.GetDisplayMode(0);
Surface s = Surface.CreateOffscreenPlain(device, disp.Width, disp.Height, Format.A8R8G8B8, Pool.Scratch);
device.GetFrontBufferData(0, s);
return s;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试找出支持 DirectXMath 的地方。我知道它旨在作为 Windows 8 的新事物,但没有宏检查(例如针对 _WIN32_WINNT),并且在我的测试中似乎至少在 Windows7 和 VS2013 上运行良好。与大多数 MSDN 文档不同,其文档页面上似乎没有“平台要求”部分...
这只是编译器的问题吗?
我正在创建顶点和片段着色器,我想知道在我的着色器中使用函数是否会影响性能和优化,以提高可读性。
我见过许多主要支持 OpenGL 的图形应用程序。我还注意到许多这些应用程序都有一个-d3d标志,它会强制它们改用 DirectX API。
单个图形应用程序究竟如何使用两个不同的 API 但呈现完全相同的结果?他们肯定需要为这两个 API 添加代码,这既耗时又有点浪费?
我正在编写一个 DLL 插件,它将读取桌面帧缓冲区(整个屏幕)并将其直接渲染为传入的 Texture2D 指针。目标是将所有内容保留在视频内存中(并避免复制回系统内存的成本)并返回到视频内存)。
我能够传递 Texture2D(显示为 ID3D11Texture2D),但是我在使用 D3D11 抓取桌面帧缓冲区时遇到了问题。D3D9 提供了 GetFrontBufferData() 但似乎 D3D11 的解决方案是使用 GetBuffer()。
我的问题是关于获取 IDXGISwapChain。因为我想读取桌面帧缓冲区,只需通过GetBuffer()读取内容并显示在ID3D11Texture2D上。我得到一个 ID3D11Device 我不明白如何得到它的 IDXGISwapChain。
我有如下代码来获取帧缓冲区并将其放在纹理上:
ID3D11Texture2D* src = (ID3D11Texture2D*)g_TexturePointer;
ID3D11Texture2D* dst = NULL;
HRESULT hr = swapchain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&dst);
g_devCon->CopyResource(dst, src);
Run Code Online (Sandbox Code Playgroud)
在这里,我实际上使用 D3D11CreateDeviceAndSwapChain() 创建了我自己的交换链,但我想知道是否有必要,因为我已经有了一个 ID3D11Device。
CopyResource() 似乎也失败了。
我正在尝试使用计算着色器实现流体动力学。在这篇文章中,对纹理进行了一系列处理,因为这是在计算着色器之前编写的。
对纹理或缓冲区进行每次传递会更快吗?无论如何,最终通道都必须应用于纹理。
使用 2010 年 6 月的 DirectX SDK 编写程序时,必须在安装程序中包含几个可再发行的 cab 文件,以便程序在全新的 Windows 安装上运行。
DirectX 现在包含在 Windows SDK 中,但我无法找到有关在构建安装程序时是否需要任何类型的可再发行组件的信息。假设我使用 Windows 10 SDK。我的程序是否仅适用于全新的 Windows 7 安装?还是我缺少某种可再发行的东西?
这是我自己发现的:
1) 在 Windows 10 SDK 目录中似乎有一个“Redist”目录,其中包含 d3dcompiler_47.dll 和 d3dcsx_47.dll。我的假设是,如果链接了等效的库,那么我需要使用我的应用程序重新分发这些 dll,否则我不需要。是这种情况吗?
2) 我怀疑微软已经不再使用 DirectX 的 dll,它现在只是静态链接。这将解释不需要重新分发任何 dll。我也没有在我的 C:\Windows\System32 目录中看到任何 d3d11 dll,这似乎支持了这种怀疑。然而,d3d11.lib 只有 15kb,这让我相信某处一定有一个 dll。这是否以某种方式包含在 Windows 中?即使是全新的 Windows 7 安装?它是否随 Windows 更新一起分发?
任何人都可以让我知道我的担忧是否有效?我只是想确保我的安装程序包含 Windows 7 或更高版本的用户运行使用 Windows 10 SDK 中的 DirectX 11 的程序所需的所有内容。
在2017年,有没有办法使用C#或Basic开发DirectX应用程序?我正在将Visual Studio 2017与Framework 4.5.2一起使用,并且在尝试在Visual Studio上安装/查找DirectX SDK引用时费力。
我应该使用专用的IDE还是做错了什么?我什至不知道Microsoft是否仍支持DirectX SDK for .NET。
我花了大约4个小时来清理Google,但找不到一两年前的东西,所以是的。并不是我不是要自己找到它。