仅供个人学习使用,请勿转载。谢谢!
在该演示程序中,我们将会为陆地和河流的场景演示程序中添加纹理。为陆地和河流的场景演示程序添加纹理主要有两个问题:
假设有一个位于平面xz内的mxn栅格,栅格内的顶点坐标和归一化纹理坐标一一对应,则纹理坐标系中第i行,第j列的顶点坐标为
\[
u = j·u1;v = i`v1
\]
\[ u1 = 1/(n-1);v1 = 1/(m-1) \]
上述公式的推演过程不展开介绍了。
根据上述公式,我们可以生成栅格的纹理坐标:
/*
** Summary:生成栅格顶点
** Parameters:
** width:栅格的宽度
** depth:栅格的深度
** m:行数
** n:列数
** Return:栅格的网格数据
*/
GeometryGenerator::MeshData GeometryGenerator::CreateGrid(float width, float depth, uint32 m, uint32 n)
{
//用作返回值的数据
MeshData meshData;
//顶点数量
uint32 vertexCount = m*n;
//三角形数量
uint32 faceCount = (m-1)*(n-1)*2;
//
// 创建顶点
//
float halfWidth = 0.5f*width;
float halfDepth = 0.5f*depth;
float dx = width / (n-1);
float dz = depth / (m-1);
float du = 1.0f / (n-1);
float dv = 1.0f / (m-1);
meshData.Vertices.resize(vertexCount);
for(uint32 i = 0; i < m; ++i)
{
float z = halfDepth - i*dz;
for(uint32 j = 0; j < n; ++j)
{
float x = -halfWidth + j*dx;
meshData.Vertices[i*n+j].Position = XMFLOAT3(x, 0.0f, z);
meshData.Vertices[i*n+j].Normal = XMFLOAT3(0.0f, 1.0f, 0.0f);
meshData.Vertices[i*n+j].TangentU = XMFLOAT3(1.0f, 0.0f, 0.0f);
//根据栅格拉伸纹理
meshData.Vertices[i*n+j].TexC.x = j*du;
meshData.Vertices[i*n+j].TexC.y = i*dv;
}
}
我们要在陆地网格上铺设纹理,但是目前为止我们所计算的纹理坐标仅限于单位域[0,1]内,所以,我们需要指定重复寻址模式,然后通过纹理变换矩阵使纹理坐标按比例增大5倍,这样纹理坐标将会被映射到区间[0,5]中,纹理也会在陆地网格上重复铺设5x5次了。
auto gridRitem = std::make_unique<RenderItem>();
gridRitem->World = MathHelper::Identity4x4();
XMStoreFloat4x4(&gridRitem->TexTransform, XMMatrixScaling(5.0f, 5.0f, 1.0f));
……
为了使水流纹理可以随着波浪几何体流动,我们需要在每一个更新周期中调用AnimateMaterial方法,以此根据时间函数在纹理平面内平移纹理坐标。我们使用重复寻址模式进行纹理贴图,这样就可以沿着纹理坐标平面接连不断的平移纹理坐标。下列代码展示了如何计算水流纹理的偏移向量,并且构建并设置流水的纹理矩阵
void TexWavesApp::AnimateMaterials(const GameTimer& gt)
{
// 水水流材质的纹理坐标滚动
auto waterMat = mMaterials["water"].get();
float& tu = waterMat->MatTransform(3, 0);
float& tv = waterMat->MatTransform(3, 1);
tu += 0.1f * gt.DeltaTime();
tv += 0.02f * gt.DeltaTime();
if(tu >= 1.0f)
tu -= 1.0f;
if(tv >= 1.0f)
tv -= 1.0f;
waterMat->MatTransform(3, 0) = tu;
waterMat->MatTransform(3, 1) = tv;
// 材质已经发生变化,更新常量缓冲区
waterMat->NumFramesDirty = gNumFrameResources;
}
原文:https://www.cnblogs.com/yaya12138/p/12233605.html