Articles of direct3d

DXUT中缺lessDXUTSetD3D11Devicefunction

我正在用direct3d和DXUT编写一个基本的程序。 我正在使用D3D11CreateDeviceAndSwapChain()手动创build一个direct3d设备,并使用DXUTSetD3D11Device()函数将其传递给DXUT,根据文档应该是正确的。 令我困惑的是,当调用DXUTSetD3D11Device()时,我得到一个LNK2019: unresolved external symbol错误。 我可以调用DXUTCreateWindow()等其他DXUT函数,也可以自己构buildDXUT并正确链接到它。 当我查看DXUT.h时,我可以findDXUTSetD3D11Device()的声明,但是当我查看DXUT.cpp时,找不到任何对此函数的引用,所以我认为这可能是我得到此链接器错误的原因。 这似乎和我的一样。 我将在这里留下相关的代码,以防万一: bool DXUTEngine::Initialise() { HR(DXUTCreateWindow(m_appname)); if(!m_pDirect3D->Initialise(DXUTGetHWND(), m_width, m_height)) { OutputDebugString(L"\n\n Failed to initialise Direct3D\n\n"); return false; } HR(DXUTSetD3D11Device(m_pDirect3D->GetDevice(), m_pDirect3D->GetSwapChain())); return true; } 这里是我创build设备的地方: result = D3D11CreateDeviceAndSwapChain(NULL, driverType, NULL, 0, &featureLevel, 1, D3D11_SDK_VERSION, &swapChainDesc, &m_pSwapChain, &m_pDevice, NULL, &m_pContext); 目前我认为自己做的事情非常错误,或者这个function不存在。 我真的很感激任何帮助。 提前致谢。

DirectX立即上下文在不同的线程从消息泵

如果我使用标志COINIT_APARTMENT_THREADED调用CoInitializeEx() ,是否明智地创build并在不同于调用PeekMessage()或GetMessage()线程上使用我的所有Direct3D对象? 这是否有性能问题?

WPF全屏窗口,3D渲染性能

我正在使用WPF 4.6.2和Direct3D 11的CAD应用程序,它们通过D3DImage进行互操作。 当窗口在4K 3840×2160显示器上最大化时,应用呈现非常慢的3D内容,我得到大约1 FPS。 我认为“好吧,屏幕上的像素太多了,这可能是正常的”。 但是,如果我调整窗口的大小,使其不再最大化,而只是比最大化的像素小几个像素,3D渲染就可以正常工作,而且我可以获得大约20 FPS。 相同的场景,相同的渲染设置,相同的一切,唯一的区别是全屏与窗口。 我的窗口使用自定义的铬,即<WindowChrome CornerRadius="0" GlassFrameThickness="0" UseAeroCaptionButtons="False" />和自定义标题栏和系统button。 我已经把问题缩小到了WindowChrome XAML的东西。 我觉得这个问题是原生的Win32窗口在这个状态下太大了,甚至比4K还要大,而且需要被剪裁到屏幕上。 Spy ++为我的最大化窗口显示了以下矩形: (-11,-11)-(3851,2111), 3862×2122 (Maximized) 为什么SystemCommands.MaximizeWindow() API会在我的窗口中执行此操作? 有没有办法让它尊重我的屏幕大小,并停止调整我的窗口比那更大? 更新:好的,正如评论中提到的,最大化的窗口大小比屏幕大是正常的,我确认它仍然是没有自定义铬的情况。 然而不正常的是窗口客户端矩形比屏幕大。 在导致Direct3D性能的错误状态下,该窗口的客户端矩形为(-5,-6)-(3857,2166), 3862×2122 。 在良好的状态(但与系统提供的铬),客户矩形是(11,45)-(3851,2111), 3840×2066 。

从设备(video)内存直接在当前窗口中显示位图

假设我已经在使用cudaMalloc()和cudaMemcpy()设备(video)内存中有一个位图(一个图像cudaMemcpy() 。 直接在屏幕(当前窗口)上显示这个位图的最简单的方法是什么? 我猜应该有一个替代GDI的BitBlt() …但任何方法(Direct3D的,OpenGL,甚至GDI)将罚款。 CUDA SDK(OpenGL版本)中的示例使用Texture,它使用缓冲区(像素缓冲区对象)来保存数据,该数据注册为CUDA资源,应该在每帧( glutDisplayFunc()调用)映射/取消映射。 而这一切似乎只是一点点复杂和不必要的。

DirectX诊断模式不适用于Win32(?)

我正在使用Windows 8上的DirectX 11程序,我认为顶点着色器存在问题。 我尝试启动DirectX诊断模式([Alt] + [F5]),并且程序正常运行时,如果打开诊断模式时不会引发exception,则在调用“CreateSwapChainForHwnd”时会出现以下错误消息 MyApplication.exe中的0x0097C004未处理的exception:0xC0000096:特权指令。 DirectXdebugging是否不适用于Windows Store应用程序? 它似乎在特定的Win32应用程序场景中工作正常,但我似乎遇到很多情况下,它不起作用。 更新: 除此之外,我安装了DirectXdebugging符号,并获得了一个稍微更详细的信息。 在MyApplication.exe 0x000007FDED063589(dxgi.dll)未处理的exception:0xC0000005:访问冲突读取位置0x0000000000000000。 所以它看起来是微软最后一个代码的空引用exception。

食人魔和快板direct3d设备9冲突

我一直在试图编写一个程序,使用Allegro 5来处理2D渲染和Ogre的3D渲染,但是我在初始化时遇到了问题,我得到的大部分问题都是窗口的实例,但是现在的问题是, Ogre::D3D9RenderWindow::setDevice()只采用Ogre的types,这是由ID3Device9根据Ogre API参考设置,而不是al_get_d3d9_device()返回哪个是LPDIRECT3DDEVICE9 。 我需要帮助,试图找出如何将LPDIRECT3DDEVICE9转换为ID3Device9 。 这是我迄今为止的代码: #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { ALLEGRO_DISPLAY *al_display = NULL; if(!al_init()) { fprintf(stderr, "Cannot initialize allegro"); return -1; } al_display = al_create_display(640, 480); if(!al_display) { fprintf(stderr,"Cannot initialize the display"); return -1; } HWND hWnd = al_get_win_window_handle(al_display); HINSTANCE hInst = (HINSTANCE)GetWindowLong( hWnd, GWL_HINSTANCE); Ogre::D3D9RenderWindow ogre_window(hInst); ogre_window.setDevice(al_get_d3d_device(al_display)); […]

如何在DirectX 11桌面应用程序中更改窗口大小

我正在编写基于这个msdn链接中的教程的DirectX 11着色器程序: https://msdn.microsoft.com/en-us/library/windows/desktop/jj552952.aspx 当我运行它,它是全屏。 更改交换链大小不会按预期更改窗口大小。 有没有办法改变窗口大小? 我只是想创build一个固定大小的窗口,如果它恰好覆盖整个屏幕,我希望它是独家全屏。 我可以使用IDXGISwapChain1 :: GetHwnd方法从交换链获取HWND。 这个句柄对于调整窗口大小是否有用? 相应的代码可以在这里find: https://code.msdn.microsoft.com/windowsdesktop/Direct3D-Tutorial-Win32-829979ef

Direct3DCreate9Ex作为Windows服务运行时返回D3DERR_NOTAVAILABLE(0x8876086a)

出于某些原因,我必须在我的程序中创buildD3D9,它是作为服务运行的。 但是我得到了以下代码的D3DERR_NOTAVAILABLE : ATL::CComPtr<IDirect3D9Ex> d3d9 = nullptr; HRESULT hr = ::Direct3DCreate9Ex(D3D_SDK_VERSION, &d3d9); 如果它没有运行在服务中,它就可以工作。 我看到有人通过检查Allow service to interact with desktop在控制面板中Allow service to interact with desktop来取得成功,但是这对我不起作用。 有什么我不得不提的吗?

如何在windows c ++中使用titlebar创build一个无边框窗口

我正在尝试创build一个Direct3D应用程序,在标题栏和最小化/退出button的窗口模式下运行。 但是,我真的想要能够绕过窗口的边界。 我正在寻找这样做,因为当应用程序水平填充主监视器(有空间移动应用程序垂直)时,它在双显示器上看起来很俗气,但它的窗口边框溢出到第二屏幕上。 我已经尝试了一堆与GWL_STYLE和GWL_EXSTYLE的组合,但似乎无法取得进展,除非我禁用标题栏。 我已经看到了一堆应用程序是无边界的,但他们似乎模仿标题栏,而不是使用Microsoft提供的内置的应用程序。 感谢您的任何build议。

在Windows / D3D中检测.png alpha通道

我使用D3DXCreateTextureFromFile()从.png加载纹理。 我的程序如何知道图像文件是否包含alpha通道?