问题标签 [directx-11]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
1070 浏览

visual-c++ - DirectX 11 将对象添加到地形 - Rastertek 教程

我一直在通过 Rastertek DX11 地形教程进入“教程 6:基于高度的运动”,我已经通读并创建、编译等,教程本身运行良好。

在每个教程的结尾,它会建议下一步该做什么,当它建议时我被卡住了

“放置一个在地形周围随机移动的物体,根据四叉树的信息调整其高度。” 我不知道如何正确地做到这一点。

有人对我将如何做这件事有建议吗?要么是一个教程链接,它解释了如何添加项目以及地形(我在网站上找不到),要么只是为我指明了正确的方向!您可能需要查看那里的代码(可在此处找到:http ://rastertek.com/tertut06.zip )。现在,我最接近的是能够从文件中渲染 3D 图像,但是当我这样做时,它会使地形消失。所以我显然是在叫错树。我有一个谷歌,但这无济于事。

任何建议都会很棒,因为我对这一切还是很陌生。

0 投票
1 回答
2107 浏览

c++ - DirectX 11 D3DXMatrixTranslation 继续运行?

我想将移动对象绑定到按下按钮。当我按下按钮时,该对象迅速消失,似乎第一个翻译一直在运行。然后当我放开按钮时,它很快消失并最终到达它本来应该没有触摸按钮的位置。当我按下/释放按钮时,两者之间“弹跳”。

我对 DX11 还是很陌生,而且我已经环顾四周了。我在这里拉头发,试图弄清楚发生了什么。

0 投票
2 回答
588 浏览

c++ - IASetInputLayout 是否检查您是否传递了已设置的输入布局?

我正在 DirectX 11 中设计游戏引擎,我对 ID3D11DeviceContext::IASetInputLayout 函数有疑问。从我在文档中可以找到的内容来看,如果您将输入布局设置为先前设置的设备,则没有提及该功能将做什么。在上下文中,如果我要执行以下操作:

这会通过设备状态切换导致性能损失,还是运行时会将输入布局识别为与已经设置并返回的布局等效?

0 投票
1 回答
1502 浏览

c++ - 为什么在我的 DX11 游戏过程中加载了 D3D10SDKLayers.dll?

请参阅下面的编辑更新。原问题已修改!

我有一个使用 DX11 设备的工作窗口。当我尝试使用 Alt+Enter 进入全屏模式时,我的问题就出现了。如果窗口没有聚焦,我会得到一个调试输出,上面写着:

'MyGame.exe': Loaded 'C:\Windows\SysWOW64\D3D10SDKLayers.DLL', Cannot find or open the PDB file

然后是警告

DXGI Warning: IDXGISwapChain::Present: Fullscreen presentation inefficiencies incurred due to application not using IDXGISwapChain::ResizeBuffers appropriately, specifying a DXGI_MODE_DESC not available in IDXGIOutput::GetDisplayModeList, or not using DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH

我相当肯定 DX11 游戏不应该加载 D3D10SDKLayers.dll,尤其是在执行过程中。从 MSDN 文档中,我收集到这个 dll 是在设备创建时加载的: if a device is created with the appropriate layer flag, this DLL is loaded automatically. 因此,我检查了在执行过程中是否以某种方式调用了我的设备创建方法,但事实并非如此。我的游戏中只有 2 个位置存在设备创建,并且两个位置都没有被击中。编辑:检查 MSDN 后,似乎这个 dll 只是一个调试 dll,可能只是被加载以打印出警告本身,没有其他目的。

显式复制案例:

1)Alt+Enter 6次(3个全屏转换周期,双向,开始窗口),第7天加载dll并弹出警告。无论窗口聚焦如何,都会发生这种情况。

方法调用层次结构摘要(全屏显示):

1) ToggleFullscreen() - 我的方法,只有 Alt+Enter 调用的方法
2) ResizeTargetAndBuffers() - 我的方法,下面的子方法
3) DXGISwapChain->ResizeTarget(frontBufferDesc) 将前缓冲区大小调整为指定的 res
4) DXGISwapChain->GetFullscreenState () 确定全屏状态
5) DXGISwapChain->SetFullscreenState(TRUE, NULL) 进入全屏状态
6) ResizeDXGIBuffers(width, height, TRUE) 我的方法,调整后台缓冲区大小,子方法低于
7) DXGISwapChain->ResizeBuffers(count, width, height, format, flags) 来调整后台缓冲区的大小
8) DXGISwapChain->ResizeTarget(frontBufferDesc) 防止刷新率问题。RefreshRate 成员按照 MSDN 最佳实践归零。
9) DXGISwapChain->GetFullscreenState() 判断全屏状态

方法调用层次结构摘要(窗口化):

1) ToggleFullscreen() - 我的方法,仅由 Alt+Enter 调用的方法
2) ResizeTargetAndBuffers() - 我的方法,下面的子方法
3) DXGISwapChain->ResizeTarget(backBufferDesc) 将前缓冲区大小调整为指定的 res
4) DXGISwapChain->GetFullscreenState () 确定全屏状态
5) DXGISwapChain->SetFullscreenState(FALSE, NULL) 进入全屏状态
6) DXGISwapChain->ResizeTarget(backBufferDesc) 将前端缓冲区的大小调整为窗口的分辨率(帮助解决了一些分辨率问题)
7) ResizeDXGIBuffers(width, height , FALSE) 我的方法,调整后台缓冲区大小,子方法低于
8) DXGISwapChain->ResizeBuffers(count, width, height, format, flags) 调整后台缓冲区大小
9) DXGISwapChain->GetFullscreenState() 确定全屏状态

这件事的后果是相当严重的。我的捕获 Alt+Enter 的低级键盘钩子不再被调用,因此 Windows 能够进行自动 Alt+Enter 处理,这完全绕过了我的 ToggleFullscreen 方法并将窗口设置为桌面分辨率。这会导致缓冲区的大小错误(因为我没有设置它们,所以 windows 做了),导致效率低下警告,并弄乱了我的程序中的变量,这些变量不再正确了解缓冲区大小以及窗口是否是全屏的或不。

关于可能导致这种情况的任何想法?

PS如果您需要代码示例,请具体说明您想看到的内容,如果可能,我会尝试将其发布。我不能把整个代码清单。

编辑:设备创建代码如下。

第一次调用成功率 99%,即当你不使用远程桌面时,所以我只关注它。我给它适配器,driverType 为 D3D_DRIVER_TYPE_HARDWARE,m_CreateFlags 为 D3D11_CREATE_DEVICE_DEBUG,m_eFeatureLevel 为 D3D_FEATURE_LEVEL_11_0。非常标准的调用,它总是成功的。

编辑更新 1:经过大量调试后,我发现当加载 dll 并弹出低效率警告时,会出现一些非常有趣的情况。它们在下面列出:

1) VS2010 调试器不再触发 key hook 中的断点。
2) 打印输出在键钩中不再起作用。
3) 如果窗口在之前可重新调整大小,则窗口可能变得不可调整大小
4) 窗口可能变得不可移动。
5)三个线程退出。

编辑更新 2:第一次编辑更新可能有不正确的假设;如果我找到它,我会删除它。事实证明,我的低级键钩子不再被调用(我认为,因为其中没有断点或打印语句),所以如果我的程序中的某些东西意外地取消注册,那么这将导致上述所有问题. 明天测试这个...

编辑更新 3:我不确定发生了什么。我在家用电脑和工作电脑上测试了同一个干净的项目,得到了不同的结果。在家里,我可以无限期地 Alt+Enter 没有任何问题发生,但在工作中 Alt+Enter 第七次导致不再调用 key hook 并且发生缓冲区问题。

编辑更新 4:更多测试(在工作中)。在第三次转换到窗口模式后,关键挂钩肯定会被删除。它根本不再在 key hook 方法内部打印,并且无论按下什么键,都不会触发断点。我想我将就此提出一个单独的问题,因为我上面描述的所有其他问题只是这个关键钩子没有调用 ToggleFullscreen() 的后果。作为参考,我在下面提供了关键挂钩代码。

printf 语句显示,直到第 6 次 Alt+Enter 之后才调用键挂钩。这是第三次进入窗口模式。正如我之前所想的那样,我没有必要第四次全屏显示问题。MyClassVar 调用的所有方法都是内联的,以使键挂钩尽可能快地运行,因为我知道 Windows 键挂钩有超时。Alt+Enter 的实际处理由 MyClass 中的一个线程处理。

另外,有人可以使它不是社区维基吗?我认为这个问题太具体了,不能用作维基。它成为一个的唯一原因是我一直在通过编辑定期更新它。

0 投票
2 回答
3673 浏览

windows - 剪辑光标不工作

我正在开发 DX11 游戏,我想在全屏模式下将光标剪辑到全屏窗口。我用这个方法

但是,当我使用 2 台显示器处于全屏模式时,我仍然可以将鼠标移到另一台显示器上。在全屏模式下将分辨率设置为 2048x1152,我得到的窗口矩形为 1360x768,这就是它被剪裁的内容。我确认它是使用 GetClippedRect 剪辑的。

所以我有两个问题:

1) 为什么鼠标没有被剪辑到我的窗口所在的监视器上?

2) 当我知道显示器是 2048x1152 并且我将分辨率设置为 2048x1152 时,为什么窗口矩形测量为 1360x768?

0 投票
0 回答
1656 浏览

c# - 如何在 SlimDX / DirectX11 中设置视图/世界矩阵

我正在尝试在 SlimDX.Direct3D11 中实现一个简单的 FPS 相机,它是我从旧 XNA 项目中带来的。我不知道如何设置结果视图矩阵或任何矩阵。

我发现的所有教程都使用了 C++ 和 SlimDX 中没有的函数或类。有谁知道比 SlimDX 主页上的三个例子更多的例子吗?

这是我的顶点着色器

并加载它们

0 投票
2 回答
12895 浏览

directx - 如何在 MinGW 中编译 DirectX 11 应用程序

我看过了,但找不到任何与将 Direct3d 10 或 11 与 MinGW 一起使用的材料。我必须做些什么才能让事情正常进行?我在 DX SDK 提供的头文件中遇到错误。

甚至没有人想到建议 Visual Studio。

0 投票
2 回答
1863 浏览

c++ - 为什么我的低级 Windows 键挂钩停止工作?

这是我最初的问题的延续, 为什么在我的 DX11 游戏期间加载了 D3D10SDKLayers.dll?我正在创建一个 DX11 游戏,并使用低级别的 windows 键挂钩来捕获 Alt+Enter,以便我可以使用自己的方法切换全屏,而不是让 Windows 自动执行,这不可避免地会导致问题。链接问题中提供了此过程和详细信息的描述。我的问题是,由于某种原因,在第 6 次 Alt+Enter 之后,关键挂钩始终停止工作。我自己并没有取消注册。

这是关键的钩子代码:

如果您需要更多信息,请告诉我需要什么。我不知道为什么会这样,所以我不确定我需要提供什么样的信息。据我所知,除了显式取消注册之外,摆脱密钥挂钩的唯一方法是如果 Windows 超时。所有 MyClassVar 方法都是内联的,以尽可能快,并且 Alt+Enter 是从单独的线程处理的。

0 投票
2 回答
331 浏览

directx - 相机异常行为,DX11

我一直在使用directx11 编写程序,并且编写了一个基本的相机类来操作视图矩阵。当我测试程序时,结果是场景没有移动,但是当我移动相机时,它具有切断任意位置可见的效果。我附上了一些图片来说明我的意思。

我现在让我的像素着色器只输出红色像素。

我的顶点着色器基于 SDK 示例:

cbuffer cbChangeOnResize : register(b1) { matrix Projection; };

几天来我一直在为这个问题挠头,但我不知道是什么原因造成的,甚至不知道哪些代码是相关的。PIX 显示世界、视图和投影矩阵似乎存在并且正在被应用,尽管很明显有些事情是不正确的。

谢谢你。

0 投票
1 回答
2157 浏览

c++ - 如何将鼠标移动转换为相机平移

我使用 DirectX3D 11 编写应用程序,我的相机目标矢量由变量 xdelta、ydelta 和 zdelta 确定。

当我按下 RMB 和 LMB 在屏幕上移动鼠标时,我必须在 XY 中平移我的视图。

我想我需要将鼠标移动中的增量添加到我的 VIEW 空间,以便它相对于我的视图在 X 和 Y 中平移,而不是在世界 X 和 Y 中平移。

但是,作为新手,我不确定如何将 VIEW 坐标转换回 WORLD 坐标。

我希望我遵守所有格式规则,因为我在这里发帖的内容不足以准确记住所有这些规则。

任何帮助,将不胜感激。下面是我的代码片段。也许还有更好的方法。

我正在尝试一种不同的方法,我认为这是正确的方法,但它似乎仍然无法正常工作。当鼠标移动时,我从屏幕上获取 X 和 Y 的增量并将它们存储在变量“xdelta”和“ydelta”中。

然后我创建一个转换矩阵

然后我填充矩阵中的值

现在要获得它们对应的 View 坐标,我想我应该将它乘以 View Matrix,我称之为 mView。

现在将这些转换后的值添加到由变量“target_x”和“target_y”确定的当前目标 X 和 Y,它应该相对于我的视图坐标 X 和 Y(即与我的当前视图正交)移动我的目标向量。

但事实并非如此。它沿着世界 X 和 Y 轴移动我的目标,而不是我的视图 X 和 Y 轴。

更多片段

我确实使用了 D3DXMatrixLookAtLH 函数,但我试图根据我的鼠标移动计算目标位置的变化,以获取新目标以输入该函数。我添加了一些代码片段:

首先,感谢您提供的所有信息。它帮助我慢慢理解 DirectX 矩阵。我在下面的逻辑中正确吗?假设我的鼠标在屏幕上的 X 方向为 5.0,Y 方向为 5.0。那是我的三角洲。Z 始终为 0.0。我可以找到如下视图坐标。

我现在应该将 XY 增量的视图坐标存储在 mTemp 视图矩阵中吗?

如果是这样,最好的方法是通过将 XY delta View 坐标添加到 mView XY 坐标然后转换回世界坐标,以获得我必须将目标设置为的实际 XY 世界值?

我不知道如何实现这一目标。这对我来说真的不是那么清楚,我购买的关于这个主题的所有书籍也不是很清楚。