cbuffer PerFrameBuffer { float4x4 gWorldViewProj; }; PixelInputType VS(VertexInputType input) { PixelInputType output; // Change the position vector to be 4 units for proper matrix calculations. input.position.w = 1.0f; // Calculate the position of the vertex against the world, view, and projection matrices. output.position = mul(float4(input.position.xyz, 1.0f), gWorldViewProj); // Store the texture coordinates for the pixel shader. output.tex = input.tex; return output; }

XMMATRIX worldViewProj = world * camera->View() * camera->Proj(); mTextureEffect->mfxWorldViewProj->SetMatrix(reinterpret_cast<float*>(&(worldViewProj)));

XMMATRIX Camera::View()const { return XMLoadFloat4x4(&mView); } void Camera::UpdateViewMatrix() { XMVECTOR R = XMLoadFloat3(&mRight); XMVECTOR U = XMLoadFloat3(&mUp); XMVECTOR L = XMLoadFloat3(&mLook); XMVECTOR P = XMLoadFloat3(&mPosition); // Keep camera's axes orthogonal to each other and of unit length. L = XMVector3Normalize(L); U = XMVector3Normalize(XMVector3Cross(L, R)); // U, L already ortho-normal, so no need to normalize cross product. R = XMVector3Cross(U, L); // Fill in the view matrix entries. float x = -XMVectorGetX(XMVector3Dot(P, R)); float y = -XMVectorGetX(XMVector3Dot(P, U)); float z = -XMVectorGetX(XMVector3Dot(P, L)); XMStoreFloat3(&mRight, R); XMStoreFloat3(&mUp, U); XMStoreFloat3(&mLook, L); mView(0,0) = mRight.x; mView(1,0) = mRight.y; mView(2,0) = mRight.z; mView(3,0) = x; mView(0,1) = mUp.x; mView(1,1) = mUp.y; mView(2,1) = mUp.z; mView(3,1) = y; mView(0,2) = mLook.x; mView(1,2) = mLook.y; mView(2,2) = mLook.z; mView(3,2) = z; mView(0,3) = 0.0f; mView(1,3) = 0.0f; mView(2,3) = 0.0f; mView(3,3) = 1.0f; }