Original Post
I'm learning DirectX 11 and I'm having trouble with the perspective divide. Specifically, the perspective transform is resulting in all my vertices getting clipped before rasterisation.
I'm testing with a 200x200 cube centered at the origin. You can see an image of the problem in PIX below

After the the w-divide my vertices lie wholly outside of clip space, but I can't see anything wrong with the matrices I'm passing to my shaders.
Setting up the viewport
[source lang="cpp"]const int windowWidth = 800, windowHeight = 600;
D3D11_VIEWPORT vp;
ZeroMemory(&vp, sizeof(vp));
vp.TopLeftX = D3D11_VIEWPORT_BOUNDS_MIN;
vp.TopLeftY = D3D11_VIEWPORT_BOUNDS_MIN;
vp.Width = (float)windowWidth;
vp.Height = (float)windowHeight;
vp.MinDepth = 0.0f;
vp.MaxDepth = 1.0f;
g_pImmediateDeviceContext->RSSetViewports(1, &vp);[/source]
Building the matrices
[source lang="cpp"]
VSConstants VSConstData;
D3DXMatrixIdentity(&VSConstData.world);
D3DXMatrixLookAtLH(&VSConstData.view, &eye, &lookAt, &up);
D3DXMatrixPerspectiveFovLH(&VSConstData.projection, toRadians(90.0f), (float)windowWidth / (float)windowHeight, 0.01f, 1000.0f);
VSConstData.worldViewProjection = VSConstData.world * VSConstData.view * VSConstData.projection;
D3DXMatrixInverse(&VSConstData.invWorldViewProjection, 0, &VSConstData.worldViewProjection);
g_pImmediateDeviceContext->UpdateSubresource(g_pVSConstants, 0, 0, &VSConstData, 0, 0);[/source]
and here is the contents of the constants buffer as reported by PIX

Vertex & pixel shaders
[source lang="cpp"]float4x4 world;
float4x4 view;
float4x4 projection;
float4x4 worldViewProjection;
float4x4 invWorldViewProjection;
Texture2D g_texture;
SamplerState defaultSampler
{
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
};
struct VSInput
{
float4 position : POSITION;
float3 normal : NORMAL;
float2 texcoord : TEXCOORD0;
};
struct PSInput
{
float4 position : SV_POSITION;
float3 normal : NORMAL;
float2 texcoord : TEXCOORD0;
};
PSInput VSDefault(VSInput input)
{
PSInput result;
result.position = mul(input.position, world);
result.position = mul(result.position, view);
result.position = mul(result.position, projection);
result.normal = input.normal;//mul(input.normal, invWorldViewProjection);
result.texcoord = input.texcoord;
return result;
}
float4 PSDefault(PSInput input) : SV_TARGET
{
return g_texture.Sample(defaultSampler, input.texcoord);
}[/source]
I have a feeling the problem is to do with my viewport settings as the post-vs output looks fine. It is only after clipping that I lose everything. Unfortunately I can't find much information on the appropriate values for the D3D11_VIEWPORT structure and trial and error has proven unsuccessful. Any idea what I'm doing wrong?
I'm testing with a 200x200 cube centered at the origin. You can see an image of the problem in PIX below

After the the w-divide my vertices lie wholly outside of clip space, but I can't see anything wrong with the matrices I'm passing to my shaders.
Setting up the viewport
[source lang="cpp"]const int windowWidth = 800, windowHeight = 600;
D3D11_VIEWPORT vp;
ZeroMemory(&vp, sizeof(vp));
vp.TopLeftX = D3D11_VIEWPORT_BOUNDS_MIN;
vp.TopLeftY = D3D11_VIEWPORT_BOUNDS_MIN;
vp.Width = (float)windowWidth;
vp.Height = (float)windowHeight;
vp.MinDepth = 0.0f;
vp.MaxDepth = 1.0f;
g_pImmediateDeviceContext->RSSetViewports(1, &vp);[/source]
Building the matrices
[source lang="cpp"]
VSConstants VSConstData;
D3DXMatrixIdentity(&VSConstData.world);
D3DXMatrixLookAtLH(&VSConstData.view, &eye, &lookAt, &up);
D3DXMatrixPerspectiveFovLH(&VSConstData.projection, toRadians(90.0f), (float)windowWidth / (float)windowHeight, 0.01f, 1000.0f);
VSConstData.worldViewProjection = VSConstData.world * VSConstData.view * VSConstData.projection;
D3DXMatrixInverse(&VSConstData.invWorldViewProjection, 0, &VSConstData.worldViewProjection);
g_pImmediateDeviceContext->UpdateSubresource(g_pVSConstants, 0, 0, &VSConstData, 0, 0);[/source]
and here is the contents of the constants buffer as reported by PIX

Vertex & pixel shaders
[source lang="cpp"]float4x4 world;
float4x4 view;
float4x4 projection;
float4x4 worldViewProjection;
float4x4 invWorldViewProjection;
Texture2D g_texture;
SamplerState defaultSampler
{
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
};
struct VSInput
{
float4 position : POSITION;
float3 normal : NORMAL;
float2 texcoord : TEXCOORD0;
};
struct PSInput
{
float4 position : SV_POSITION;
float3 normal : NORMAL;
float2 texcoord : TEXCOORD0;
};
PSInput VSDefault(VSInput input)
{
PSInput result;
result.position = mul(input.position, world);
result.position = mul(result.position, view);
result.position = mul(result.position, projection);
result.normal = input.normal;//mul(input.normal, invWorldViewProjection);
result.texcoord = input.texcoord;
return result;
}
float4 PSDefault(PSInput input) : SV_TARGET
{
return g_texture.Sample(defaultSampler, input.texcoord);
}[/source]
I have a feeling the problem is to do with my viewport settings as the post-vs output looks fine. It is only after clipping that I lose everything. Unfortunately I can't find much information on the appropriate values for the D3D11_VIEWPORT structure and trial and error has proven unsuccessful. Any idea what I'm doing wrong?