GLSL实现Fresnel And Chromatic aberration 【转】
http://blog.csdn.net/a3070173/archive/2008/11/13/3290091.aspx
使用Shader实现菲涅尔和颜色色散效果很简单,在Cg教程和OpenGL Shader Language都有较
为详细的介绍,个人觉得需要注意的地方是反射向量和折射向量应该在世界空间中进行计算,
在模型空间和照相机空间中计算都会导致错误的结果.
具体着色器代码:
顶点着色器:
const float g_fEta = 0.66; // 空气和玻璃的折射材质比例
const float g_fEtaR = 0.65;
const float g_fEtaG = 0.67;
const float g_fEtaB = 0.69;
const float g_fFresnelPower = 0.8;
const float f = ((1.0-g_fEta) * (1.0-g_fEta)) / ((1.0+g_fEta) * (1.0+g_fEta));
uniform vec3 g_vec3CamerePositionInWorld;
uniform int g_iRenderMode;
varying vec3 g_vec3Reflect;
varying vec3 g_vec3Refract;
varying vec3 g_vec3Refract_R;
varying vec3 g_vec3Refract_G;
varying vec3 g_vec3Refract_B;
varying float g_fFresnelRatio;
void main()
{
vec3 NV = normalize(gl_Vertex.xyz - g_vec3CamerePositionInWorld);
vec3 N = gl_Normal;
// 计算Fresnel比例
g_fFresnelRatio = f + (1.0 - f) * pow((1.0 - dot(-NV, N)), g_fFresnelPower);
// 计算反射和折射光线
if (g_iRenderMode == 0)
{
g_vec3Reflect = reflect(NV, N);
g_vec3Reflect.y = -g_vec3Reflect.y;
}
else if (g_iRenderMode == 1)
{
g_vec3Refract = refract(NV, N, g_fEta);
g_vec3Refract.y = -g_vec3Refract.y;
}
else if (g_iRenderMode == 2)
{
g_vec3Reflect = reflect(NV, N);
g_vec3Reflect.y = -g_vec3Reflect.y;
g_vec3Refract = refract(NV, N, g_fEta);
g_vec3Refract.y = -g_vec3Refract.y;
}
else
{
g_vec3Reflect = reflect(NV, N);
g_vec3Reflect.y = -g_vec3Reflect.y;
g_vec3Refract_R = refract(NV, N, g_fEtaR);
g_vec3Refract_R.y = -g_vec3Refract_R.y;
g_vec3Refract_G = refract(NV, N, g_fEtaG);
g_vec3Refract_G.y = -g_vec3Refract_G.y;
g_vec3Refract_B = refract(NV, N, g_fEtaB);
g_vec3Refract_B.y = -g_vec3Refract_B.y;
}
gl_Position = ftransform();
}
}
片元着色器:
varying vec3 g_vec3Reflect;
varying vec3 g_vec3Refract;
varying vec3 g_vec3Refract_R;
varying vec3 g_vec3Refract_G;
varying vec3 g_vec3Refract_B;
varying float g_fFresnelRatio;
uniform samplerCube g_Cubemap;
uniform int g_iRenderMode;
void main()
{
vec3 vec3FinalColor = vec3(0.0);
if (g_iRenderMode == 0)
{
vec3FinalColor = vec3(textureCube(g_Cubemap, g_vec3Reflect));
}
else if (g_iRenderMode == 1)
{
vec3FinalColor = vec3(textureCube(g_Cubemap, g_vec3Refract));
}
else if (g_iRenderMode == 2)
{
vec3 vec3ReflectColor = vec3(textureCube(g_Cubemap, g_vec3Reflect));
vec3 vec3RefractColor = vec3(textureCube(g_Cubemap, g_vec3Refract));
vec3FinalColor = mix(vec3RefractColor, vec3ReflectColor, g_fFresnelRatio);
}
else
{
vec3 vec3ReflectColor = vec3(textureCube(g_Cubemap, g_vec3Reflect));
vec3 vec3RefractColor = vec3(0.0);
vec3RefractColor.r = vec3(textureCube(g_Cubemap, g_vec3Refract_R)).r;
vec3RefractColor.g = vec3(textureCube(g_Cubemap, g_vec3Refract_G)).g;
vec3RefractColor.b = vec3(textureCube(g_Cubemap, g_vec3Refract_B)).b;
vec3FinalColor = mix(vec3RefractColor, vec3ReflectColor, g_fFresnelRatio);
}
gl_FragColor = vec4(vec3FinalColor, 1.0);
}
Demo效果图:
exe文件:http://www.fileupyours.com/view/219112/GLSL/Fresnel%20And%20Chromatic%20aberration%20Demo.rar
GLSL实现Fresnel And Chromatic aberration 【转】的更多相关文章
- [Unity]游戏Inside中的Chromatic Aberration效果学习
Chromatic Aberration效果指的是模拟摄像机的拍摄瑕疵导致rgb三个通道的颜色发生了偏移,如 传统的Chromatic Aberration实现往往是基于一个后处理,将rgb采样的坐标 ...
- chromatic aberration
https://github.com/keijiro/KinoFringe https://en.wikipedia.org/wiki/Chromatic_aberration 色差偏移 做神经病效果 ...
- Unity3D-美术相关
1.导入动画 (1)使用预分解的动画模型,导入后面板中会含有一个可用的动画片段列表. (2)使用未分解的动画模型,自行添加动画片段. (3)使用多个动画文件,模型与动画分离.对于goober.fbx模 ...
- UI篇之——用户体验
内容均为原创,转载请注明处处谢谢. 用户体验(User Experience,简称UX)是一个关于用户(users)以及交互(interactive)技术系统领域的整体概念.具体来说,它代表了一个网站 ...
- Unity3d 2017
Unity3d引擎的新纪元--Unity3d 2017 来源 http://blog.csdn.net/dark00800/article/details/75209544 Unity3d不久之前正式 ...
- UE4 PostProcessVolume笔记
透镜:Lens Bloom 光溢出 VDirt Mask 光溢出泥土蒙版 Depth of Filed 景深 V Eye Adaptation (Auto-Exposure) 人眼适应 V这个效果有时 ...
- 【CV】ICCV2015_Unsupervised Visual Representation Learning by Context Prediction
Unsupervised Visual Representation Learning by Context Prediction Note here: it's a learning note on ...
- ICCV 2017论文分析(文本分析)标题词频分析 这算不算大数据 第一步:数据清洗(删除作者和无用的页码)
IEEE International Conference on Computer Vision, ICCV 2017, Venice, Italy, October 22-29, 2017. IEE ...
- 走进VR游戏开发的世界
http://geek.csdn.net/news/detail/76504 我们组在2014年下半年尝试开发了一款Xbox One平台的体感游戏,2015年上半年进行收尾工作的同时,结合之前积累的体 ...
随机推荐
- ASP.NET 经典60道面试题
转:http://bbs.chinaunix.net/thread-4065577-1-1.html ASP.NET 经典60道面试题 1. 简述 private. protected. public ...
- ajax请求总是不成功?浏览器的同源策略和跨域问题详解
场景 码农小明要做一个展示业务数据的大屏给老板看,里面包含了来自自己网站的数据和来自隔壁老王的数据.那么自己网站的数据提供了 http://xiaoming.com/whoami 这样的数据接口隔壁老 ...
- C++ STL算法系列3---求和:accumulate
该算法在numeric头文件中定义. 假设vec是一个int型的vector对象,下面的代码: //sum the elements in vec starting the summation wit ...
- 一行命令实现Android自动关机
前几天晚上失眠,实在睡不着觉,于是想用Nexus7听一听小野丽莎的歌,在安静祥和之中睡去(怎么感觉有点...)但是不能让平板总是这么循环播放吧(屋里吐槽Google Play Music),所以在平板 ...
- 关于在Eclipse里面启动了服务,但是localhost:8080无法访问的问题:
今天eclipse重新换了一个然后写项目,结果发生了一些bug,当在Tomca服务开启之后,浏览器端输入localhost:8080无法访问,以为是服务器没有搞定,检查了没问题,百度了一下有很多乱七八 ...
- private
成员变量私有化的好处在于可以强制加强面向对象和封装的概念,一个面向对象的系统更加关注行为,而不是数据,所以应该通过发送消息来获得数据,也应该实习细节的封装
- 去除下载电影和电视剧文件名中的多余字符[python实现]
讨厌下载电影和电视剧文件名中的多余字符(如网址和广告字样),,搞得文件名好长,可以使用下面的Python代码,自行修改即可. #!\usr\bin\env python # -*- coding: u ...
- WinForm编程时窗体设计器中ComboBox控件大小的设置
问题描述: 在VS中的窗体设计器中拖放一个ComboBox控件后想调整控件的大小.发现在控件上用鼠标只能拖动宽度(Width)无法拖动(Height). 解决过程: 1.控件无法拖动,就在属性窗口中设 ...
- 邻接表存储图,DFS遍历图的java代码实现
import java.util.*; public class Main{ static int MAX_VERTEXNUM = 100; static int [] visited = new i ...
- 第二百八十九天 how can I 坚持
今天好伤啊,太把自己当回事了. 现在在弟弟这,下午和他一块看了看西客站附近的房子,感觉暂时好难,只是暂时的,一切都会好起来的. 弟弟上班也挺不容易,不该来给他添麻烦,替他心疼. 确实不知道该咋办了,好 ...