C# Monogame/XNA/HLSL阴影贴图仅在玩家周围出现
我最近开始玩XNA的Monogame开源翻拍版。我当前的任务是编写一个简单的阴影贴图着色器。跟随之后,我的影子出现了。但有趣的是,只有在播放器摄像机所在的地方。当我在光线的半径之外时,相机周围没有光线,这很好,但是聚光灯的光线当然应该仍然存在。但事实并非如此。我的聚光灯的阴影和明亮的灯光只出现在玩家周围 正如我所说,我的HLSL代码与Riemer的完全相同,只是我在VertexShaderInput结构中编写了SV_位置,而不是POSITION0,因为MonoGame只支持Pixel-/Vertexshader 4.0及以上版本 我还觉得我的灯光视图/投影矩阵可能有点错误:C# Monogame/XNA/HLSL阴影贴图仅在玩家周围出现,c#,xna,shader,hlsl,monogame,C#,Xna,Shader,Hlsl,Monogame,我最近开始玩XNA的Monogame开源翻拍版。我当前的任务是编写一个简单的阴影贴图着色器。跟随之后,我的影子出现了。但有趣的是,只有在播放器摄像机所在的地方。当我在光线的半径之外时,相机周围没有光线,这很好,但是聚光灯的光线当然应该仍然存在。但事实并非如此。我的聚光灯的阴影和明亮的灯光只出现在玩家周围 正如我所说,我的HLSL代码与Riemer的完全相同,只是我在VertexShaderInput结构中编写了SV_位置,而不是POSITION0,因为MonoGame只支持Pixel-/Vert
Matrix lightsView = Matrix.CreateLookAt(lightPos, new Vector3(lightPos.X, lightPos.Y-1, lightPos.Z), new Vector3(0, 0, 1));
Matrix lightsProjection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45F), 1f, 1f, 10f);
我知道我的上方向向量不是朝上的;这是我让光从它的位置指向下的唯一方法,否则它总是指向0-10,即使我写了它,使用光的坐标,然后它会从光变成y-1-真的很奇怪
我真的希望有人知道这里发生了什么,这个问题让我在几天内无法在代码中执行任何其他操作
PS:这是我的渲染代码:
////In my Model-Class
private void DrawModel(string tech)
{
Matrix[] transforms = new Matrix[model.Bones.Count];
model.CopyAbsoluteBoneTransformsTo(transforms);
foreach (var mesh in model.Meshes)
{
foreach (ModelMeshPart part in mesh.MeshParts)
{
part.Effect = Game1.effect;
Matrix tempWorld = ((transforms[mesh.ParentBone.Index] * Matrix.CreateScale(scale)) * rotationMatrix) * Matrix.CreateTranslation(pos);
part.Effect.CurrentTechnique = part.Effect.Techniques[tech];
part.Effect.Parameters["xWorldViewProjection"].SetValue(tempWorld * Game1.camera.View * Game1.camera.Projektion);
part.Effect.Parameters["xTexture"].SetValue(textures[part]);
part.Effect.Parameters["xWorld"].SetValue(tempWorld);
part.Effect.Parameters["xLightPos"].SetValue(Game1.currentLevel.lightPos);
part.Effect.Parameters["xLightPower"].SetValue(Game1.currentLevel.lightPower);
part.Effect.Parameters["xAmbient"].SetValue(Game1.currentLevel.ambientPower);
part.Effect.Parameters["xLightsWorldViewProjection"].SetValue(tempWorld * Game1.currentLevel.lightsViewProjectionMatrix);
part.Effect.Parameters["xShadowMap"].SetValue(Game1.currentLevel.shadowMap);
}
mesh.Draw();
}
}
////In my Level-Class
public void Render()
{
var device = Game1.graphics.GraphicsDevice;
device.SetRenderTarget(renderTarget);
device.Clear(ClearOptions.Target | ClearOptions.DepthBuffer, Color.Black, 1.0f, 0);
DrawScene("ShadowMap");
device.SetRenderTarget(null);
shadowMap = (Texture2D)renderTarget;
device.Clear(ClearOptions.Target | ClearOptions.DepthBuffer, Color.Black, 1.0f, 0);
DrawScene("ShadowedScene");
}
private void DrawScene(string tech)
{
foreach (var model in models)
{
model.Render(tech);
}
}
以及灯光更新代码:
private void UpdateLightData()
{
ambientPower = 0.2f;
lightPos = new Vector3(-0.2F, 1.2F, 1.1F);
lightPower = 1.8f;
Matrix lightsView = Matrix.CreateLookAt(lightPos, new Vector3(lightPos.X, lightPos.Y-1, lightPos.Z), new Vector3(0, 0, 1));
Matrix lightsProjection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45F), 1f, 1f, 10f);
lightsViewProjectionMatrix = lightsView * lightsProjection;
}
解决了的。我把它改成了Xna,它成功了。