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