我是 direct3d、图形、HLSL、c++ 的新手,我正在尝试编写一个程序来渲染不同的几何多维形状(例如超立方体),该程序应该在用户已经定义了维数、绘制、旋转和平移形状。
第一个问题是如何定义一个动态的顶点结构(可以用指针吗)。
第二:在哪里将形状从 x 维空间投影到 3 维空间,我应该在代码 (CPU) 中这样做,还是可以将对象顶点和投影矩阵传递给着色器 ( HLSL)以及如果是如何(尤其是矩阵在运行时定义的大小不同)。
与上述 View 矩阵相同的问题(假设对象是 4-d 我希望程序放大/缩小-> 方法,或在 4-d 空间中沿 x 方向移动“我想处理对象的空间而不是投影的空间")
第三:如果在着色器中无法实现上述所有操作,我可以使用 c++amp(或其替代品)来加速主程序中此类操作的执行吗,或者这是否会导致性能下降“Draw()”函数。
我搜索了网络和“Stackoverflow”,但找不到任何有用的东西。
最佳答案
免责声明:我不是 GPU 和着色器方面的专家;我使用的是 OpenGL/WebGL/GLSL 而不是 Direct3D/HLSL。所以我只回答这个问题,因为没有其他人回答过。 :-)
关于指针:我很确定你不能在 GPU 中使用指针,因为你发送到 GPU 的数据在 GPU 内存中的地址(位置)是不可预测的。
但是关于动态数据结构(可变维数),您似乎可以通过改变传递给 vertexAttribPointer()
的“大小”参数来做到这一点。或等价物。您传入一个包含所有顶点坐标的平面数组,每个顶点有 n 个坐标;并使用大小参数告诉着色器 n 是什么。
然后在顶点着色器中,您可以使用从传入的参数在着色器中构建的投影矩阵将数据从 n 维投影到 3。
我认为类似地,在片段(像素)着色器中,您可以使用从传入的参数在着色器中构造的 View 矩阵将数据从 3 维投影到 2 维。
希望这能让您入门,这样您就可以提出更具体的问题。老实说,我发现 SO 不是一个像 Python 等其他主题一样高效的地方来回答有关图形的问题。在特定于 Direct3D 的网站上提问可能会更幸运。
关于c++ - Direct3d 和 glsl 不同大小的顶点和多维几何对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16349308/