【问题标题】:Direct3d and hlsl varying size vertices and multiddimensional geometric objects?Direct3d 和 hlsl 不同大小的顶点和多维几何对象?
【发布时间】:2023-05-27 06:08:01
【问题描述】:

我是 direct3d、图形、HLSL、c++ 的新手,我正在尝试编写一个程序来渲染不同的几何多维形状(例如超立方体),该程序应该在用户已定义尺寸、绘制、旋转和平移形状。

  • 第一个问题是如何定义一个动态的顶点结构(用指针可以吗)。

  • 第二:将形状从x维空间投影到3维空间的位置,我应该在代码(CPU)中这样做,还是可以将对象顶点和投影矩阵传递给着色器( HLSL)以及如何(尤其是在运行时定义的矩阵大小不同)。

  • 与上述视图矩阵的问题相同(假设对象是 4-d 我希望程序放大/缩小-> 接近,或在 4-d 空间中沿 x 方向移动“我想处理对象的空间而不是投影的空间")

  • 第三:如果上述所有方法在着色器中都不可能,我可以使用 c++amp(或它的替代方法)来加速主程序中此类操作的执行,否则会导致性能下降“Draw()”函数。

我搜索了网络和“*”,但找不到任何有用的东西。

【问题讨论】:

  • 如果您将问题分解为单个问题,您可能会得到更好的回答。但是 FWIW,我很确定你不能在着色器中使用指针。
  • @LarsH 谢谢你的评论 我不能把它分解成单个问题,因为它们都是相关的,以上所有问题都源于同一个来源,这是对超-维度对象,还有很多“堆栈溢出”成员倾向于将实际问题视为非建设性问题或其他问题,将上述问题分为两个,一个涉及顶点,另一个涉及着色器很可能会关闭问题.
  • 还有一件事:如果我不能将不同长度的顶点传递给着色器并且我想旋转超立方体,我应该旋转它的 4-d 顶点,将结果投影到 3-d 空间并重新注册每一帧的顶点?这不会导致性能大幅下降吗?

标签: c++ graphics hlsl direct3d11


【解决方案1】:

免责声明:我不是 GPU 和着色器方面的专家;我使用的是 OpenGL/WebGL/GLSL 而不是 Direct3D/HLSL。所以我只回答这个问题,因为没有其他人有。 :-)

关于指针:我很确定您不能在 GPU 中使用指针,因为您发送到 GPU 的数据将在 GPU 内存中具有不可预测的地址(位置)。

但是关于动态数据结构(可变维数),您似乎可以通过更改传递给vertexAttribPointer() 或等效参数的“大小”参数来做到这一点。你传入一个包含所有顶点坐标的平面数组,每个顶点有 n 个坐标;并使用 size 参数告诉着色器 n 是什么。

然后在顶点着色器中,您可以使用您在着色器中根据传入的参数构造的投影矩阵将数据从 n 维投影到 3。

我认为类似地,在片段(像素)着色器中,您可以使用您在着色器中根据传入的参数构造的视图矩阵将数据从 3 维投影到 2 维。

希望这能让您入门,这样您就可以提出更具体的问题。老实说,我还没有发现 SO 是一个像 Python 等其他主题那样高效地回答有关图形问题的地方。在特定于 Direct3D 的网站上提问可能会更好。

【讨论】:

  • 谢谢,这对我帮助很大。