HLSL实现反射天空盒

 1 cbuffer cbPerObject
 2 {
 3     float4x4 WVP;
 4     float4x4 World;
 5     float3 cameraPos;
 6 };
 7 
 8 SamplerState ObjSamplerState;
 9 TextureCube SkyMap;
10 
11 struct REFLECT_VS_OUTPUT
12 {
13     float4 Pos : SV_POSITION;
14     float3 TexCoord : TEXCOORD;
15     float3 normal : NORMAL;
16 };
17 
18 REFLECT_VS_OUTPUT REFLECT_VS(float3 inPos : POSITION, float2 inTexCoord : TEXCOORD, float3 normal : NORMAL)
19 {
20     REFLECT_VS_OUTPUT output = (REFLECT_VS_OUTPUT)0;
21     output.Pos = mul(float4(inPos, 1.0f), WVP);
22     output.normal = mul(normal, World);
23     output.TexCoord = inPos;
24 
25     return output;
26 }
27 
28 float4 REFLECT_PS(REFLECT_VS_OUTPUT input) : SV_Target
29 {
30     input.normal = normalize(input.normal);
31     float3 I = normalize(input.Pos - cameraPos);
32     float3 R = reflect(I, normalize(input.normal));
33     return SkyMap.Sample(ObjSamplerState, R);
34 }

cube-mapping-skybox

效果:

我们基于观察方向向量I和物体的法线向量N计算出反射向量R。我们可以使用GLSL的内建函数reflect来计算这个反射向量。最后向量R作为一个方向向量对cubemap进行索引/采样,返回一个环境的颜色值。最后的效果看起来就像物体反射了天空盒。

反射(reflection)

posted @ 2016-05-04 21:39  Reise  阅读(520)  评论(0编辑  收藏  举报