Real-Rime Rendering (3) - 纹理(Texturing)

发布时间:2020-07-13 11:43:08 作者:拳四郎
来源:网络 阅读:447

简介

      在图形学中,Texturing是一个将物体表面绘制上图像或者其他数据的过程。纹理贴图通过修改物体表面的渲染效果,达到一种更加真实渲染的目的。


渲染管线(Textureing Pipeline)

       物体表面的渲染颜色由光照,材质,视口位置和透明度决定。纹理可以改变物体表面的颜色值,而凹凸(bump texture) 改变的是法线。

       整个贴图的过程可以描述为一个贴图管线:

Real-Rime Rendering (3) - 纹理(Texturing)

         之所以把贴图的过程细分为几个阶段,是因为每个阶段都为程序员提供了可控制性。

         以一个墙面的贴图为例,来描述整个阶段.

Real-Rime Rendering (3) - 纹理(Texturing)

1.找到需要贴图的位置的空间坐标 (x,y,z) ; 

2.将该位置进行投影,3D->2D, (x,y,x) -> (u,v) ,这个变换等同于将坐标乘以一个正交矩阵。

3. u,v 的坐标范围为 (0,1),这样做的目的是为了适应不同分辨率的纹理。u,v的值就用于确定该点的颜色值,通过查找内存中的纹理,将 u,v 由转换到纹理的二维坐标上(相乘就行),就可以确定颜色值了,这个值就是物体的 diffuse color。



投射过程(Projector function)

       纹理管线的第一个过程就是获取物体表面的空间坐标,然后投影到(u,v)空间上,uv空间是纹理的二维空间,(u,v)坐标通常是由3D设计师通过3D建模工具来标定的,这个过程通常称为uv展开,目的就是生成纹理坐标。投影的方法包括球投影,圆柱投影,平面投影。

        在非交互行的渲染中,贴图过程就在渲染过程中,整个场景可能就只使用一种贴图方式,但通常设计师会把模型进行分割并对各个模型使用不停的贴图方法。在实时渲染的时候,投影过程通常在建模阶段完成,而投影的结果会存储在顶点中,或者在shader中完成,这样就可以实现动态的贴图,比如环境贴图 (environment mapping).

        虽然有很多种方法来实现贴图,但是思路都是一样的:通过插值来确定便面的参数,然后去查找对应的纹理值。


依附阶段(Corresponder function)

       插值节点能够将参数空间的组表(u,v)转化到纹理空间坐标,这将为赋材质提供很大的灵活性,很常用的一个功能就是3d游戏中的换妆。

       常用的一种依附方式就是矩阵运算,可以在shader中进行,另一种情况是控制纹理在问题贴不到的地方的处理方式,在OpenGL中该控制由 glTexParameter来实现。


纹理值(Texture value)

       依附阶段之后就可以得到 u,v 的坐标了,通过u,v  的坐标和纹理贴图就可以很容易地得到颜色值,大部分渲染中使用的都是图像纹理,一维,二维或者三维,但是在procedual texture中是不同的,在procedual texturing 中,并不是查找内存中的纹理值来得到rgb值的,而是通过计算获得。

        关于颜色信息的表示,最简单的就是Rgb值,虽然也可以使用灰度值,那就是黑白画了。还有就是Rgba,a表示alpha,多出一个值来表示透明度。法线贴图中,还有更多的颜色信息。


贴图缓存(Texture catching)

       在复杂的应用中,可能需要用到大量的贴图,用于存放纹理的高速缓存依硬件的不同而不同,但总归一句话 - 不够用。解决的方法有很多,总归一句话:寻找平衡点。

       一种策略是将纹理的体积设计得很小,牺牲一些精度,即使一次性全部加载到内存中也OK,典型的用空间换时间。

        还有就是利用OS中的内存调度策略了,比如LRU (Least recently used)。每一次加载纹理的时候都给该纹理一个时间戳,当需要加载新的纹理的时候,如果内存够用,直接加载,不够用就把最久未使用的那个纹理踢除,然后加载。

        加载纹理会耗费可观的时间(从硬盘到内存当然耗时啊!),大部分情况下不可能一次性加载全部纹理,一种解决方案就是预加载。


参考

Real-Time Rendering 3rd

推荐阅读:
  1. Detours Hook
  2. Real-Rime Rendering (10) - 图形硬件及学习小结(Graphics Hardware)

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

游戏 图形 opengl

上一篇:Django模板--csrf伪造

下一篇:一套老旧ASP+Access的复活记

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》