Gamebryo—Texturing

来源:互联网 发布:数据追溯 编辑:程序博客网 时间:2024/04/28 10:31

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) NiRenderedCubeMap

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. 纹理的和顶点颜色的混合方式

clip_image002

9. 基本Alpha混合和Alpha测试

无论使用Alpha混合还是Alpha测试,纹理必须具有Alpha通道。

Alpha混合

同时,应用程序必须包含如下条件:

(1)向对象添加NiAlphaProperty

(2)打开Alpha混合NiAlphaProperty::SetAlphaBlending(true)

(3) 确保Base Map纹理、顶点颜色、材质颜色含有相应的Alpha值

(4)设置原和目的Alpha混合函数::SetSrcBlendMode and SetDestBlendMode.

clip_image004

Alpha测试

Alpha测试必须保证混合模式为ALPHA_SRCALPHA, ALPHA_INVSRCALPHA即标准混合模式。Alpha测试会打开帧缓冲和深度缓冲区的写。

Alpha测试允许纹理的Alpha通道和全局值进行测试,当测试失败,则该像素将不会被写入帧缓冲区和深度缓冲区,从而避免了对该对象进行排序。

Alpha测试的要求

clip_image006

二、 多纹理

1. 简介

GB的接口没有限制多纹理的数量,但是渲染器却限制了。

GB支持两种多纹理处理:

(1)静态多纹理(static):只是对几何体表面进行描述,静态多纹理一Map的方式被挂载到NiTexturingProperty上。使用纹理坐标映射到几何体上。

(2)投影多纹理(projected):描述空间现象,如倒影、光柱…。投影多纹理被多个几何体接受,通过动态顶点光照,在低级别renderer通过动态生成纹理坐标来映射到几何体上。

clip_image008

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

三、 使用静态多纹理

四、 使用投影多纹理

五、 纹理图

clip_image010

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

六、 纹理格式