вторник, 17 апреля 2012 г.

Практическое применение XNA. Часть 16.

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);
}

В результате у нас получится подобная картинка:

Вопросы?

Комментариев нет:

Отправить комментарий

Physically Based Rendering