好的,请原谅我,如果这一点都很模糊,但我一整夜都试图赶上一些编码。
我有一个相当大且定义好的地形,并且具有最小的优化,我刚刚开始介绍带有材料和纹理的预定义网格(.X对象)。以前我一直在使用固定功能管道方法,因为我最近才开始使用DirectX9。很明显,FFP是老学校并且在DirectX10中被弃用,所以我一直在使用HLSL方法移动相关代码。
在我的初始方法中,我将模型加载到模型的std :: vector容器中,并创建了另一个std :: vector对象,其中包含对要显示的模型的引用。在我的渲染循环中,我会迭代这个容器并检查对象是否在我的相机的视野范围内。如果是这样,我首先使用SetTransform()调用,然后使用DrawSubset()将网格转换为它们的位置。
然而,很明显SetTransform()不适用于HLSL方法;因此我有点难以预测如何将这些网格预翻译到相关位置,或者我是否应该在顶点着色器中翻译它们。网格存储在ID3DXMESH类型中,似乎我可以访问这些网格的索引和顶点缓冲区;我应该采取这些缓冲区的内容,翻译内容然后绘制它们?或者我是否真的走错了路?
我熟悉Vertex Buffer方法,但不确定网格本身的顶点格式是什么。
任何帮助都会受到赞赏,因为我要撕掉我的眼球。
修改
我接受塞尔吉奥的回答,因为它推动了我朝着正确的方向发展,尽管当我在调试输出中意识到提交更改时,解决方案出现了。
解决方案
转换我的网格后,我需要调用 g_pEffect->的CommitChanges();
答案 0 :(得分:2)
如前所述,您应该在顶点着色器上进行平移,如果在着色器中有一个worldViewProjection矩阵常量,则需要将顶点位置乘以该矩阵并在输出之前返回输出的变换位置移动到像素着色器。
确保您使用视图传入世界变换,投影不仅仅是一个标识,因为它根本不会变换顶点。
这是一个关于如何在顶点着色器上实现此目的的示例,它实质上是将未转换的顶点位置乘以worldViewProj矩阵。
VS_OUTPUT vs_main( float4 inPos: POSITION )
{
VS_OUTPUT output;
output.pos = mul( inPos, g_worldViewProj );
return output;
}