コード例 #1
0
        // PCF Map zeichnen
        private void DrawPCFMap(Effect effect, ShaderModel shaderModel, Light light, RenderTarget2D shadowMapTexture)
        {
            ICamera camera = (ICamera)Services.GetService(typeof(ICamera));

            // Kameramatrizen übergeben
            effect.Parameters["View"].SetValue(camera.ViewMatrix);
            effect.Parameters["Projection"].SetValue(camera.ProjectionMatrix);

            // Lichtview und -projection übergeben
            effect.Parameters["LightView"].SetValue(light.ViewMatrix);
            effect.Parameters["LightProjection"].SetValue(light.ProjectionMatrix);

            // Shadow Map übergeben
            effect.Parameters["ShadowMapLight0Texture"].SetValue(shadowMapTexture);
            effect.Parameters["ShadowMapSize"].SetValue(shadowMapSize);

            foreach (ModelMesh mesh in shaderModel.DrawingModel.Meshes)
            {
                foreach (ModelMeshPart part in mesh.MeshParts)
                {
                    part.Effect = effect;
                    part.Effect.CurrentTechnique = part.Effect.Techniques["PCFMap"];

                    effect.Parameters["World"].SetValue(mesh.ParentBone.Transform * shaderModel.WorldMatrix);
                }
                mesh.Draw();
            }
        }
コード例 #2
0
        // Shadow Map zeichnen
        private void DrawShadowMap(Effect effect, ShaderModel shaderModel, Light light)
        {
            // Lichtmatrizen übergeben
            effect.Parameters["View"].SetValue(light.ViewMatrix);
            effect.Parameters["Projection"].SetValue(light.ProjectionMatrix);

            foreach (ModelMesh mesh in shaderModel.DrawingModel.Meshes)
            {
                foreach (ModelMeshPart part in mesh.MeshParts)
                {
                    part.Effect = effect;
                    part.Effect.CurrentTechnique = part.Effect.Techniques["ShadowMap"];
                    effect.Parameters["World"].SetValue(mesh.ParentBone.Transform * shaderModel.WorldMatrix);
                }
                mesh.Draw();
            }
        }
コード例 #3
0
        // Prüfen ob eine Kollision mit einem Model vorliegt
        // (Keine Abbruchbedingung damit alle getroffenen Dreiecke gefunden werden)
        private void CheckRayCollisionAgainstModel(ShaderModel model)
        {
            // Test ob der Strahl die BoundingSphere trifft
            if (ray.Intersects(model.MeshBoundingSphere[0]) != null)
            {
                // Durch die Indizes der Model-Dreiecke iterieren
                for (int i = 0; i < model.IndexData.Length; i += 3)
                {
                    // Holen der drei Vertices
                    Vector3 p1 = model.VertexData[model.IndexData[i]].Position;
                    Vector3 p2 = model.VertexData[model.IndexData[i + 1]].Position;
                    Vector3 p3 = model.VertexData[model.IndexData[i + 2]].Position;

                    // Die vom Dreieck aufgespannte Plane erzeugen
                    Plane plane = new Plane(p1, p2, p3);
                    // Distanz bis zum Auftreffen des Strahles auf der Plane ermitteln
                    // NULL wenn kein Schnittpunkt gefunden wird
                    float? distance = ray.Intersects(plane);

                    // Wenn ein Schnittpunkt auf der Plane gefunden wurde
                    if (distance != null)
                    {
                        // Den Kollisionspunkt auf der Plane ermitteln
                        Vector3 intersectionPoint = ray.Position + ray.Direction * (float)distance;

                        // Prüfen ob der Kollisionspunkt im Model-Dreieck liegt
                        if (PointIsInsideTriangle(intersectionPoint, p1, p2, p3))
                        {
                            // Wurde noch kein Kollisionspunkt gefunden oder ist der Kollisionspunkt näher als der bisherige,
                            // dann wird dieser gesetzt
                            if (rayCollisionPoint == Vector3.Zero ||
                                (intersectionPoint - ray.Position).LengthSquared() < (rayCollisionPoint - ray.Position).LengthSquared())
                            {
                                rayCollisionPoint = intersectionPoint;
                                rayCollisionDistance = distance;
                            }
                        }
                    }
                }
            }
        }