XNA4 DrawUserIndexedPrimitives中使用的顶点集不正确

XNA4 DrawUserIndexedPrimitives中使用的顶点集不正确,xna,xna-4.0,Xna,Xna 4.0,背景:我正在编写一个基于平铺的地形渲染器,它使用GPU光线投射渲染高度场。我的图形编码曾经是C++/OpenGL,但是我决定尝试C#/XNA4(ie DirectX9)作为一种学习体验 问题:对DrawUserIndexedPrimitives的调用似乎使用了以前调用中指定的顶点数组 详细信息: 平铺渲染器通过栅格化平铺边界框的背面来工作。像素着色器执行光线投射。绘制长方体的调用如下所示: private void RenderTile(GraphicsDevice device) {

背景:我正在编写一个基于平铺的地形渲染器,它使用GPU光线投射渲染高度场。我的图形编码曾经是C++/OpenGL,但是我决定尝试C#/XNA4(ie DirectX9)作为一种学习体验

问题:对DrawUserIndexedPrimitives的调用似乎使用了以前调用中指定的顶点数组

详细信息: 平铺渲染器通过栅格化平铺边界框的背面来工作。像素着色器执行光线投射。绘制长方体的调用如下所示:

private void RenderTile(GraphicsDevice device)
{
    device.DrawUserIndexedPrimitives(
        PrimitiveType.TriangleList, 
        this.BoundingBoxVertex, 0, 8, 
        this.BoundingBoxIndex, 0, 12);
}
并渲染边界框的线框:

private void RenderBoundingBox(GraphicsDevice d)
{
    d.DrawUserIndexedPrimitives(
        PrimitiveType.LineList, 
        this.BoundingBoxRenderVertex, 0, 8, // vertex format is different here, 
                                            // but the positions are the same.
        this.BoundingBoxRenderIndex, 0, 12);
}
这就产生了:

如果我们单独使用另一个瓷砖(整个地形为2x2瓷砖):

但是,如果同时渲染这两个对象,则边界框将被转置:

我假设我在XNA代码中犯了一个基本的错误,这导致使用前一个瓷砖的顶点渲染瓷砖,但我找不到它


同一组数据(a
float[]
)用于创建heightmap纹理和边界框,因此在边界框创建中似乎没有错误。

确定,找到问题。我在渲染过程中设置了效果参数(是的,这是一个基本错误)

原始代码:

    foreach (var pass in effect.CurrentTechnique.Passes)
    {
        pass.Apply();
        effect.Parameters["HeightTex"].SetValue(this.HeightTex);
        effect.Parameters["Eye"].SetValue(eyePosTile);
        effect.Parameters["World"].SetValue(this.TileMatrix);
        effect.Parameters["View"].SetValue(viewMatrix);
        effect.Parameters["TexToView"].SetValue(texToViewMatrix);
        effect.Parameters["Projection"].SetValue(projectionMatrix);
        effect.Parameters["LightDir"].SetValue(lightDirection);
        this.RenderTile(device);
    }
固定的:

    effect.Parameters["HeightTex"].SetValue(this.HeightTex);
    effect.Parameters["Eye"].SetValue(eyePosTile);
    effect.Parameters["World"].SetValue(this.TileMatrix);
    effect.Parameters["View"].SetValue(viewMatrix);
    effect.Parameters["TexToView"].SetValue(texToViewMatrix);
    effect.Parameters["Projection"].SetValue(projectionMatrix);
    effect.Parameters["LightDir"].SetValue(lightDirection);

    foreach (var pass in effect.CurrentTechnique.Passes)
    {
        pass.Apply();
        this.RenderTile(device);
    }

好的,找到问题了。我在渲染过程中设置了效果参数(是的,这是一个基本错误)

原始代码:

    foreach (var pass in effect.CurrentTechnique.Passes)
    {
        pass.Apply();
        effect.Parameters["HeightTex"].SetValue(this.HeightTex);
        effect.Parameters["Eye"].SetValue(eyePosTile);
        effect.Parameters["World"].SetValue(this.TileMatrix);
        effect.Parameters["View"].SetValue(viewMatrix);
        effect.Parameters["TexToView"].SetValue(texToViewMatrix);
        effect.Parameters["Projection"].SetValue(projectionMatrix);
        effect.Parameters["LightDir"].SetValue(lightDirection);
        this.RenderTile(device);
    }
固定的:

    effect.Parameters["HeightTex"].SetValue(this.HeightTex);
    effect.Parameters["Eye"].SetValue(eyePosTile);
    effect.Parameters["World"].SetValue(this.TileMatrix);
    effect.Parameters["View"].SetValue(viewMatrix);
    effect.Parameters["TexToView"].SetValue(texToViewMatrix);
    effect.Parameters["Projection"].SetValue(projectionMatrix);
    effect.Parameters["LightDir"].SetValue(lightDirection);

    foreach (var pass in effect.CurrentTechnique.Passes)
    {
        pass.Apply();
        this.RenderTile(device);
    }