本发明涉及计算机图形技术领域,更具体地说,涉及一种三维渲染中ibl在硬件不支持某种特性时的兼容处理方法。
背景技术:
(ibl)是一种3d渲染技术,它通过捕捉现实世界中的光影信息,并把这些光影信息保存在图片上,通常这个图片是一个由6个2维图片包围成的立方体,这个图片中通常储存着高动态的光影信息。几乎所有的现代渲染引擎都提供了基于图像的照明,在ibl技术中,当在一个视角来观察一个物体时,所渲染物体的粗糙度决定它所需要反射的入射光线的锥的范围,例如在一个绝对光滑的物体上所反射的入射光线应该是一条直线(入射锥趋近一条直线),当一个绝对粗糙的物体时,所反射的入射光线锥就会为一个半球椎体。所以越粗糙的物体需要采样的入射锥范围越大。为了提高运算效率,通常会根据粗糙度生成好很多等级的预处理立方体图,这样在实时运算过程中就不需要做锥采样(大量运算开销),但是粗糙度是可以无限细分的,通常为了速度与数据上的平衡,只对粗糙度分为6个等级来做预处理,并把这些图片以不同的mipmap等级存储在一个立方体纹理中,当一个粗糙度处于2个相邻等级之间时,gpu可以使用texturecubelod的函数来在两个相邻的mipmap数据中进行线性差值,来取得当前粗糙度所对应的插之后近似的数据。
但不是每个gpu都支持这个texturecubelod扩展,或者是由于平台的原因导致不支持此扩展。那么对于任意粗糙度如何在不支持此扩展的情况下来实现ibl技术就成了一个关键问题。
技术实现要素:
为了解决上述问题,本发明提供一种基于ibl的兼容处理方法,根据待处理物体的粗糙程度生成若干预处理立方体图,将粗糙度分为6个等级来做预处理,所述基于ibl的兼容处理方法包括如下步骤:
s1、根据6个等级的粗糙程度生成6个等级的立方体图数据;
s2、将6个等级的立方体图数据以mipmaplevel为0的方式分别存放在6个立方体纹理中;
s3、计算粗糙度数值r(0到1之间)的ibl反射信息,依次对1至6号立方体纹理进行采样,采样值分别记为c0、c1、c2、c3、c4、c5,将该立方体纹理采样值存入到一个6个长度的数组中c数组;
s4、将r值乘以5得到r5,用r5进行取整运算得到r起始,用r起始加1得到r结束;
s5、用步骤s4中的r起始作为下标取得c起始=c数组【r起始】,用步骤s4中的r结束作为下标取得c结束=c数组【r结束】,计算差值比例值alpha=(r5-r起始)/(r结束-r起始);
s6、用步骤s5中的差值比例alpha计算插值后的最终数据c,c=c起始*(1-alpha)+c结束*alpha;
s7、重复步骤s3至s6,计算每一粗糙度数据的ibl反射信息,得到所有粗糙度数据对应的插值后的最终数据。
本发明的基于ibl的兼容处理方法能够在gpu不支持texturecubelod扩展的情况下来实现ibl技术的处理,极大的提高了3d图形渲染效果和通用性。
具体实施方式
为了更好的理解本发明,下面详细介绍本发明。
一种基于ibl的兼容处理方法,根据待处理物体的粗糙程度生成若干预处理立方体图,将粗糙度分为6个等级来做预处理,所述基于ibl的兼容处理方法包括如下步骤:
s1、根据6个等级的粗糙程度生成6个等级的立方体图数据;
s2、将6个等级的立方体图数据以mipmaplevel为0的方式分别存放在6个立方体纹理中;
s3、计算粗糙度数值r(0到1之间)的ibl反射信息,依次对1至6号立方体纹理进行采样,采样值分别记为c0、c1、c2、c3、c4、c5,将该立方体纹理采样值存入到一个6个长度的数组中c数组;
s4、将r值乘以5得到r5,用r5进行取整运算得到r起始,用r起始加1得到r结束;
s5、用步骤s4中的r起始作为下标取得c起始=c数组【r起始】,用步骤s4中的r结束作为下标取得c结束=c数组【r结束】,计算差值比例值alpha=(r5-r起始)/(r结束-r起始);
s6、用步骤s5中的差值比例alpha计算插值后的最终数据c,c=c起始*(1-alpha)+c结束*alpha;
s7、重复步骤s3至s6,计算每一粗糙度数据的ibl反射信息,得到所有粗糙度数据对应的插值后的最终数据。
本发明的基于ibl的兼容处理方法能够在gpu不支持texturecubelod扩展的情况下来实现ibl技术的处理,极大的提高了3d图形渲染效果和通用性。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明披露的技术范围内,根据本发明的技术方案及其发明构思加以等同替换或改变,都应涵盖在本发明的保护范围之内。