D3D11天空盒的实现

D3D11天空盒的实现_第1张图片具体代码参考 https://github.com/wumiliu/D3D11Sample 中的SkyBox类

可以参考DirectX 10 3D游戏编程入门.pdf

创建一个球形,或者立方体 都可以。然后进行立方体贴图即可。



现在详细解释写shader.



cbuffer  MatrixBuffer: register(b0)
{
 matrix MVP;
};

struct VertexInputType
{
 float4 position : SV_Position;
 float3 normal : NORMAL;
 float3 tangent : TANGENT;
 float2 tex : TEXCOORD;
};

struct PixelInputType
{
 float4 position : SV_Position;
 float3 posL: POSITION;
};

////////////////////////////////////////////////////////////////////////////////
// Vertex Shader
////////////////////////////////////////////////////////////////////////////////
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(input.position, MVP).xyww;
 output.position.z = output.position.w;
 output.posL = input.position.xyz;
 return output;
}

#define Sample2D(tex, uv) t##tex.Sample(s##tex, uv)
TextureCube tDiffCubeMap : register(t0);
SamplerState sDiffCubeMap : register(s0);

////////////////////////////////////////////////////////////////////////////////
// Pixel Shader
////////////////////////////////////////////////////////////////////////////////
float4 PS(PixelInputType input) : SV_TARGET
{
 float4 textureColor = Sample2D(DiffCubeMap, input.posL);
 return textureColor;
}

最关键的位置是output.position.z = output.position.w 。在乘以视图矩阵投影矩阵以后。把w值赋值给z.

这样在硬件进行透视除法的时候,z=1.即改点位于无穷远处。

这时候必须把几何体的中心和摄像机的中心对齐,即把摄像机的位置设置给几何体。




你可能感兴趣的:(D3D11天空盒的实现)