GPU Gems1 - 19 基于图像的光照(Image-Based Lighting)

这篇文章打破了当时立方体贴图环境(Cube-Map Environment)用法的桎梏,深入研究了更多可能的逼真光照效果。文章主要研究了基于图像的光照(Image-Based Lighting,IBL),包括局部化的立方体映射,类似于使用基于图像的局部光照(Localizing Image-Based Lighting),然后介绍了如何把哪些重要的技巧用于着色模型,包括逼真的反射、阴影和漫反射/环境项。

cube map反射总是使它好像在无限远处,只与观察角度有关(想象一下skybox),这限制了它对小的封闭环境的应用.

                                                  

传统cube map反射贴图

 

  在室内环境移动模型时,环境最好是近距离的cube map,距离的大小与当前的房间类似。当模型移动式,根据模型在房间中的位置进行反射。只要加很少的shader代码就能将反射局部化。这种方法得到的模拟效果使人感到更为可靠和逼真。尤其在包含窗户,屏幕和其他可识别光源的环境中。而只要加入很少的Shader数学就能将反射局部化。具体可以看原文贴出的Shader源码。

 

局部化的反射

 

不同位置上的局部反射

 

顶点shader:由cpu传入世界空间和光照空间的矩阵等信息,在顶点shader中将点和矢量转换两次,先由模型空间转换到世界空间,然后从世界空间转换到光照空间。具体代码如下:

Example 19-1. Vertex Shader to Generate World-Space and Lighting-Space Coordinates

vertexOutput reflectVS(appdata IN,uniform float4x4 WorldViewProjXf,uniform float4x4 WorldITXf,uniform float4x4 WorldXf,uniform float4x4 ViewITXf,uniform float4x4 LightingXf,uniform float4x4 LightingITXf)
{vertexOutput OUT;OUT.TexCoord = IN.UV;float4 Po = float4(IN.Position.xyz,1.0); // pad to "float4"OUT.HPosition = mul(WorldViewProjXf, Po);float4 Pw = mul(WorldXf, Po); // world coordinatesfloat3 WorldEyePos = ViewITXf [3].xyz;float4 LightingEyePos = mul(LightingXf, float4(WorldEyePos, 1.0));float4 Pu = mul(LightingXf, Pw);float4 Nw = mul(WorldITXf, IN.Normal);float4 Tw = mul(WorldITXf, IN.Tangent);float4 Bw = mul(WorldITXf, IN.Binormal);OUT.LightingEyeVec = (LightingEyePos - Pu).xyz;OUT.LightingNormal = mul(LightingITXf, Nw).xyz;OUT.LightingTangent = mul(LightingITXf, Tw).xyz;OUT.LightingBinorm = mul(LightingITXf, Bw).xyz;OUT.LightingPos = mul(LightingXf, Pw).xyz;return OUT;
}

片元shader:给定待着色点的位置和矢量,在光照空间计算反射矢量,它的起点是光照空间的表面,通过解球的二次方程,让矢量与那个球面相交,球面中心在照明空间的原点,半径=1.0。得到反射矢量后就可以采样从cube map采样。该shader还提供了几个另外的选项,以增加shader的逼真性,如表面颜色,Fresnel反射衰减等。

Example 19-2. Localized-Reflection Pixel Shader

float4 reflectPS(vertexOutput IN,uniform samplerCUBE EnvMap,uniform sampler2D NormalMap,uniform float4 SurfColor,uniform float Kr, // intensity of reflectionuniform float KrMin, // typical: 0.05 * Kruniform float FresExp, // typical: 5.0uniform float Bumpiness // amount of bump) : COLOR
{float3 Nu = normalize(IN.LightingNormal);// for bump mapping, we will alter "Nu" to get "Nb"float3 Tu = normalize(IN.LightingTangent);float3 Bu = normalize(IN.LightingBinorm);float3 bumps = Bumpiness *(tex2D(NormalMap, IN.TexCoord.xy).xyz - (0.5).xxx);float3 Nb = Nu + (bumps.x * Tu + bumps.y * Bu);Nb = normalize(Nb); // expressed in user-coord spacefloat3 Vu = normalize(IN.LightingEyeVec);float vdn = dot(Vu, Nb); // or "Nu" if unbumped - see text// "fres" attenuates the strength of the reflection// according to Fresnel's lawfloat fres = KrMin + (Kr - KrMin) * pow((1.0 - abs(vdn)), FresExp);float3 reflVect = normalize(reflect(Vu, Nb)); // yes, normalize// now we intersect "reflVect" with a sphere of radius 1.0float b = -2.0 * dot(reflVect, IN.LightingPos);float c = dot(IN.LightingPos, IN.LightingPos) - 1.0;float discrim = b * b - 4.0 * c;bool hasIntersects = false;float4 reflColor = float4(1, 0, 0, 0);if (discrim > 0) {// pick a small error value very close to zero as "epsilon"hasIntersects = ((abs(sqrt(discrim) - b) / 2.0) > 0.00001);}if (hasIntersects) {// determine where on the unit sphere reflVect intersectsreflVect = nearT * reflVect - IN.LightingPos;// reflVect.y = -reflVect.y; // optional - see text// now use the new intersection location as the 3D directionreflColor = fres * texCUBE(EnvMap, reflVect);}float4 result = SurfColor * reflColor;return result;
}

另外,我们可以将3D几何体做成立方体贴图,并且在正常地渲染环境的时候,把贴图应用到该环境的物体上。也可以使用贴图作为环境,把它投射到较简单的几何体上。

立方体贴图也能用来决定漫反射光照。Debevec的HDRShop程序能够从映射立方体光照环境积分出全部的漫反射贡献度,那么通过把表面法线带入预先卷积的立方体贴图,能够简单地查询漫反射贡献。

基于图像的光照为复杂的光照计算提供了综合而廉价的替代品,将一点数学加入纹理方法,可以大大拓宽“简单”IBL效果,给3D图像提供更强的的方位感。

【关键词提炼】

基于图像的光照(Image-Based Lighting,IBL)

立方体贴图环境(Cube-Map Environment )

基于图像的局部光照(Localizing Image-Based Lighting)

 

 

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246291.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Polygonal-Light Shading with LTC

概述 如果我们有一个上半球的余弦分布函数(Do)(D_{o})(Do​),并对这个余弦分布函数进行一个矩阵(M)(M)(M)变换,变换为一个新的分布函数(D)(D)(D)。 DMDoD M D_{o}DMDo​ 这就是基本思想:用一个余弦分布函数来拟合出不同的分布函数&#xff…

GPU Gems1 - 20 纹理爆炸(Texture Bombing)

【章节概览】 这章介绍了纹理爆炸(Texture Bombing)和相关的细胞技术,它们能在Shader中增加视觉的丰富性,图像的多样性,并减少大块纹理图案的重复性。 【核心要点】 纹理爆炸(Texture bombing&#xff0…

Catlike Coding网站文章解析 -- 1.Procedural Grid

原文英文版链接https://catlikecoding.com/unity/tutorials/procedural-grid/,里面有每一部分的untiy工程链接,文章内容也更详实。 本章内容: 创建一系列点使用协程实现他们的摆放位置定义一个由三角形组成的平面自动生成法线添加纹理坐标和…

GPU Gems1 - 21 实时辉光(Real-Time Glow)

这章浅墨的文章讲的很细了,这里基本照扒一遍加深印象,原文链接:https://zhuanlan.zhihu.com/p/36499291 【章节概览】 这章讲到2D光照效果中的辉光(Glow)和光晕(Halo),展示了如何通…

Catlike Coding网站文章解析 -- 2.Procedural Grid

本章内容 创建一个闭合的cube mesh给cube添加带弧度平滑的边缘定义法线使用sub-meshes(子mesh)创建一个常规shader合并碰撞体1.合成一个cube 上一章https://mp.csdn.net/postedit/89474068我们已经实现了一个平面mesh。一个cube由6个平面组成&#xff…

GPU Gems1 - 23 景深技术综述

本章主要介绍如何使用GPU创建实时的景深(Depth of Field)效果。参考浅墨总结文章的链接https://zhuanlan.zhihu.com/p/36499291 聚焦在枪上,背景模糊【核心要点】 物体在距离镜头的一个范围之内能够清晰成像(经过聚焦&#xff09…

GPU Gems1 - 22 颜色控制(Color Controls)

这章将在游戏中图像处理的讨论,扩展到技术和艺术上控制颜色的方法和应用,包括将图像从一些的色彩空间中移入移出,以及快速地给任何2D或3D场景加上精美的色调。 色彩校正(Color Correction)是几乎所有印刷和胶片成像应…

GPU Gems1 - 25 用纹理贴图进行快速过滤宽度的计算

这章介绍在片元shader中计算导数近似值的技术。这个技术把特别的值载入纹理mipmap的每个级别,以特殊的方式使用纹理映射硬件,计算出导数的结果,给出在屏幕上的像素间某个量的变化率。 Cg标准程序库提供ddx和ddy函数,计算任意关于…

GPU Gems1 - 24 高质量的过滤

在一些应用中,高质量的过滤是至关重要的,可以用像素shader代码执行任何过滤。GPU着色程序不用于CPU的主要之处在于:一般来说,CPU数学操作比纹理访问更快,而在GPU中恰恰相反。图像过滤的目的很简单:对于给你…

GPU Gems1 - 26 OpenEXR图像文件格式与HDR(The OpenEXR Image File Format and HDR)

【章节概览】 这章中,大名鼎鼎的工业光魔公司的Florian Kainz、Rod Bogart和DrweHess介绍了OpenEXR标准,这是一种当时新的高动态范围图像(HDRI)格式,在计算机成像的顶级电影中正在快速推广。对于基于图像照明的开发者…

ID Tech 5 中Megatexture针对地形的D3D9 基本实现原理

看GPU Gems2中的 使用基于GPU几何体裁剪图的地形渲染(Terrain Rendering Using GPU-Based Geometry Clipmaps)一文,对Clipmap技术不是理解很好,所以上网搜索一番,发现了这篇文章,实在是太棒的文章&#xff…

[知乎] 开放世界游戏中的大地图背后有哪些实现技术?

今天看到的一篇关于大世界的技术文章,写的太好了,膜拜大佬。各位如果有时间一定要看看 原文:http://gulu-dev.com/post/2014-11-16-open-world#toc_10 一、程序技术篇:算法和架构(Programming Algorithms & Arch…

GPU Gems2 - 2 使用基于GPU几何体裁剪图的地形渲染(Terrain Rendering Using GPU-Based Geometry Clipmaps)

【章节概览】 本章描述了一种通过顶点纹理实现的,基于GPU的几何体裁剪图(Geometry Clipmaps)技术。通过把地形几何体当做一组图像来处理,可以在GPU上执行几乎所有的计算,因此可以减少CPU的负载。且该技术较为容易实现…

球谐光照

一.原理 球谐光照实际上是一种对光照的简化,对于空间上的一点,受到的光照在各个方向上是不同的,也即各向异性,所以空间上一点如果要完全还原光照情况,那就需要记录周围球面上所有方向的光照。注意这里考虑的周围环境往…

图像色调,饱和度,对比度等相关定义

RGB颜色模型 RGB颜色模型也就是我们最常用的三原色,红绿蓝。RGB颜色模型在混色时属于加法混色,RGB中每种颜色数值越高,色彩越明亮。RBG为(0,0,0)时为黑色,RGB为(255,255,255)时为白…

各Rendering Path技术以及其在Unity中的实现

Rendering Path其实指的就是渲染场景中光照的方式。由于场景中的光源可能很多,甚至是动态的光源。所以怎么在速度和效果上达到一个最好的结果确实很困难。以当今的显卡发展为契机,人们才衍生出了这么多的Rendering Path来处理各种光照。 一. 正向渲染Fo…

GPU Gems2 - 3 几何体实例化的内幕(Inside Geometry Instancing)

文章部分内容摘自 https://zhuanlan.zhihu.com/p/38411575 【章节概览】 本章讨论了在Direct3D中渲染一个几何体的许多独特实例(Instance)的技术细节问题,对几何体实例(Geometry Instancing)的技术内幕进行了分析。 【…

GPU Gems2 - 4 分段缓冲(Segment Buffering)

文章参照该文 https://zhuanlan.zhihu.com/p/38411575 【章节概览】 本章介绍了一项可以明显减少一个显示帧中渲染的批次数目的技术——分段缓冲(segment buffering),以及其改进。 【核心要点】 分段缓冲(segment buffering&…

GPU Gems2 - 6 用多流来优化资源管理(Optimizing Resource Management with Multistreaming)

本文摘自https://zhuanlan.zhihu.com/p/38411575 【章节概览】 现代实时图形应用程序最困难的问题之一是必须处理庞大的数据。复杂的场景结合多通道的渲染,渲染起来往往会较为昂贵。 首先,多流(Multistreaming)技术由微软在Dire…

GameObject数组逐渐消失

GameObject数组逐渐消失 我做了10个物体需要每隔俩秒消失一个。 我是这样做的: 我先梳理出大概我需要怎么做的,第一步先引用预制体然后再创建一个数组最后是代码主体。 在start里先把起始时间设好,然后再看Nos方法time是让他时间自己在加&am…