[ShaderStaff] Vignette Effect
操作系统:Windows8.1
显卡:Nivida GTX965M
开发工具:GLSL | C
最近在看Cardboard实现,其中关于畸变的着色器代码中有加入 晕影Vignette 效果的实现,固在这里温习、总结一下。
直接上效果图:
使用Vignette滤镜效果图:
大概意思如图所示,增加了晕影效果后,使得边缘区域覆盖了厚重的颜色快,其目的是使得观看者更多的将目光聚焦在中心区域,该效果被大量运用到摄影、影视作品中。
比如:
How to implement
先给出全部代码具体解释说明,顶点着色器代码相对比较简单,仅仅是传递Mesh顶点数据及对应的UV数据。
static const char *vertex_shader_source =
LINE("attribute vec4 aPosition;")
LINE("attribute vec4 aTextureCoord;")
LINE("varying highp vec2 vTextureCoord;")
LINE("void main() {")
LINE("gl_Position = aPosition;")
LINE("vTextureCoord = aTextureCoord.xy;")
LINE("}");
片段着色器代码:
static const char *fragment_shader_source =
LINE("precision mediump float;")
LINE("varying vec2 vTextureCoord;")
LINE("uniform lowp sampler2D sTexture;")
LINE("uniform lowp vec2 uVignetteCenter;")
LINE("uniform lowp vec3 uVignetteColor;")
LINE("uniform highp float uVignetteStart;")
LINE("uniform highp float uVignetteEnd;")
LINE("void main() {")
LINE("lowp vec3 rgb = texture2D(sTexture, vTextureCoord).rgb;")
LINE("lowp float d = distance(vTextureCoord, vec2(uVignetteCenter.x, uVignetteCenter.y));")
LINE("lowp float percent = smoothstep(uVignetteStart, uVignetteEnd, d);")
LINE("gl_FragColor = vec4(mix(rgb.x, uVignetteColor.x, percent), mix(rgb.y, uVignetteColor.y, percent), mix(rgb.z, uVignetteColor.z, percent), 1.0);")
LINE("}");
该代码中设计带一些 uniform 系变量逐一说明:
- uVignetteCenter 二维分量,用于确定晕影效果的中心点,用于逐像素计算距离中心点距离使用。考虑着色器坐标需要归一化 [0.0 - 1.0 ],固在上面的示例中定义为默认 [0.5, 0.5]
- uVignetteColor 三维分量,用于确定晕影效果的颜色,一般情况下倾向于暗色调,在本例中为黑色 [1.0, 1.0, 1.0]
- uVignetteStart | uVigntteEnd 均为二维分量,与上面提到的中心点组合使用,可以简单理解通过 smoothstep 插值计算当前像素晕影强度,越靠近 uVignetteStart 晕影效果越轻淡,反之越靠近边缘晕影效果越浓重
以下为示例所使用的参数值:
filter->vignette_center_x = 0.5f;
filter->vignette_center_y = 0.5f;
filter->vignette_color[] = 0.0f;
filter->vignette_color[] = 0.0f;
filter->vignette_color[] = 0.0f;
filter->vignette_start = 0.2f;
filter->vignette_end = 0.85f;
关于着色器中的 smoothstep 插值函数以参考 OpenGL Refpages了解其实现原理,mix 混色函数参考 OpenGL Refpages。
Summery
效果实现相对比较简单,具体应用环境可通过 fragment shader 任意调整参数,包括影晕形状。
[ShaderStaff] Vignette Effect的更多相关文章
- FFMpeg ver 20160219-git-98a0053 滤镜中英文对照 2016.02.21 by 1CM
FFMpeg ver 20160219-git-98a0053 滤镜中英文对照 2016.02.21 by 1CM T.. = Timeline support 支持时间轴 .S. = Slice t ...
- FFMpeg ver 20160213-git-588e2e3 滤镜中英文对照
1 FFMpeg ver 20160213-git-588e2e3 滤镜中英文对照 2016.02.18 by 1CM 2 T.. = Timeline support 3 支持时间轴 4 .S. = ...
- FFMpeg 滤镜中英文对照
FFMpeg ver 20160213-git-588e2e3 滤镜中英文对照 2016.02.17 by 1CM T.. = Timeline support 支持时间轴 .S. = Slice t ...
- iOS使用CoreImage处理图像40中可用的滤镜名称
NSString* localPath = [[NSBundle mainBundle] pathForResource:@"1" ofType:@"jpg"] ...
- [Direct2D1.1教程] Direct2D特效概览
转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 Direct2D是一个基于Direct3D的2D图形API,可以利用硬件加速特性来提供高性能高质量的2D渲染.但 ...
- Unity3D-Shader-复古电影荧幕特效
[旧博客转移 - 2015年12月6日 18:12] 今天用Shader做了一个复古荧幕效果,老电视机放映的感觉,写篇文章记录一下 原始图片: 没错,这就是电影<泰坦尼克号> ...
- 【Unity Shaders】游戏性和画面特效——创建一个老电影式的画面特效
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
- Unity Lighting(一)光照练习
Unity 2018.1.2f1 原文链接:https://www.youtube.com/watch?v=VnG2gOKV9dw Unity Lighting练习最终效果 眼睛.光源与物体 光学基础 ...
- 【Direct2D1.1初探】Direct2D特效概览
转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 Direct2D是一个基于Direct3D的2D图形API,可以利用硬件加速特性来提供高性能高质量的2D渲染.但 ...
随机推荐
- JS获取当前时间到30天之后的日期区间
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- HDU 1045 dfs + 回溯
题目链接:http://acm.hrbust.edu.cn/vj/index.php?/vj/index.php?c=&c=contest-contest&cid=134#proble ...
- L183 Chinese company unveils first satellite for free WiFi
A Chinese internet technology company unveiled the first satellite in a constellation plan to provid ...
- centos7上systemd详解
centos7上systemd详解 发表于 2016-06-07 | 分类于 linux CentOS 7继承了RHEL 7的新的特性,例如强大的systemd, 而systemd的使用也使得以往 ...
- nmcli 命令的基本使用
nmcli命令 地址配置工具:nmcli nmcli device 查看所有网卡的信息 nmcli device status 和numcli device 相同 nmcli device ...
- 阿里历年经典Java面试题汇总
Volatile的特征: A.禁止指令重排(有例外) B.可见性 Volatile的内存语义: 当写一个volatile变量时,JMM会把线程对应的本地内存中的共享变量值刷新到主内存. 当读一个vol ...
- ArrayAdapter的用法
list = new ArrayList<String>(); //创建一个list list.add("ID列表"); //列表里面的条目 /*ArrayAdapte ...
- HDU2874Connections between cities( LCA )Tarjan
Problem Description After World War X, a lot of cities have been seriously damaged, and we need to r ...
- 20165212 2017-2018-2《Java程序设计》课程总结
20165212 2017-2018-2<Java程序设计>课程总结 作业链接汇总 每周作业链接 预备作业1:我期望的师生关系 预备作业2:做中学learning by doing个人感想 ...
- DesignPattern(三)结构型模式(上)
结构型模式 结构型模式,顾名思义讨论的是类和对象的结构 ,主要用来处理类或对象的组合.它包括两种类型,一是类结构型模式,指的是采用继承机制来组合接口或实现:二是对象结构型模式,指的是通过组合对象的方式 ...