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 【转】的更多相关文章

  1. [Unity]游戏Inside中的Chromatic Aberration效果学习

    Chromatic Aberration效果指的是模拟摄像机的拍摄瑕疵导致rgb三个通道的颜色发生了偏移,如 传统的Chromatic Aberration实现往往是基于一个后处理,将rgb采样的坐标 ...

  2. chromatic aberration

    https://github.com/keijiro/KinoFringe https://en.wikipedia.org/wiki/Chromatic_aberration 色差偏移 做神经病效果 ...

  3. Unity3D-美术相关

    1.导入动画 (1)使用预分解的动画模型,导入后面板中会含有一个可用的动画片段列表. (2)使用未分解的动画模型,自行添加动画片段. (3)使用多个动画文件,模型与动画分离.对于goober.fbx模 ...

  4. UI篇之——用户体验

    内容均为原创,转载请注明处处谢谢. 用户体验(User Experience,简称UX)是一个关于用户(users)以及交互(interactive)技术系统领域的整体概念.具体来说,它代表了一个网站 ...

  5. Unity3d 2017

    Unity3d引擎的新纪元--Unity3d 2017 来源 http://blog.csdn.net/dark00800/article/details/75209544 Unity3d不久之前正式 ...

  6. UE4 PostProcessVolume笔记

    透镜:Lens Bloom 光溢出 VDirt Mask 光溢出泥土蒙版 Depth of Filed 景深 V Eye Adaptation (Auto-Exposure) 人眼适应 V这个效果有时 ...

  7. 【CV】ICCV2015_Unsupervised Visual Representation Learning by Context Prediction

    Unsupervised Visual Representation Learning by Context Prediction Note here: it's a learning note on ...

  8. ICCV 2017论文分析(文本分析)标题词频分析 这算不算大数据 第一步:数据清洗(删除作者和无用的页码)

    IEEE International Conference on Computer Vision, ICCV 2017, Venice, Italy, October 22-29, 2017. IEE ...

  9. 走进VR游戏开发的世界

    http://geek.csdn.net/news/detail/76504 我们组在2014年下半年尝试开发了一款Xbox One平台的体感游戏,2015年上半年进行收尾工作的同时,结合之前积累的体 ...

随机推荐

  1. GitHub托管

    借助GitHub托管你的项目代码   PS:话说自己注册了GitHub都很久了,却没有怎么去弄,现在系统学习一下,也把自己的学习经历总结下来share给大家,希望大家都能把GitHub用起来,把你的项 ...

  2. Hadoop集群中Hbase的介绍、安装、使用

    导读 HBase – Hadoop Database,是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群. 一.Hbase ...

  3. IOS Swizzle(hook)

    /////////////////////////////////////////////////////////////////////////////////////////////////// ...

  4. (转载)OC学习篇之---第一个程序HelloWorld

    之前的一片文章简单的介绍了OC的相关概述,从这篇开始我们就开始学习OC的相关知识了,在学习之前,个人感觉需要了解的其他的两门语言:一个是C/C++,一个是面向对象的语言(当然C++就是面向对象,不过这 ...

  5. mvc bundle功能(2)

    配置好Bundle,注册好之后,再是调用 <head> <meta charset="utf-8"> <meta http-equiv="X ...

  6. tensorflow-cnn

    需要安装 python,numpy,tensorflow,运行代码即可. tensorflow很好装,用pip安装即可. 可以参照http://wiki.jikexueyuan.com/project ...

  7. CDH5.5.1 安装Spark ON Yarn环境

    CDH对我们已经封装了,我们如果需要Spark on Yarn,只需要yum安装几个包就可以了. 前面的文章我有写过如果搭建自己内网的CDH Yum服务器,请参考<CDH 5.5.1 Yum源服 ...

  8. openstack 云平台API

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABVYAAAKrCAIAAACV8EEMAAAgAElEQVR4nOydeVgUaZ7n/W9299nd7n

  9. DelphiXE7操作sqlite数据库

    准备工作: 1.用SQLiteExpertPers建立一个sqlite数据库. 2.打开delphi xe7. 一.FireDAC法 设置库联接 1.放入FDConnection1控件 2.放入FDC ...

  10. CodeForces 682D Alyona and Strings (四维DP)

    Alyona and Strings 题目链接: http://acm.hust.edu.cn/vjudge/contest/121333#problem/D Description After re ...