// 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(); } }
// 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(); } }
// 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; } } } } } }