In my skybox shader I used logarithmic depth buffer to make it always visible at any distance.
But this caused unexpected side effect - one of the cube`s sides always disappearing when looking on it from special angle. When I comment calculation of depth buffer - everything OK.
Here is my skybox effect code:
matrix worldMatrix;
matrix viewMatrix;
matrix projectionMatrix;
float3 CameraPosition;
float zNear;
float zFar;
TextureCube skyboxTexture;
SamplerState skyBoxSampler;
struct VertexShaderInput
{
float4 Position : SV_POSITION0;
};
struct VertexShaderOutput
{
float4 Position : SV_POSITION0;
float3 TextureCoordinate : TEXCOORD0;
};
VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
{
VertexShaderOutput output;
float4 worldPosition = mul(input.Position, worldMatrix);
float4 viewPosition = mul(worldPosition, viewMatrix);
output.Position = mul(viewPosition, projectionMatrix);
//this line caused the issue
output.Position.z = log(zNear*output.Position.z + 1) / log(zNear*zFar + 1) * output.Position.w;
float4 VertexPosition = mul(input.Position, worldMatrix);
output.TextureCoordinate = VertexPosition - CameraPosition;
return output;
}
float4 PixelShaderFunction(VertexShaderOutput input) : SV_TARGET
{
return skyboxTexture.Sample(skyBoxSampler, input.TextureCoordinate);
}
technique Skybox
{
pass Pass0
{
Profile = 11.0;
VertexShader = VertexShaderFunction;
PixelShader = PixelShaderFunction;
}
}
For znear, zfar I use following values:
skyboxEffect.Parameters["zNear"].SetValue(0.01f);
skyboxEffect.Parameters["zFar"].SetValue(16500000000.0f);
This perfectly working with my loaded models, but not working correctly with skybox.
I set size for cube to 1650000.0f.
Does someone know how to fix described issue without disabling logarithmic depth buffer or at least make that when object is far from camera, skybox not disappear.