具体代码参考 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.即改点位于无穷远处。
这时候必须把几何体的中心和摄像机的中心对齐,即把摄像机的位置设置给几何体。