#include<metal_stdlib>
float4 zfs(float zsl,float3 surfaceNormal,float3 surfaceView,texturecube<float> cubeTexture,sampler cubeSampler)
{
float4 finalColorZS=float4(1.0,1.0,1.0,0.0);
float4 finalColorFS=float4(1.0,1.0,1.0,0.0);
float4 finalColor=float4(1.0,1.0,1.0,0.0);
float3 vTextureCoord=float3(1.0,1.0,1.0);
//texturecube<float> cubeTexture;
const float maxH=0.7;
const float minH=0.2;
float sizeH=maxH-minH;
float3 eyeDirection=normalize(-surfaceView);
float testValue=abs(dot(eyeDirection,surfaceNormal));
if(testValue>maxH)
{
vTextureCoord=refract(-eyeDirection,surfaceNormal,zsl);
finalColor=cubeTexture.sample(cubeSampler,vTextureCoord);
}else if(testValue<=maxH&&testValue>=minH)
{
vTextureCoord=reflect(-eyeDirection,surfaceNormal);
finalColorFS=cubeTexture.sample(cubeSampler,vTextureCoord);
vTextureCoord=refract(-eyeDirection,surfaceNormal,zsl);
finalColorZS=cubeTexture.sample(cubeSampler,vTextureCoord);
float ratio=(testValue-minH)/sizeH;
finalColor=finalColorZS*ratio+(1.0-ratio)*finalColorFS;
}else
{
vTextureCoord=reflect(-eyeDirection,surfaceNormal);
finalColorFS=cubeTexture.sample(cubeSampler,vTextureCoord);
}
return finalColor;
}
#pragma arguments
texturecube<float> cubeTexture;
#pragma transparent
#pragma body
constexpr sampler s(filter::linear,mip_filter::linear);
_output.color.r=zfs(0.97,_surface.normal,_surface.view,cubeTexture,s).r;
_output.color.g=zfs(0.955,_surface.normal,_surface.view,cubeTexture,s).g;
_output.color.b=zfs(0.94,_surface.normal,_surface.view,cubeTexture,s).b;
本文地址:http://blog.csdn.net/sh15285118586/article/details/78932279