原文:Directx11教程(43) 纹理映射(13)-动态纹理映射

     本篇教程中,我们将在前面基于光照的地形与水面程序里面加上纹理映射,而且我们会基于时间动态改变水面的纹理坐标,实现水面纹理波动的效果。

      地形(山谷)以及水面都是基于网格的平面。

      对于地形,修改顶点类型为:

struct VertexType
    {
    D3DXVECTOR3 position;
    D3DXVECTOR3 normal;
    D3DXVECTOR2 texture; //纹理坐标
    D3DXVECTOR4 Kd; //材质的漫反射系数
    D3DXVECTOR4 Ks; //材质的高光系数
    };

    假设m,n为网格行数、列数,则纹理坐标计算如下:

float du = 10.0f / (n-1);
float dv = 10.0f / (m-1)

// 计算纹理坐标.
vertices[i*n+j].texture.x = j*du;
vertices[i*n+j].texture.y = i*dv;

其中du,dv中的10.0f,是我们把纹理坐标扩大10倍,大于[0,1]的纹理坐标会用wrap的方式使用纹理,这样在一个grid内,可以多次使用贴图,避免出现网格很大,而我们的纹理图片比较小,从而避免过度magnification的情形。

下面2个图是用10.0和2.0的比较结果,第一个图是2.0:

水面的纹理坐标计算方式和山谷基本相同,但是我们会在update函数中根据dt动态改变坐标,这样会实现水面漂移的效果。

    // 更新顶点缓冲.
    float du = 5.0f / (m_NumCols-1);
    float dv = 5.0f / (m_NumRows-1);

    //我们根据时间动态计算纹理坐标
    static float mWaterTexOffsetX = 0;
    static float mWaterTexOffsetY = 0;
   
    mWaterTexOffsetY += 0.1f*dt;
    mWaterTexOffsetX = 0.25f*sinf(4.0f*mWaterTexOffsetY);

    vertices[i*m_NumCols+j].texture.x = j*du + mWaterTexOffsetX;
    vertices[i*m_NumCols+j].texture.y = i*dv + mWaterTexOffsetY;

      当然,我们也通过矩阵的方式,来缩放、平移以及旋转纹理坐标,这样的话,就需要定义个shader常量矩阵,在shader中用它来乘以纹理坐标,实现我们想要的效果。纹理旋转经常用来实现动态粒子的效果,比如火焰等等。

     最后,我们在GraphicsClass中,调用光照纹理渲染类,就可以得到最终结果:

//用light shader texture渲染
result = m_LightTexShader->Render(m_D3D->GetDeviceContext(), m_Model->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix,
    light, material, camera,m_TexManager->createTex(m_D3D->GetDevice(),string("grass.dds")));

result = m_LightTexShader->Render(m_D3D->GetDeviceContext(), m_WaterModel->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix,
    light, material, camera,m_TexManager->createTex(m_D3D->GetDevice(),string("water2.dds")));

完整的代码请参考:

工程文件myTutorialD3D11_38

代码下载:

http://files.cnblogs.com/mikewolf2002/d3d1127-28.zip

http://files.cnblogs.com/mikewolf2002/pictures.zip

Directx11教程(43) 纹理映射(13)-动态纹理映射的更多相关文章

  1. Directx11教程(42) 纹理映射(12)-简单的bump mapping

    原文:Directx11教程(42) 纹理映射(12)-简单的bump mapping        有时候,我们只有一个粗糙的模型,但是我们想渲染纹理细节,比如一个砖墙,我们如何在只有一个平面的时候 ...

  2. Directx11教程41 纹理映射(11)

    原文:Directx11教程41 纹理映射(11)     1.第一副图我们采用各性异性的滤波方式,并设置最大各性异性值为8.     samplerDesc.Filter =  D3D11_FILT ...

  3. Directx11教程40 纹理映射(10)

    原文:Directx11教程40 纹理映射(10)      本章尝试使用纹理行列式,或者说纹理数组,在ps中,使用2个纹理,最终的像素颜色,是光照颜色*纹理1采样颜色*纹理2采样颜色,主要是想达到如 ...

  4. Directx11教程39 纹理映射(9)

    原文:Directx11教程39 纹理映射(9)     在myTutorialD3D11_32中,我们在PlaneModelClass中增加一个纹理TextureClass* m_Texture;读 ...

  5. Directx11教程38 纹理映射(8)

    原文:Directx11教程38 纹理映射(8)      上篇日志中,我们用纹理和光照颜色调制的方式得到最终颜色,本章我们尝试用纹理采样的颜色,直接做为材质的漫反射系数Kd,并用它来做光照计算,最后 ...

  6. Directx11教程37 纹理映射(7)

    原文:Directx11教程37 纹理映射(7)     本章是在教程35.36的基础上来实现一个光照纹理结合的程序,就是把场景中旋转的cube加上纹理.    lighttex.vs中顶点的结构现在 ...

  7. Directx11教程36 纹理映射(6)

    原文:Directx11教程36 纹理映射(6)    本章主要是整理代码,做以下两件事情: 1.把世界坐标矩阵的计算,放在GraphicsClass的渲染函数中,之前放在D3DClass中,而且只是 ...

  8. Directx11教程(35) 纹理映射(5)

    原文:Directx11教程(35) 纹理映射(5)     到现在为止,我们的TextureClass初始化函数非常简单,说白了就是一行代码: result = D3DX11CreateShader ...

  9. Directx11教程(34) 纹理映射(4)

    原文:Directx11教程(34) 纹理映射(4)     本篇教程中,我们尝试在myTutorialD3D_27中改变采样状态描述符的各种设置,看纹理贴图的方式有什么变化. 原始的代码是:     ...

随机推荐

  1. Django项目:CMDB(服务器硬件资产自动采集系统)--03--03CMDB信息安全API接口交互认证

    #settings.py """ Django settings for AutoCmdb project. Generated by 'django-admin sta ...

  2. 基于阿里云安装脚本扩展 之 自动安装mongodb及php扩展

    好久没有发布文章了,有点跟不上当初这个博客的初衷.为了使自己的博客更新不半途而废,今天特意再写了一个自动安装脚本,一样是基于阿里云的服务端安装脚本进行的扩展.闲话不说,直接放代码: #!/bin/ba ...

  3. PAT甲级——A1018 Public Bike Management

    There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...

  4. idea创建管理项目

    创建分支时以master为准,这时master上的代码已合并完毕,idea右下角可以看到本地和远程的分支,在本地合并时,先切换到master上,选中要合并到master的分支,选择merge into ...

  5. Visual Studio 2019 正式发布

    原文链接: https://www.oschina.net/news/105629/vs2019-general-availability 如约而至,微软已于今天推出 Visual Studio 20 ...

  6. mybatis深入理解(六)-----MyBatis的二级缓存的设计原理

    MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能.本文将全面分析MyBatis的二级缓存的设计原理. 1.MyBatis的缓存机制整体设计以及 ...

  7. python模拟浏览器文件上传,csrf放行

    服务器端视图函数 from django.shortcuts import render,HttpResponse from django.views.decorators.csrf import c ...

  8. XML解析器之JAXP与DOM4J

    XML是一种数据格式,那么需要对XML文件进行操作就需要用到XML解析器---------针对dom方式和sax方式提供了不同的解析技术-----需要不同的XML解析器 dom方式:会把文档中所有元素 ...

  9. 操作系统Lab1 详解(boot|kern/debug)

    总体 : boot kern libs tools boot asm.h bootmain.c bootasm.S asm.h 汇编头文件 SEG_NULLASM 定义一个空段描述符 SEG_ASM ...

  10. Zookeeper安装过程

    zookeeper的安装我反反复复安装了三次,前两次在root用户下安装都失败了,都启动不起来,第三次我改成普通用户安装,没想到成功了,很不可思议,步骤完全一样,接下来介绍一下具体的安装步骤: 1. ...