Direct3d 和 hlsl 不同大小的顶点和多维几何对象?
Posted
技术标签:
【中文标题】Direct3d 和 hlsl 不同大小的顶点和多维几何对象?【英文标题】:Direct3d and hlsl varying size vertices and multiddimensional geometric objects? 【发布时间】:2013-05-02 23:22:59 【问题描述】:我是 direct3d、图形、HLSL、c++ 的新手,我正在尝试编写一个程序来渲染不同的几何多维形状(例如超立方体),该程序应该在用户已定义尺寸、绘制、旋转和平移形状。
第一个问题是如何定义一个动态的顶点结构(用指针可以吗)。
第二:将形状从x维空间投影到3维空间的位置,我应该在代码(CPU)中这样做,还是可以将对象顶点和投影矩阵传递给着色器( HLSL)以及如何(尤其是在运行时定义的矩阵大小不同)。
与上述视图矩阵的问题相同(假设对象是 4-d 我希望程序放大/缩小-> 接近,或在 4-d 空间中沿 x 方向移动“我想处理对象的空间而不是投影的空间")
第三:如果上述所有方法在着色器中都不可能,我可以使用 c++amp(或它的替代方法)来加速主程序中此类操作的执行,否则会导致性能下降“Draw()”函数。
我搜索了网络和“***”,但找不到任何有用的东西。
【问题讨论】:
如果您将问题分解为单个问题,您可能会得到更好的回答。但是 FWIW,我很确定你不能在着色器中使用指针。 @LarsH 谢谢你的评论 我不能把它分解成单个问题,因为它们都是相关的,以上所有问题都源于同一个来源,这是对超-维度对象,还有很多“堆栈溢出”成员倾向于将实际问题视为非建设性问题或其他问题,将上述问题分为两个,一个涉及顶点,另一个涉及着色器很可能会关闭问题. 还有一件事:如果我不能将不同长度的顶点传递给着色器并且我想旋转超立方体,我应该旋转它的 4-d 顶点,将结果投影到 3-d 空间并重新注册每一帧的顶点?这不会导致性能大幅下降吗? 【参考方案1】:免责声明:我不是 GPU 和着色器方面的专家;我使用的是 OpenGL/WebGL/GLSL 而不是 Direct3D/HLSL。所以我只回答这个问题,因为没有其他人有。 :-)
关于指针:我很确定您不能在 GPU 中使用指针,因为您发送到 GPU 的数据将在 GPU 内存中具有不可预测的地址(位置)。
但是关于动态数据结构(可变维数),您似乎可以通过更改传递给vertexAttribPointer()
或等效参数的“大小”参数来做到这一点。你传入一个包含所有顶点坐标的平面数组,每个顶点有 n 个坐标;并使用 size 参数告诉着色器 n 是什么。
然后在顶点着色器中,您可以使用您在着色器中根据传入的参数构造的投影矩阵将数据从 n 维投影到 3。
我认为类似地,在片段(像素)着色器中,您可以使用您在着色器中根据传入的参数构造的视图矩阵将数据从 3 维投影到 2 维。
希望这能让您入门,这样您就可以提出更具体的问题。老实说,我还没有发现 SO 是一个像 Python 等其他主题那样高效地回答有关图形问题的地方。在特定于 Direct3D 的网站上提问可能会更好。
【讨论】:
谢谢,这对我帮助很大。以上是关于Direct3d 和 hlsl 不同大小的顶点和多维几何对象?的主要内容,如果未能解决你的问题,请参考以下文章
[ZZ] A Proposal For Compiling Direct3D HLSL With LLVM (Written by Michael Larabel )