这篇文章主要介绍了如何利用OpenGL Shader实现阴影遮罩效果,文中的示例代码简洁易懂,对我们学习OpenGL有一定帮助,需要的可以参考一下
smoothstep另一种用法
在之前OpenGL Shader-抗锯齿实现文章中所介绍的那样:为了抗锯齿效果可以用smoothstep
函数对绘制形状进行平滑过渡来实现。其中也提到了当smoothstep
函数中入参a
和b
范围过大时就会出现渐变效果。如OpenGL Shader-抗锯齿实现中所展示的效果:
遮罩效果实现
看到这个效果后似乎可以利用smoothstep
函数中a
和b
入参取大范围来实现不一样的特效能力。例如可以使用该特点来实现类似于老电影中遮罩效果,在视图边缘出现一层朦胧遮罩中间最亮四周有一层淡淡的阴影效果。
实现原理其实就是利用smoothstep
函数入参使用大范围值,在绘制圆基础上改造处理。底色使用白色vec3(1.)
,阴影遮盖使用黑色vec3(1.)
就能达到阴影遮罩效果了。
void main() {
vec2 uv = gl_FragCoord.xy / iResolution.xy;
vec4 texture = texture(iChannel2,uv);
uv -= 0.5;
uv.x *= iResolution.x/iResolution.y;
float m = 0.4;
m = smoothstep(m-0.2,m+0.2,length(uv) - 0.2);
vec3 pixel = mix(vec3(1.),vec3(0.),m);
gl_FragColor = vec4(pixel,1.0);
}
除了采用smoothstep
函数实现外,下面还有一种方法也能实现阴影遮罩效果。如下glsl
所示 对颜色向量vec4 texture
和vignette
相乘,相当于改变色值通道亮度达到明暗对比;同时对于取值uv.y-0.5
可以理解越接近中心取值越接近为0,那么计算得出的vignette
就越大约接近为1。
void main() {
vec2 uv = gl_FragCoord.xy / iResolution.xy;
vec4 texture = vec4(1.);
float vigAmt = 4.0;
float vignette = (1.0-vigAmt*(uv.y-0.5)*(uv.y-0.5))*(1.0-vigAmt*(uv.x-0.5)*(uv.x-0.5));
texture *= vignette;
gl_FragColor = texture;
}
通过对照也能发现采用圆形公式实现遮罩是有一定圆弧趋势,而另一种遮罩是偏向矩形,在特效效果上略有差异。以此类推肯定还可以根据这种方式来实现星型,爱心等形状遮罩。
smoothstep
vignette
效果扩展
最后可以增加一个time
时间入参,通过vigAmt
值不断变化vignette
强弱来实现忽明忽暗的效果,会有一种在看老电影的感受。
#define time iTime
void main() {
vec2 uv = gl_FragCoord.xy / iResolution.xy;
vec4 texture = texture(iChannel2,uv);
float vigAmt = 4.0 + 0.3 * sin(time + 5.0 * cos(time*5.0));
float vignette = (1.0-vigAmt*(uv.y-0.5)*(uv.y-0.5))*(1.0-vigAmt*(uv.x-0.5)*(uv.x-0.5));
texture *= vignette;
gl_FragColor = texture;
}
到此这篇关于OpenGL Shader实现阴影遮罩效果的文章就介绍到这了,更多相关OpenGL Shader阴影遮罩内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:OpenGL Shader实现阴影遮罩效果


基础教程推荐
- Android开发Compose集成高德地图实例 2023-06-15
- iOS开发使用XML解析网络数据 2022-11-12
- Android Compose自定义TextField实现自定义的输入框 2023-05-13
- Flutter进阶之实现动画效果(三) 2022-10-28
- iOS开发 全机型适配解决方法 2023-01-14
- Android实现短信验证码输入框 2023-04-29
- iOS中如何判断当前网络环境是2G/3G/4G/5G/WiFi 2023-06-18
- MVVMLight项目Model View结构及全局视图模型注入器 2023-05-07
- iOS Crash常规跟踪方法及Bugly集成运用详细介绍 2023-01-18
- IOS获取系统相册中照片的示例代码 2023-01-03