问题标签 [directxmath]
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.
c++ - 使用 auto 关键字时不遵守对齐 16?
使用 VS2012 编译并使用 DirectXMath 库时,我遇到了一个问题,编译器似乎没有对齐我的 XMMATRIX。我将问题简化为以下内容。
一遍又一遍地重新运行代码有时会在第一次转置时导致“访问冲突读取位置 0xFFFFFFFF”,有时在第二次。
我发现这是因为 m1 和 m2 没有正确对齐。用“XMMATRIX”替换“auto”似乎可以解决问题,所以我怀疑是编译器错误,但也有可能我做错了什么,或者没有启用某些选项。
我的代码有问题还是编译器错误?
c++ - 如何使用 std::accumulate 巧妙地将单独定义的索引指向的向量中的值相加(替换循环)
我想知道是否有一种更简洁(或更好,更有效)的方法来求和向量/(不对称)矩阵的值(具有对称结构的矩阵,当然可以在循环中利用,但与我的无关问题)由一组索引指向。基本上,此代码可用于计算通过 2D 矩阵的路线的成本。我正在寻找一种利用 CPU 而不是 GPU 的方法。
这是一些相关的代码,我更感兴趣的是第一个案例。我在想可以使用std::accumulate
lambda 来捕获索引向量,但后来我想知道,是否已经有一种更简洁的方法,也许还有其他一些运算符。循环不是“真正的问题”,因为我的口味也很清楚,但是在寻找超级整洁或更高效的在线...
编辑
作为事后的想法和对 John 的评论,由于输入和输出类型可能不同,是否有地方在计算中使用std::common_type ?这有点像挥手,更像是学习技术和图书馆。代码 kata的一种形式,如果你愿意的话。
编辑 2
现在,有一个选项可以使循环更快,博主 theowl84 在博客中解释了如何使用SSE 代码处理 STL 向量。代码使用,但我想知道DirectXMath库中是否也有一些东西。__m128 directly
编辑 3
现在,在编写了一些具体代码之后,我发现std::accumulate
不会让我走得太远。或者至少我找不到以简洁的方式完成该[indices[i + 1]
部分的方法,因为它本身只能访问当前值和总和。从这个角度来看,novocrat 的方法似乎是最富有成效的方法。matrix[indices[i]][indices[i + 1]];
std::accumulate
DeadMG建议使用带有关联性警告的parallel_reduce , novocrat进一步评论。我没有去看看是否可以使用parallel_reduce,因为界面看起来有点麻烦,无法快速尝试。除此之外,即使我的代码是串行执行的,它也会遇到与并行缩减版本相同的浮动问题。虽然并行版本会/可能比串行版本更不可预测,我认为。
这有点切题,但这里的一些绊脚石可能会感兴趣,对于那些已经读过这篇文章的人来说,可能对NAG 博客中的Wandering Precision文章(非常)感兴趣,其中详细介绍了一些甚至由硬件指令引入的复杂问题重新订购!然后在#AltDevBlogADay Synchronous RTS Engines and a Tale of Desyncs中对分布式设置中的这个问题进行了一些反思。此外,ACCU(顺便说一下,通用邮件列表非常好,并且可以免费加入)包含几篇关于浮点精度的文章(例如this )。切线切线,我发现了Fernando Cacciola在几何计算中的鲁棒性问题 成为一篇好文章,最初来自 ACCU 邮件列表。
然后是std::common_type
. 我找不到那个用途。如果我有两种不同的类型作为参数,那么返回值可以/应该由std::common_type
. 也许更相关的是std::is_convertible
确保static_assert
所需的结果类型可从参数类型转换(带有干净的错误消息)。除此之外,我只能检查返回值/中间计算值的准确性是否足以表示求和的结果而不会出现溢出等问题,但我还没有遇到过这样的标准工具。
我想,女士们,先生们,关于这一点。我玩得很开心,我希望阅读这篇文章的人也能从中有所收获。
windows-8 - Windows 商店应用程序编程中 3d 向量的分量乘法
如何对两个 3d 向量进行分量乘法?似乎MS在DirectXMath.h中没有提供这样的功能,微软在那里做什么?在旧的 SDK(DX 10/9)中,我可以直接将两个向量的乘积作为:
v3 = v1 * v2;
或将向量乘以标量,例如:
v2 = v1 * 1.0f;
但是现在,XMVECTOR 类型没有运算符 *,所以我不能这样做。所以我需要手动制作产品
v3 = (v1.x * v2.x + v1.y * v2.y + v1.z * v2.z);
虽然没有那么难,但我认为 DirectXMath 应该提供这样一个基本功能。
c++ - 使用 DirectXMath 中的 XMVECTOR 作为类成员仅在发布模式下会导致崩溃?
我一直在尝试使用 XMVECTOR 作为边界框的类成员,因为我做了很多计算,但我每帧只使用一次 XMFLOAT3,所以边界框有一种方法可以让我在 XMFLOAT3 中居中,否则它会停留在 XMVECTOR 中;该类使用 __declspec(align(16)) 进行删除,并在调试模式下工作。但是在发布模式下,它会在我将其设置为某些东西的瞬间崩溃:
每当我这样做时:
它崩溃了,给了我 0xC0000005:访问冲突读取位置 0x00000000。当我将它创建为指针时它也会崩溃:
这是构造函数:
同样,这在 Debug 模式下运行良好,但在 Release 中它崩溃了。Release 模式会发生什么变化而生成无效代码?除了将框对齐到 16 个字节之外,我还需要做其他事情吗?
directx - 如何转储 XMMATRIX 成员值?
有什么好方法可以转储 XMMATRIX 和 XMVECTOR 吗?
我想要DumpMatrix
喜欢的功能。
我检查了DirectMath.h
。并发现
如何(x, y, z, w)
从 __m128 中提取?
arm - 优化 ARM 的扫描线转换函数
下面的代码将一行从 8 位调色板格式转换为 32-RGBA。
在我尝试实现它之前,我想知道下面的代码是否适合使用Direct-Math或ARM Neon 内在函数或内联汇编进行优化。我第一次看文档并没有发现任何可以涵盖表查找部分的内容。
windows-8 - VS2010项目中的DirectXMath和Win8 SDK
我一直在 Visual Studio 2012 的引擎中工作,该引擎支持使用 Direct3D 9 和 Direct3D 11 进行渲染。但是我正在让一些新人来帮助该项目,他们更愿意在 Visual Studio 2010 上工作,因为那是他们的版本拥有和使用。所以我决定将项目转换为使用 VS2010 的 v100 平台工具集构建。
我快要让它工作了,但我不能包含 DirectXTK 和我正在使用的一些实用程序功能所必需的 DirectXMath.h。它是 Windows 8 SDK 的一部分并包含在 VS2012 中,但 VS2010 似乎没有找到它。
任何人都知道如何使用环境变量将其包含在内,以便它适用于团队中的每个人,并且也适用于 Win7?
谢谢。
c++ - Can not access 16-bit aligned members of std::vector?
I am struggling with STL vectors in C++. I was compiling my project for only x64 for a time (actually for months), and everything was working fine, when I remembered that I need this to work on x86 machines also (Win32 DirectX application). Of course, the compiler errors came up instantly, that 16-bit aligned structures will not be aligned if for example passed to a function (those are the XMVECTOR and XMMATRIX, and XMFLOATA structures). I resolved those with success, and got my program running again, until I tried to load those structures into std::vectors by push_back() and emplace_back(). I give a short example code to be clear:
That is my structure, and I try to load several Armatures into a vector, like:
Full code here: http://pastebin.com/6D1wF4Vh
I tried setting __declspec_align(16) to everything, tried filling out the vector with Armature* and do aligned_malloc in the new operator, but the program exits every time with an Access violation reading location 0xFFFFFFF sometimes in the vector.h on the push_back function, sometimes while initializing an XMVECTOR struct, etc.
Am I missing something trivial here? Then I would be very grateful if someone could point out the obvious, or for any help.
c++ - 16字节对齐问题
我正在使用DirectXMath
、创建XMMatrix
和XMVector
上课。
当我调用XMMatrixMultiply
它时,它会引发未处理的异常。
我在网上发现这是字节对齐的问题,因为DirectXMath
使用SIMD
的指令集会导致未对齐的堆分配。
建议的解决方案之一是使用XMFLOAT4X4
变量,然后XMMatrix
在需要时将它们更改为临时变量,但这不是 imo 最好和最快的解决方案。
另一个是使用_aligned_malloc
,但我不知道如何使用它。我从来不需要做任何内存分配,这对我来说是黑魔法。
另一个是超载new operator
,但他们没有提供任何信息如何做到这一点。
关于重载方法,我不使用new
创建XMMatrix
对象,因为我不使用它们作为指针。
在我决定将代码拆分为类之前,一切都很好。
我认为_alligned_malloc
解决方案在这里是最好的,但我不知道如何使用它,何时何地调用它。
directx - DirectXCollision - 有什么方法可以获取更多关于交叉路口的信息?
我一直在做一个简单的 3D 刚体模拟器,现在我需要处理对象之间的碰撞。到目前为止,将新的 DirectXMath 与 DirectXTK 的 SimpleMath 一起使用是一个巨大的帮助。
我一直在使用 DirectXCollision 库中的 BoundingBox 和 BoundingOrientedBox 类,它们非常适合确定两个对象是否相交,但除此之外不提供任何更多信息。我需要能够检索接触点和交点法线,以便正确计算刚体响应。
我的问题是 - 有没有办法使用 DirectX 库检索该信息,或者我应该学习它并实施我自己的方法?