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 【转】

时间: 2024-11-05 13:33:42

GLSL实现Fresnel And Chromatic aberration 【转】的相关文章

Unity3D组件参考手册

Refer to the information on these pages for details on working in-depth with various aspects of Unity. 这些页面的参考信息,是有关Unity深入工作的各个方面的详细信息. The Unity Manual Guide contains sections that apply only to certain platforms. Please select which platforms you

走进VR游戏开发的世界

注: 原文2016年2月发表于公司内部社区, 最近才由同事转载出来, 删去了文中引用的一些内部文章和视频. 在这里我也只是把外网版本转过来, 留做备份. 背景介绍 我们组在2014年下半年尝试开发了一款 XboxOne 平台的体感游戏, 2015年上半年进行收尾工作的同时, 结合之前积累的体感交互经验, 开始进行 VR 游戏的预研工作. 在这近一年的时间里, 一方面从外界感受到了一股虚拟现实快速发展的潮流, 另一方面也体会到身边很多人对 VR 游戏的了解非常有限. 现在我们自己的VR游戏Demo

UI篇之——用户体验

内容均为原创,转载请注明处处谢谢. 用户体验(User Experience,简称UX)是一个关于用户(users)以及交互(interactive)技术系统领域的整体概念.具体来说,它代表了一个网站或者应用程序对其用户的可用性(usability)以及吸引程度.可用性高意味着交互产品能够让用户快速的实现他的目标.ISO 9241-110[1]以及Nielsen的研究[2]是这个领域中的“圣经”. 吸引力是指用户以及他所交互系统之间的情感.用户喜欢它吗?讨厌它吗?他们认为它是吸引人的.时尚的,还

中英文对照(材料研究方法)

Optical microscopy 光学显微镜 XRD (X-ray diffraction) X射线衍射 TEM  Transmission Electron Microscopy  透射电子显微镜 SEM  Scanning Electron Microscopy 扫描电子显微镜  注:扫描电子显微镜和透射电子显微镜的成像原理完全不同,它是使用从样品表面激发出的各种物理信号来调制成像的. resolution  分辨率 focal point    焦点 focal distance 焦距

人类视觉系统

源:The Human Visual System (Display Interfaces) Dynamic Range and Visual Response At any given moment, the eye is capable of discriminating varying levels of luminance over a range of perhaps 100:1 or slightly higher. If the brightness of a given obje

Unity中的后期处理:PostProcessing

"想要实现这个效果,让我们来编写一个Shader.." "Shader???" 相信绝大多数开发者都有看过那些炫酷的效果而跃跃欲试却又对Shader代码望而却步的经历,新版本的unity新增的PostProcessing组件,让许多人看到了希望,虽然效果数量有限,却对于开发来说有很大的收益. 安装PostProcessing PostProcessing是unity内置的后期效果增强组件,可以在极短的时间内得到各种常用特效的效果,对于编写Shader的苦手(比如在下

Fresnel效果和颜色色散(Using OpenGL & Cg)

1.Fresnel效果 一般来说,当光到达2种材质的接触面时,一些光在接触面的表面被反射出去,而另一部分光将发生折射穿过接触面,这个现象称为Fresnel效果.Fresnel公式描述了多少光被反射和多少光被折射.下面是Fresnel公式的一个近似: reflectionCoefficient=max(0,min(1,bias+scale×(1+I·N)power)) 反射系数reflectionCoefficient的范围被限制在[0,1]之间,我们根据下面的公式使用reflectionCoef

GLSL实现Interactive Fluid 流体【转】

http://blog.csdn.net/a3070173/archive/2008/12/08/3479477.aspx 完成的部分: 1.流体本身的绘制和更新 未解决的部分: 1.由于采用经过抖动的屏幕坐标进行折射图纹理采样,在设置了GL_CLAMP_TO_EDGE之后仍然会 导致边沿采样走样,仔细对比了游戏编程精粹6的样例,发觉在OpenGL上设置了与D3D对应的OpenGL 纹理环绕参数,但仍未能避免这个问题. 2.反射图在进行采用纹理坐标抖动后发生采样错误. Demo效果截图: exe

第4章:缓冲区、着色器、GLSL

原文链接: http://www.rastertek.com/gl40tut04.html Tutorial 4: Buffers, Shaders, and GLSL This tutorial will be the introduction to writing vertex and pixel shaders in OpenGL 4.0. It will also be the introduction to using vertex and index buffers in OpenG