Graphics 如何在XNA中消除灯光/阴影对我的模型的影响?

Graphics 如何在XNA中消除灯光/阴影对我的模型的影响?,graphics,model,3d,xna,game-engine,Graphics,Model,3d,Xna,Game Engine,我正在开发一个小游戏,我会画一个重复纹理的场地(土地)。我的问题是渲染结果。这给人的印象是,我的立方体周围的一切看起来都像一个光影。 是否可以在我的绘图功能中标准化灯光或删除阴影效果 对不起,我英语不好 这是一个屏幕截图,可以更好地理解我的问题。 这里是我的代码绘制函数(使用vertexbuffer实例化模型) 看起来您的法线计算不正确/没有法线。 法线是一个向量,它描述了光线在与顶点/多边形正交的情况下从该顶点/多边形反射的方向 蓝线是曲线上每个特定点的法线方向 在XNA中,可以计算顶点为

我正在开发一个小游戏,我会画一个重复纹理的场地(土地)。我的问题是渲染结果。这给人的印象是,我的立方体周围的一切看起来都像一个光影。 是否可以在我的绘图功能中标准化灯光或删除阴影效果

对不起,我英语不好

这是一个屏幕截图,可以更好地理解我的问题。

这里是我的代码绘制函数(使用vertexbuffer实例化模型)


看起来您的法线计算不正确/没有法线。

法线是一个向量,它描述了光线在与顶点/多边形正交的情况下从该顶点/多边形反射的方向

蓝线是曲线上每个特定点的法线方向

在XNA中,可以计算顶点为vert1、vert2和vert3的多边形的法线,如下所示:

Vector3 dir = Vector3.Cross(vert2 - vert1, vert3 - vert1);
Vector3 norm = Vector3.Normalize(dir);

在许多情况下,这是由建模软件自动完成的,因此不需要计算。但是,如果要在代码中创建多维数据集,则可能需要执行该计算。

问题在于所使用的多维数据集网格。法线是平均的,但我想你希望它们与立方体的面正交

必须使用总共24个顶点(每边4个),而不是8个顶点。每个角点将有3个顶点,它们的位置相同,但法线不同,每个相邻面对应一个顶点:

如果无法将FBX导出器配置为正确导出法线,只需创建自己的立方体网格:

var vertices = new VertexPositionNormalTexture[24];

// Initialize the vertices, set position and texture coordinates
// ...

// Set normals

// front face
vertices[0].Normal = new Vector3(1, 0, 0);
vertices[1].Normal = new Vector3(1, 0, 0);
vertices[2].Normal = new Vector3(1, 0, 0);
vertices[3].Normal = new Vector3(1, 0, 0);

// back face
vertices[4].Normal = new Vector3(-1, 0, 0);
vertices[5].Normal = new Vector3(-1, 0, 0);
vertices[6].Normal = new Vector3(-1, 0, 0);
vertices[7].Normal = new Vector3(-1, 0, 0);

// ...

你知道这是照明问题还是纹理问题吗?你用什么程序来设计模型?我使用Blender,是的,我是sur,不是纹理问题默认情况下Blender中的法线不平均。我鼓励您使用法线尝试修复模型。渲染视图是否显示平面或着色面?如果渲染视图中的面是平面的,则问题可能在于导出。啊,好的!我使用Blender生成一个模型(“fbx”),并在XNA项目中加载该模型之后。这意味着我可以在我的代码或Blender项目中更改灯光效果?可以尝试一下。对于搅拌机来说,这些都是非常奇怪的常态。有时它会平均共享边的法线,而实际上它应该具有正交法线。尝试在blender中选择整个立方体并点击P。这将分离所有面,并将为您提供更多正常的法线。另一种想法是,它可能会这样做,因为FBX导出器--但它会进行三角测量。如果上述操作不起作用,请尝试在blender中对立方体进行三角剖分,在编辑模式下选择“全部”,然后(CTRL+t),然后拆分:(P)这将删除我的UV贴图
var vertices = new VertexPositionNormalTexture[24];

// Initialize the vertices, set position and texture coordinates
// ...

// Set normals

// front face
vertices[0].Normal = new Vector3(1, 0, 0);
vertices[1].Normal = new Vector3(1, 0, 0);
vertices[2].Normal = new Vector3(1, 0, 0);
vertices[3].Normal = new Vector3(1, 0, 0);

// back face
vertices[4].Normal = new Vector3(-1, 0, 0);
vertices[5].Normal = new Vector3(-1, 0, 0);
vertices[6].Normal = new Vector3(-1, 0, 0);
vertices[7].Normal = new Vector3(-1, 0, 0);

// ...