我正在尝试从内存数据创建SharpDX.Direct3D11.Texture2D但总是得到SharpDXException(HRESULT:0x80070057,"参数不正确.").我为此目的使用了Texture1D,之前可以毫无问题地创建它.
我已将代码减少到此样本,但仍会产生异常:
using (var device = new Device(DriverType.Hardware, DeviceCreationFlags.Debug)) {
// empty stream sufficient for example
var stream = new DataStream(16 * 4, true, true);
var description1D = new Texture1DDescription() {
Width = 16,
ArraySize = 1,
Format = Format.R8G8B8A8_UNorm,
MipLevels = 1,
};
using (var texture1D = new Texture1D(device, description1D, new[] { new DataBox(stream.DataPointer) })) {
// no exception on Texture1D
}
var description2D = new Texture2DDescription() {
Width = 8,
Height = 2,
ArraySize = 1,
MipLevels = …
Run Code Online (Sandbox Code Playgroud) MSDN表示您可以将.hlsl文件编译为头文件中定义的字节数组.这是他们给出的代码.
#include "PixelShader.h"
ComPtr<ID3D11PixelShader> m_pPixelShader;
hr = pDevice->CreatePixelShader(g_psshader,
sizeof(g_psshader), nullptr, &m_pPixelShader);
Run Code Online (Sandbox Code Playgroud)
g_psshader
字节数组也是如此.但是如何定义g_psshader呢?我无处可寻找谈论这个问题.我尝试了一些方法,但都失败了.MSDN提供了媒体扩展示例.但是该样本中没有PixelShader.h.
如果你错过了这个问题:如何在上面的代码中定义g_psshader(我的意思是在标题PixelShader.h中).
我刚刚开始学习 DX,所以我对它几乎一无所知,尽管我确实了解 OpenGL(在一定程度上)。我正在遵循教程(http://www.rastertek.com/tutdx11.html),并且我有一个仅渲染白色背景(清晰)的工作窗口。
现在 - 我如何真正从窗口模式切换到全屏模式,反之亦然?我知道有很多教程,有些甚至提供了执行此操作的代码,但由于我是新手,所以并没有真正的帮助。为什么?因为每个代码示例都是不同的,尝试在所有代码示例中找到模式对我来说显然太困难了。
所以我不要求代码 - 相反,我希望你告诉我需要释放/重新创建/更改哪些内容才能正确切换(以及所有这些)。我知道我需要更改显示设置,我知道我必须更改有关交换链的某些内容并释放/重新创建一些缓冲区 - 但不太确定究竟是哪一个。
我正在尝试学习DirectX 11,并且正在使用Visual Studio 2013 for Windows 7编写一个小应用程序.我正在阅读"使用DirectX 11进行3D游戏编程简介"一书,到目前为止,一切都很顺利.我刚刚介绍了本书的部分内容,其中显示了BoxApp示例,我正在尝试在我的应用程序中实现类似的代码,以便更好地了解最新情况.
我遇到了示例代码中使用的以下不推荐使用的库函数的问题:
D3DX11CompileFromFile(....);
D3DX11CreateEffectFromMemory(...);
Run Code Online (Sandbox Code Playgroud)
首先,只是为了看看我是否理解为什么这些不再可用,我对这些函数不再存在的理解是,对于Windows 8,不推荐使用D3DX头文件和库.最初它们是DirectX SDK中提供的辅助库. Dx9,然后由Os提供Dx10,然后弃用Dx11.1(2)?
现在我的主要问题是如何在没有弃用的D3DX标题的情况下编译着色器和效果?我对这个问题的正确方法感到有些困惑.
对我来说似乎有两种选择:
就像我说的那样,我不太确定哪种选择最好(或者即使有更好的替代选择).我的理解是Effects11更多地用于支持需要移植到Dx11的旧版Dx10.由于我没有任何Dx10代码移植,我对这种支持并不太感兴趣,我对Windows 8中的Metro应用程序支持并不太感兴趣(我认为这对他们来说是正确的术语?)或者如果D3DCompiler路径将意味着支持地铁应用程序,然后我想这是可取的.
无论如何,任何建议或见解将不胜感激.提前致谢.
好吧我正在开发我自己的DirectX框架所有关于制作DirectX框架的教程都是旧的并且使用已弃用的东西,所以我只是制作了自己的东西,虽然我从旧教程中获取了一些东西并更新它们以使用新的Windows 8.1 SDK和这里来了问题,我得到XMMATRIX
原始代码使用的错误D3DXMATRIX
(33): error C2719: 'unnamed-parameter': formal parameter with __declspec(align('16')) won't be aligned
(40): error C2719: 'unnamed-parameter': formal parameter with __declspec(align('16')) won't be aligned
(42): error C2719: 'worldMatrix': formal parameter with __declspec(align('16')) won't be aligned
(42): error C2719: 'viewMatrix': formal parameter with __declspec(align('16')) won't be aligned
(42): error C2719: 'projectionMatrix': formal parameter with __declspec(align('16')) won't be aligned
Run Code Online (Sandbox Code Playgroud)
这是S_SHADER.h的第33行:
bool Render(ID3D11DeviceContext*, int, XMMATRIX, XMMATRIX, XMMATRIX);
Run Code Online (Sandbox Code Playgroud)
这是S_SHADER.h的第40行:
bool SetSHaderParameters(ID3D11DeviceContext*, XMMATRIX, XMMATRIX, XMMATRIX);
Run Code Online (Sandbox Code Playgroud)
这是S_SHADER.cpp的第42行:
41 - bool S_SHADER::Render(ID3D11DeviceContext* deviceContext, …
Run Code Online (Sandbox Code Playgroud) 如优化DirectX应用程序以实现低延迟输入...所述,使用DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT可以使应用程序具有更高的响应速度。我对此有两个问题:
谢谢
使用 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 的程序所需的所有内容。
我是DirectX-11图形编程的新手,很多教程都参考了DirectX SDK及其中包含的示例.但即使我可以通过Visual Studio运行DirectX程序,我也无法在桌面上找到我的DirectX SDK文件夹.那么DirectX SDK通常存储在我的PC上.我正在使用Windows 8,所以DirectX已经包含在内,而我无需安装它.
先感谢您.
我使用DX11在C++中编写了自己的cameraclass.目前我使用WM_MOUSEMOVE事件在场景中环顾四周.为了防止cursur离开窗口,每当发生WM_MOUSEMOVE事件时,我都会调用SetCursorPos函数使鼠标居中.但是如果我快速移动鼠标,光标就会离开窗口.解决方法是使用ClipCursor函数,但是当光标碰到rect的边界时,这会导致相机的旋转动摇.所以ClipCursor解决了原来的问题,但在另一个问题上结束了.
你们有解决方法吗?
我开发了一个在窗口中显示类似视频的应用程序。我使用在Direct2D 1.1简介中介绍的技术。就我而言,唯一的区别是最终我使用
ID2D1DeviceContext::CreateBitmap
Run Code Online (Sandbox Code Playgroud)
然后我用
ID2D1Bitmap::CopyFromMemory
Run Code Online (Sandbox Code Playgroud)
复制原始RGB数据到它,然后我打电话
ID2D1DeviceContext::DrawBitmap
Run Code Online (Sandbox Code Playgroud)
绘制位图。我使用高质量的三次插值模式D2D1_INTERPOLATION_MODE_HIGH_QUALITY_CUBIC进行缩放以具有最佳图像,但是在某些情况下(RDP,Citrix,虚拟机等),它非常慢并且具有很高的CPU消耗。发生这种情况是因为在这种情况下,使用了非硬件视频适配器。因此,对于非硬件适配器,我正在尝试关闭插值并使用更快的方法。问题是我无法准确检查系统是否具有真正的硬件适配器。
当我打电话D3D11CreateDevice,我用它来与D3D_DRIVER_TYPE_HARDWARE但在虚拟机上它通常返回“微软基础渲染驱动程序”,它是一个软件驱动程序,不使用GPU(它消耗CPU)。因此,目前我检查供应商ID。如果供应商是AMD(ATI),NVIDIA或Intel,那么我将使用三次插值。在另一种情况下,我使用最快的方法,不会消耗很多CPU。
Microsoft::WRL::ComPtr<IDXGIDevice> dxgiDevice;
if (SUCCEEDED(m_pD3dDevice->QueryInterface(...)))
{
Microsoft::WRL::ComPtr<IDXGIAdapter> adapter;
if (SUCCEEDED(dxgiDevice->GetAdapter(&adapter)))
{
DXGI_ADAPTER_DESC desc;
if (SUCCEEDED(adapter->GetDesc(&desc)))
{
// NVIDIA
if (desc.VendorId == 0x10DE ||
// AMD
desc.VendorId == 0x1002 || // 0x1022 ?
// Intel
desc.VendorId == 0x8086) // 0x163C, 0x8087 ?
{
bSupported = true;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
即使在虚拟机中,它也适用于物理(控制台)Windows会话。但是对于RDP会话,如果使用的是真实计算机,IDXGIAdapter仍会返回供应商,但它不使用GPU(我可以通过Process Hacker 2和AMD System Monitor(对于ATI Radeon)看到它),因此在三次插值。如果使用ATI Radeon与Windows 7进行RDP会话,则它比通过物理控制台大10%。
还是我弄错了,RDP以某种方式使用了GPU资源,这就是为什么它通过IDXGIAdapter :: GetDesc返回真正的硬件适配器的原因?
DirectDraw
我也看了DirectX诊断工具。看起来“ DirectDraw Acceleration”信息字段恰好返回了我所需要的。如果是物理(控制台)会话,则显示“已启用”。对于RDP和虚拟机(无硬件视频加速)会话,它会显示“不可用”。我查看了来源,从理论上讲我可以使用验证算法。但这实际上是DirectDraw,我没有在应用程序中使用它。我想使用直接链接到ID3D11Device,IDXGIDevice,IDXGIAdapter等的东西。
IDXGIAdapter1 :: GetDesc1和DXGI_ADAPTER_FLAG
我也尝试使用IDXGIAdapter1 :: GetDesc1并检查标志。 …
directx-11 ×10
c++ ×6
directx ×4
windows ×4
c ×1
c# ×1
camera ×1
d3dx ×1
direct3d11 ×1
directxmath ×1
dxgi ×1
fullscreen ×1
hlsl ×1
installation ×1
mouse ×1
sharpdx ×1
textures ×1
toggle ×1