GLSL 效果示例
玻璃球折射:让背景在球内弯曲
通过球体区域采样同一张背景图,观察边缘和中心的偏移差异。
在线示例
修改右侧代码,左侧预览会实时更新。
观察什么
通过球体区域采样同一张背景图,观察边缘和中心的偏移差异。
实现原理
用球面法线计算一个折射方向,再将横向分量用于背景采样。这是单界面屏幕空间近似,不包含球内多次折射。
找到控制效果的代码
float r=length(p);vec2 q=uv;if(r<.65){float z=sqrt(.65*.65-r*r);vec3 n=normalize(vec3(p,z));vec3 refracted=refract(vec3(0,0,-1),n,1./1.45);q+=refracted.xy*(.12+.25*u_parameter);}c=texture2D(u_texture,q).rgb;if(r<.65)c+=pow(r/.65,8.)*.15;
动手修改
把折射率比例 1./1.45 改为 1./1.1。折射方向的弯曲会减弱,圆形遮罩内的网格会更接近未扭曲的背景。
调试与成本
着色器调用一次 refract 后采样一次背景,再叠加艺术化亮边 pow(r/.65,8.)*.15。把最后 .15 设为 0.,可去掉亮边单看折射;这不会增加出射面或内部反射。