C++ 多网格转换-HLSL

C++ 多网格转换-HLSL,c++,directx,hlsl,C++,Directx,Hlsl,好吧,请原谅我说的有点含糊,但我整晚都在忙着编写代码 我有一个相当大和定义的地形,并进行了最小的优化,我刚刚开始引入预定义的网格(.X对象),这些网格随材质和纹理一起提供。之前,我使用的是固定函数管道方法,因为我最近才开始使用DirectX9。很明显,FFP在DirectX10中是老派的,不受欢迎,所以我一直在将相关代码迁移到使用HLSL方法 在最初的方法中,我将模型加载到模型的std::vector容器中,并创建了另一个std::vector对象,其中包含要显示的模型的引用。在我的渲染循环中,

好吧,请原谅我说的有点含糊,但我整晚都在忙着编写代码

我有一个相当大和定义的地形,并进行了最小的优化,我刚刚开始引入预定义的网格(.X对象),这些网格随材质和纹理一起提供。之前,我使用的是固定函数管道方法,因为我最近才开始使用DirectX9。很明显,FFP在DirectX10中是老派的,不受欢迎,所以我一直在将相关代码迁移到使用HLSL方法

在最初的方法中,我将模型加载到模型的std::vector容器中,并创建了另一个std::vector对象,其中包含要显示的模型的引用。在我的渲染循环中,我会迭代这个容器并检查对象是否在我相机的视野内。如果是这样,我将首先使用SetTransform()调用将网格转换到它们的位置,然后使用DrawSubset()

然而,很明显SetTransform()不适用于HLSL方法;因此,我有点困惑于如何将这些网格预转换到它们的相关位置,或者是否应该在顶点着色器中转换它们。网格存储在ID3DXMESH类型中,似乎可以访问这些网格的索引和顶点缓冲区;我应该把这些缓冲区的内容翻译出来然后画出来吗?还是我真的走错了路

我熟悉顶点缓冲区方法,但不确定网格本身中的顶点格式

任何帮助都将不胜感激,因为我马上就要把我的眼球挖出来了

编辑

我将接受Sergio的回答,因为它将我推向了正确的方向,尽管当我在调试输出中意识到一行关于提交更改时,解决方案出现了

解决方案

转换网格后,我需要调用
g_pEffect->CommitChanges()

如前所述,您应该在顶点着色器上进行平移,如果着色器中有worldViewProjection矩阵常数,则需要将顶点位置乘以该矩阵,并在移动到像素着色器之前返回输出上的变换位置

确保你通过视图和投影传递的世界变换不仅仅是一个标识,因为它根本不会变换顶点

这是一个关于如何在顶点着色器上实现这一点的示例,该着色器实质上是将传入的未转换顶点位置乘以worldViewProj矩阵

VS_OUTPUT vs_main( float4 inPos: POSITION )
{ 
  VS_OUTPUT output;

  output.pos = mul( inPos, g_worldViewProj );

  return output; 
}

我没有足够的DirectX API知识来完全回答您的问题。但是是的,通常在顶点着色器中进行变换。将WorldViewProjection变换矩阵作为着色器常数传递到着色器中。感谢Andrew的回复。是的,我将WorldViewProjection矩阵传递到我的着色器中,我正在使用它进行照明/着色计算。然而,我正在努力解决的是,我的网格都是以原点0,0,0进行预转换的。我真的不想说1000棵树都卡在0,0,0,这是我搬到HLSL后得到的;因为我无法在DrawSubset()调用之间执行SetTransform()调用。所以我一辈子都搞不懂如何把它们从物体空间转换成世界空间;理想情况下,我想在初始化阶段预先翻译所有的内容。杰伊,我在过去的一个小时里遇到了同样的问题。谢谢你弄明白了!我正在学习两个教程,但都没有提到佣金:/No problem:)很高兴我的麻烦帮了你!嘿,你可能在那里找到了什么:)我使用身份矩阵作为我的风景和skybox的预翻译,因为这在生成过程中很容易做到。我想你可能已经帮我搞定了Sergio:)谢谢Sergio,我已经有了这样做的代码;但是你提到身份矩阵已经在我脑海中敲响了警钟,为什么它不起作用!!:)但仍然不起作用,我正是这样做的,在我的树绘制循环中设置effect参数,因为每棵树都有一个矩阵要转换,以便转换为世界空间;即使在渲染循环的顶部,我的世界矩阵被设置回它应该是的样子,但我最终还是得到了1000棵树的0,0,0。