Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Monogame/XNA/HLSL阴影贴图仅在玩家周围出现_C#_Xna_Shader_Hlsl_Monogame - Fatal编程技术网

C# Monogame/XNA/HLSL阴影贴图仅在玩家周围出现

C# Monogame/XNA/HLSL阴影贴图仅在玩家周围出现,c#,xna,shader,hlsl,monogame,C#,Xna,Shader,Hlsl,Monogame,我最近开始玩XNA的Monogame开源翻拍版。我当前的任务是编写一个简单的阴影贴图着色器。跟随之后,我的影子出现了。但有趣的是,只有在播放器摄像机所在的地方。当我在光线的半径之外时,相机周围没有光线,这很好,但是聚光灯的光线当然应该仍然存在。但事实并非如此。我的聚光灯的阴影和明亮的灯光只出现在玩家周围 正如我所说,我的HLSL代码与Riemer的完全相同,只是我在VertexShaderInput结构中编写了SV_位置,而不是POSITION0,因为MonoGame只支持Pixel-/Vert

我最近开始玩XNA的Monogame开源翻拍版。我当前的任务是编写一个简单的阴影贴图着色器。跟随之后,我的影子出现了。但有趣的是,只有在播放器摄像机所在的地方。当我在光线的半径之外时,相机周围没有光线,这很好,但是聚光灯的光线当然应该仍然存在。但事实并非如此。我的聚光灯的阴影和明亮的灯光只出现在玩家周围

正如我所说,我的HLSL代码与Riemer的完全相同,只是我在VertexShaderInput结构中编写了SV_位置,而不是POSITION0,因为MonoGame只支持Pixel-/Vertexshader 4.0及以上版本

我还觉得我的灯光视图/投影矩阵可能有点错误:

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,它成功了。