顶点着色器:
uniform mat4 uMVPMatrix;
uniform mat4 uMMatrix;
uniform vec3 uCamera;
attribute vec3 aPosition;
attribute vec3 aNormal;
varying vec3 eyeVary;
varying vec3 newNormalVary;
void main() {
gl_Position = uMVPMatrix * vec4(aPosition,1);
vec3 normalTarget=aPosition+aNormal;
vec3 newNormal=(uMMatrix*vec4(normalTarget,1)).xyz-(uMMatrix*vec4(aPosition,1)).xyz;
newNormal=normalize(newNormal);
newNormalVary=newNormal;
vec3 eye = normalize(uCamera-(uMMatrix*vec4(aPosition,1)).xyz);
eyeVary=eye;
}
片元着色器:
precision mediump float;
uniform samplerCube sTexture;
varying vec3 eyeVary;
varying vec3 newNormalVary;
vec4 zfs(
in float zsl
){
vec3 vTextureCoord;
vec4 finalColorZS;
vec4 finalColorFS;
vec4 finalColor;
const float maxH=0.7;
const float minH=0.2;
float sizeH=maxH-minH;
float testValue=abs(dot(eyeVary,newNormalVary));
if(testValue>maxH) {
vTextureCoord=refract(-eyeVary,newNormalVary,zsl);
finalColor=textureCube(sTexture, vTextureCoord);
} else if(testValue<=maxH&&testValue>=minH) {
vTextureCoord=reflect(-eyeVary,newNormalVary);
finalColorFS=textureCube(sTexture, vTextureCoord);
vTextureCoord=refract(-eyeVary,newNormalVary,zsl);
finalColorZS=textureCube(sTexture, vTextureCoord);
float ratio=(testValue-minH)/sizeH;
finalColor=finalColorZS*ratio+(1.0-ratio)*finalColorFS;
} else {
vTextureCoord=reflect(-eyeVary,newNormalVary);
finalColor=textureCube(sTexture, vTextureCoord);
}
return finalColor;
}
void main(){
vec4 finalColor=vec4(0.0,0.0,0.0,0.0);
finalColor.r=zfs(0.97).r;
finalColor.g=zfs(0.955).g;
finalColor.b=zfs(0.94).b;
gl_FragColor=finalColor;}