• 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

  • 相关阅读:
    004---基于TCP的套接字
    003---socket介绍
    002---tcp/ip五层详解
    001---C/S架构
    008---re正则模块
    007---logging日志模块
    006---hashlib模块
    005---json & pickle
    004---os & sys
    22.解决 eclipse 与 AS 共用 SDK 导致 eclipse ADT 无法使用的问题
  • 原文地址:https://www.cnblogs.com/mazhenyu/p/3806621.html
Copyright © 2020-2023  润新知