Gamebryo3.0SDK翻译-Texturing
Texturing
一、 纹理基本常识
1. 简介
GB纹理系统包括:多纹理、投影纹理(Projected texture)、动态纹理、渲染纹理。
2. 纹理的基本使用
要想使用和标准材质一起使用纹理,应用程序必须做以下两件事:为数据流定义纹理坐标;挂载纹理属性(包括纹理资源、和纹理的处理方式)。
3. 纹理属性及其组成部分
纹理属性包括两大部分信息:
(1) 一个或多个Map,该Map定义每个纹理相关的设置。不同的Map代表不同类型的纹理特效。其中,Base Map(或者Diffuse Map)代表了物体的顶点自发光颜色。
(2) 纹理的挂载模式(texture-apply mode).定义了一组纹理如何影响顶点的最终颜色,一个NiTexturingProperty只能包含一个挂载模式。
NiTexturingProperty::Map包含了绘制绘制一个纹理到对象上的所有信息。该信息包括:
(1)一个指向纹理图像的指针
(2)纹理寻址模式。
(3)过滤模式。
(4)纹理坐标索引。
处理Base Map:NiTexturingProperty::GetBaseMap and SetBaseMap. NiTexturingProperty::GetBaseTexture, SetBaseTexture, GetBaseClampMode, SetBaseClampMode, GetBaseFilterMode, SetBaseFilterMode, GetBaseTextureIndex, and SetBaseTextureIndex.
4. 纹理对象
纹理对象基类:NiTexture
(1) NiSourceTexture:代表了从资源创建的纹理图,既包括标准的图像文件,或者RAM中的一块存储区域(buffer)。
(2) NiDynamicTexture :每一帧改变纹理内容的纹理。
(3) NiRenderedTexture :代表了从渲染场景创建的纹理图。该纹理图像来保存渲染场景,从而产生各种特效:倒影、阴影、内部电视机
(4)NiSourceCubeMap :使用立方体,三位的纹理坐标,而不是矩形、二维来代表纹理。
5. GB纹理的特性
6. 纹理坐标的寻址
Wrapping
Clamping
7. 纹理过滤
The following are the two filtering methods within a mipmap level:
· Nearest neighbor—picks the color of the closest texture pixel (texel) and uses it.
· Bilinear interpolation—linearly interpolates between the four texels that enclose the texture coordinate.
8. 纹理的和顶点颜色的混合方式
9. 基本Alpha混合和Alpha测试
无论使用Alpha混合还是Alpha测试,纹理必须具有Alpha通道。
Alpha混合
同时,应用程序必须包含如下条件:
(1)向对象添加NiAlphaProperty
(2)打开Alpha混合NiAlphaProperty::SetAlphaBlending(true)
(3) 确保Base Map纹理、顶点颜色、材质颜色含有相应的Alpha值
(4)设置原和目的Alpha混合函数::SetSrcBlendMode and SetDestBlendMode.
Alpha测试
Alpha测试必须保证混合模式为ALPHA_SRCALPHA, ALPHA_INVSRCALPHA即标准混合模式。Alpha测试会打开帧缓冲和深度缓冲区的写。
Alpha测试允许纹理的Alpha通道和全局值进行测试,当测试失败,则该像素将不会被写入帧缓冲区和深度缓冲区,从而避免了对该对象进行排序。
Alpha测试的要求
二、 多纹理
1. 简介
GB的接口没有限制多纹理的数量,但是渲染器却限制了。
GB支持两种多纹理处理:
(1)静态多纹理(static):只是对几何体表面进行描述,静态多纹理一Map的方式被挂载到NiTexturingProperty上。使用纹理坐标映射到几何体上。
(2)投影多纹理(projected):描述空间现象,如倒影、光柱…。投影多纹理被多个几何体接受,通过动态顶点光照,在低级别renderer通过动态生成纹理坐标来映射到几何体上。
2. 多纹理的硬件支持
3. 静态多纹理
每一种静态多纹理在NiTexturingProperty中拥有一个Map,Map对象会定义静态多纹理怎么加载到几何体上。
Dark Map(暗纹理)
Decal Map(贴花纹理)
Detail Map(细节纹理)
Gloss Map(高光纹理)
Bump Map(凹凸纹理)
Normal Map(发现纹理)
Parallax Map(四叉纹理)
Shader Map(着色纹理)
4. 投影多纹理(Projected Multitextures)
投影多纹理类似与光照,事实上,NiLight和NiTextureEffect(实现投影多纹理)都继承与NiDnamicEffect。
投影多纹理的类型决定了纹理的寻址模式和采样模式。
Environment Map
Light Map
Shadow Map
Fog Map
三、 使用静态多纹理
四、 使用投影多纹理
五、 纹理图
1. 使用NiSourceTexture对象
该纹理数据来自于:图像文件和存储区像素数据
图像文件支持:BMP、SGI RGB、TGA以及NIF
可以通过PixelData来创建NiSourceTexture,从而可以实现修改指定像素值的目的。
2. 使用NiRenderTexture对象
在生成NiRenderTexture对象时每一帧都需进行如下操作:
(1)使用Rendering to Texture来更新纹理内容
(2)绘制包含当前场景的纹理
3. 使用NiDynamicTexutre对象
动态纹理的差生不是通过rendering而是其它方法。
4. 创建NiSourceTexture对象
(1)通过纹理图创建
一旦NiSourceTexture被创建,文件名不能被改变,因为NiSourceTexutre在整个周期内使用文件名来代表该纹理资源。图像文件最好时2的次方大小。默认情况下系统不会为该它开辟一个单独的内存区域,应为它本省就有个baking store。
(2)通过NiPersistentSrcTendererData创建
(3)通过NiPixelData来创建
创建成功后NiSourceTexture只是保存了一个NiPiexelData的引用而不是拷贝数据
(4)格式(Format Preference)
FormatePrefs代表了纹理的格式如颜色信息、Alpha通道行为(none、on/off、smooth)以及是否需要多级处理(mipmapping)
(5)预加载载NiSourceTexture
载预加载模式下,纹理资源创建后是放在各自的存储区的,而不是显存。
(6)任意大小的纹理资源:GB支持
5. 创建NiRenderTexture对象
6. 创建NiDynamicTexture对象
7. 使用NiTexture纹理化几何体
8. 动态改变NiTexure
9. 动态改变NiSourceTexture
10. 动态改变NiRenderTexture
11. 动态改变NiDynamicTexture
12. 例子:更新NiRenderTexture
13. 预加载NiSourceTexture
六、 纹理格式