首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > windows >

Windows 八 Directx 开发学习笔记(十一)地形纹理贴图

2013-01-02 
Windows 8 Directx 开发学习笔记(十一)地形纹理贴图前一篇实现木箱贴图时,木箱的六个面都正好用一整张纹理

Windows 8 Directx 开发学习笔记(十一)地形纹理贴图

前一篇实现木箱贴图时,木箱的六个面都正好用一整张纹理图,即六个面的纹理坐标均在[0,1]内。然而在为比较大的模型贴图时,像山峰河谷模型,如果只用一张纹理图,那么每个三角形只得到几个纹理元素,无法为提供足够高的分辨率。这时可以在模型表面上平铺纹理贴图,像给墙面贴磁砖一样,只需要知道一个单位的贴图,就能铺满整个表面,从而获得较高的分辨率。实现起来其实很简单,只要变换纹理坐标的范围,同时将纹理寻址模式设置为重复即可。

纹理坐标范围变换有两种方式,很简单,如图1:

Windows 八 Directx 开发学习笔记(十一)地形纹理贴图

其中x,y是原始纹理坐标,为了能与4*4的变换矩阵相乘,将其扩展为4元向量。等号左边是一种变换方式,使用变换矩阵进行纹理坐标变换,可用GPU计算。等号右边是第二种变换方式,直接生成变换后的纹理坐标,由CPU计算。本文选择的是第一种变换方式。

下面就开始给学习笔记(九)实现的山峰和水面模型贴图。

依然是先修改HLSL代码。在顶点着色器的输入输出结构中添加用于存储纹理坐标的成员tex。并在ModelViewProjectionConstantBuffer里添加texTransform成员,用于存储缩放和平移变换矩阵。


图2载入的是rock纹理:

Windows 八 Directx 开发学习笔记(十一)地形纹理贴图

以上两个模型中,水面纹理是不变的,而且没有流动的效果。简单的流动效果可以通过纹理坐标随时间偏移实现。

在Renderer类里添加偏移量成员:

// 设置水面纹理缩放和偏移量XMMATRIX waterScale = XMMatrixScaling(5.0f, 3.0f, 0.0f);XMMATRIX waterOffset = XMMatrixTranslation(m_waterTexOffset.x,m_waterTexOffset.y, 0.0f);XMStoreFloat4x4(&m_constantBufferData.gTexTransform,XMMatrixTranspose(waterScale*waterOffset));

 本篇文章的源代码

 Direct3DApp_HillWaveTexture

 

热点排行