GLSL实现Fresnel And Chromatic aberration

  1. 使用Shader实现菲涅尔和颜色色散效果很简单,在Cg教程和OpenGL Shader Language都有较
    为详细的介绍,个人觉得需要注意的地方是反射向量和折射向量应该在世界空间中进行计算,
    在模型空间和照相机空间中计算都会导致错误的结果.
  2. 具体着色器代码:
    顶点着色器:
    const float g_fEta = 0.66; // 空气和玻璃的折射材质比例
    const float g_fEtaR = 0.65;
    const float g_fEtaG = 0.67;
    const float g_fEtaB = 0.69;
  3. 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));
  4. uniform vec3 g_vec3CamerePositionInWorld;
    uniform int g_iRenderMode;
  5. 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;
  6. 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);
  7.  // 计算反射和折射光线
     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;
     }
  8.     gl_Position = ftransform();
    }
    }
  9. 片元着色器:
    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;
  10. uniform samplerCube g_Cubemap;
    uniform int g_iRenderMode;
  11. 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);
    }
  12. Demo效果图:
  13. exe文件:http://www.fileupyours.com/view/219112/GLSL/Fresnel%20And%20Chromatic%20aberration%20Demo.rar
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值