Skybox
Одним из немаловажных вопросов при написании игры является создание неба. В этой статье я рассмотрю один из наиболее распространенных способов. Небо в играх представляет собой куб (или сферу, но сейчас о кубе), с наложенной на него текстурой. Камера наблюдения должна всегда находиться в середине этого куба. При перемещении камеры, позиция куба изменяется в соответствии с позицией камеры. Буфер глубины можно отключить, и порядок обхода треугольников (CullMode) нужно установить в обратную сторону, (это позволит видеть куб изнутри). Вся хитрость заключается здесь в использовании специальной кубической текстуры, при наложении которой на куб, грани куба сливаются, и перестают быть видимыми. Как генерировать куб и использовать камеру, я рассказывал ранее. По этому ничего принципиально нового для вас здесь быть не должно, кроме особенностей применения кубических текстур в шейдере.
Шейдер для скайбокса:
TextureCube shaderTexture;
sampler SampleType;
cbuffer MatrixBuffer
{
matrix worldMatrix;
matrix viewMatrix;
matrix projectionMatrix;
};
struct VS_INPUT
{
float4 position : POSITION;
float2 texcoord : TEXCOORD0;
};
struct PS_INPUT
{
float4 position : SV_POSITION;
float3 texcoord : TEXCOORD0;
};
PS_INPUT VS(VS_INPUT input)
{
PS_INPUT output = (PS_INPUT)0;
output.position = mul(mul(mul(input.position, worldMatrix), viewMatrix), projectionMatrix);
output.texcoord = input.position;
return output;
}
float4 PS(PS_INPUT input) : SV_TARGET
{
return shaderTexture.Sample(SampleType, input.texcoord);
}
TextureCube shaderTexture;
sampler SampleType;
cbuffer MatrixBuffer
{
matrix worldMatrix;
matrix viewMatrix;
matrix projectionMatrix;
};
struct VS_INPUT
{
float4 position : POSITION;
float2 texcoord : TEXCOORD0;
};
struct PS_INPUT
{
float4 position : SV_POSITION;
float3 texcoord : TEXCOORD0;
};
PS_INPUT VS(VS_INPUT input)
{
PS_INPUT output = (PS_INPUT)0;
output.position = mul(mul(mul(input.position, worldMatrix), viewMatrix), projectionMatrix);
output.texcoord = input.position;
return output;
}
float4 PS(PS_INPUT input) : SV_TARGET
{
return shaderTexture.Sample(SampleType, input.texcoord);
}
Комментариев нет:
Отправить комментарий