# 3D ## Links * [DirectX10 Tutorial 8: Lighting Theory and HLSL](http://takinginitiative.wordpress.com/2010/08/30/directx-10-tutorial-8-lighting-theory-and-hlsl/) * [Forward Rendering vs. Deferred Rendering](http://gamedevelopment.tutsplus.com/articles/forward-rendering-vs-deferred-rendering--gamedev-12342) * [Deferred Shading in Tabula Rasa](http://http.developer.nvidia.com/GPUGems3/gpugems3_ch19.html) ## Matrix Projection = Float4x4.CreatePerspectiveFieldOfView(fieldOfView, aspectRatio, nearPlaneDistance, farPlaneDistance); View = Float4x4.CreateLookAt(cameraPosition, cameraTarget, cameraUpVector); World = Float4x4.CreateWorld(position, forward, up); ViewProjection = View * Projection; WorldViewProjection = World * ViewProjection; effect.WorldViewProj = WorldViewProjection; ### CreatePerspectiveFieldOfView public static Float4x4 CreatePerspectiveFieldOfView(float fieldOfView, float aspectRatio, float nearPlaneDistance, float farPlaneDistance) { Float4x4 matrix; if ((fieldOfView <= 0f) || (fieldOfView >= 3.141593f)) { throw new ArgumentOutOfRangeException("fieldOfView", string.Format(CultureInfo.CurrentCulture, FrameworkResources.OutRangeFieldOfView, new object[] {"fieldOfView"})); } if (nearPlaneDistance <= 0f) { throw new ArgumentOutOfRangeException("nearPlaneDistance", string.Format(CultureInfo.CurrentCulture, FrameworkResources.NegativePlaneDistance, new object[] {"nearPlaneDistance"})); } if (farPlaneDistance <= 0f) { throw new ArgumentOutOfRangeException("farPlaneDistance", string.Format(CultureInfo.CurrentCulture, FrameworkResources.NegativePlaneDistance, new object[] {"farPlaneDistance"})); } if (nearPlaneDistance >= farPlaneDistance) { throw new ArgumentOutOfRangeException("nearPlaneDistance", FrameworkResources.OppositePlanes); } float num = 1f/((float) Math.Tan((fieldOfView*0.5f))); float num9 = num/aspectRatio; matrix.M11 = num9; matrix.M12 = matrix.M13 = matrix.M14 = 0f; matrix.M22 = num; matrix.M21 = matrix.M23 = matrix.M24 = 0f; matrix.M31 = matrix.M32 = 0f; matrix.M33 = farPlaneDistance/(nearPlaneDistance - farPlaneDistance); matrix.M34 = -1f; matrix.M41 = matrix.M42 = matrix.M44 = 0f; matrix.M43 = (nearPlaneDistance*farPlaneDistance)/(nearPlaneDistance - farPlaneDistance); return matrix; } ### CreateLookAt public static Float4x4 CreateLookAt(Float3 cameraPosition, Float3 cameraTarget, Float3 cameraUpVector) { Float4x4 matrix; var vector = Float3.Normalize(cameraPosition - cameraTarget); var vector2 = Float3.Normalize(Float3.Cross(cameraUpVector, vector)); var float3 = Float3.Cross(vector, vector2); matrix.M11 = vector2.X; matrix.M12 = float3.X; matrix.M13 = vector.X; matrix.M14 = 0f; matrix.M21 = vector2.Y; matrix.M22 = float3.Y; matrix.M23 = vector.Y; matrix.M24 = 0f; matrix.M31 = vector2.Z; matrix.M32 = float3.Z; matrix.M33 = vector.Z; matrix.M34 = 0f; matrix.M41 = -Float3.Dot(vector2, cameraPosition); matrix.M42 = -Float3.Dot(float3, cameraPosition); matrix.M43 = -Float3.Dot(vector, cameraPosition); matrix.M44 = 1f; return matrix; } ### CreateWorld public static Float4x4 CreateWorld(Float3 position, Float3 forward, Float3 up) { Float4x4 matrix; var vector = Float3.Normalize(-forward); var vector2 = Float3.Normalize(Float3.Cross(up, vector)); var float3 = Float3.Cross(vector, vector2); matrix.M11 = vector2.X; matrix.M12 = vector2.Y; matrix.M13 = vector2.Z; matrix.M14 = 0f; matrix.M21 = float3.X; matrix.M22 = float3.Y; matrix.M23 = float3.Z; matrix.M24 = 0f; matrix.M31 = vector.X; matrix.M32 = vector.Y; matrix.M33 = vector.Z; matrix.M34 = 0f; matrix.M41 = position.X; matrix.M42 = position.Y; matrix.M43 = position.Z; matrix.M44 = 1f; return matrix; }