Sky
天空是位于极远处的,因此我们将天空盒的深度值设置在远截面
cbuffer Transform
{
float4x4 WorldViewProj;
};
struct VertexIn
{
float3 PosL : POSITION;
};
struct VertexOut
{
float4 PosH : SV_POSITION;
float3 PosL : POSITION;
};
VertexOut main(VertexIn input)
{
VertexOut output;
// 将z值设置为w
// 归一化时深度值为w / w = 1
// 使得sky永远位于远截面
output.PosH = mul(float4(input.PosL , 1.0f) , WorldViewProj).xyww;
// 用于采样环境贴图
output.PosL = input.PosL;
}
//--------------------Pixel Shader--------------------
TextureCube CubeMap;
SamplerState SampleLinear;
float4 main(VertexOut input) : SV_TARGET
{
return CubeMap.Sample(SampleLinear , input.PosL);
}
上面的代码用到了对TextureCube的采样,下面来说明下这个采样是如何完成的
如图中所示,点
p
处的颜色实则为
以下代码完成这一功能:
TextureCube CubeMap;
SamplerState gSamplerState;
// v:向量OP
// 若点O为空间原点,则点p的坐标即为向量v的值
float4 color = CubeMap.Sample(gSamplerState , v);
cube map的结构:
Reflection
下图介绍了如何使用采样environment map
p
是物体上一点,