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 不同大小的顶点和多维几何对象?的主要内容,如果未能解决你的问题,请参考以下文章

HLSL实现光照(计算顶点颜色)疑惑

[ZZ] A Proposal For Compiling Direct3D HLSL With LLVM (Written by Michael Larabel )

HLSL 分支规避

《逐梦旅程 WINDOWS游戏编程之从零开始》笔记6——Direct3D中的顶点缓存和索引缓存

为啥 HLSL 有语义?

WPF 像素着色器入门:使用 Shazzam Shader Editor 编写 HLSL 像素着色器代码