GLSL中环境映射&菲涅尔反射效果

本文介绍了GLSL中如何利用立方体贴图纹理实现环境映射,详细阐述了计算反射和折射方向向量的过程,并探讨了菲涅尔反射效果的原理及其在GLSL中的实现方法,通过代码示例展示了如何在顶点和片段着色器中应用这些效果。
摘要由CSDN通过智能技术生成

立方体贴图纹理与菲涅尔反射效果(Fresnel reflection)简介

环境映射

光滑物体表面的鏡面反射效果及投射效果可以极大提升渲染场景的真实性。然而,为了正确模拟这类效果,需要用到光线追踪等非常耗时的方法。由于影响渲染物体的外在因素只有周围的远景,我们可以直接使用周围环境的远景贴图来实现这种效果。这种方法称为环境映射,一般分为贴在球体上的球形映射(Sphere maping),和贴在立方体上的立方体映射(Cube maping)。下图为立方体贴图纹理示例。

cube_map.jpg

在OpenGL中

GL_TEXTURE_CUBE_MAP

用于声明立方体贴图纹理类型,用以下的设定,可以自动生成立方体贴图纹理用的贴图坐标。

glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);

上述代码指定生成坐标模式为 GL_REFLECTION_MAP 。


下文使用GLSL计算反射折射向量,然后参照立方体贴图纹理实现反射折射效果。

计算反射方向向量

通过以下公式计算反射向量

fresnel.eq1.gif

计算反射向量的shader代码如下.

  1
  2
  3
  4
  5
  6
 
vec3 Reflection(vec3 I, vec3 N)
{
    float cos_theta = dot(-I, N);
    vec3 R = 2*N*cos_theta+I;
    return (cos_theta > 0 ? normalize(R) : vec3(0.0));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值