现在我们在myTutorialD3D11_5的基础上,来逐步编码实现纹理映射,之所以在myTutorialD3D11_5基础上改写,是因为这个工程只是画了一个三角形,便于我们贴一个纹理上去,然后改变纹理采样状态,观察纹理贴图的变化。

首先,我们不再为每个顶点赋颜色值,用一个纹理坐标代替,这样在ps中我们可以通过采样纹理,得到物体表面的颜色。

对Color.vs和Color.ps做以下变化:

在Color.vs中,我们改变顶点输入和输出结构,去掉color,增加tex,表示纹理坐标。

struct VertexInputType
{
    float4 position : POSITION;
    float2 tex : TEXCOORD0; //纹理坐标
 
};

之前color.ps超级简单,只是返回input.color,现在我们稍作改动,增加了

Texture2D shaderTexture;
SamplerState SampleType;

//
// TYPEDEFS //
//
struct PixelInputType
{
    float4 position : SV_POSITION;
    float2 tex : TEXCOORD0;

};

// Pixel Shader

float4 ColorPixelShader(PixelInputType input) : SV_TARGET
{

float4 textureColor;
    // 用采样函数从纹理得到像素颜色.
    textureColor = shaderTexture.Sample(SampleType, input.tex);
    return textureColor;

}

接下来,我们要新建一个TextureClass,该类的主要功能是从一个文件中,载入纹理,创建纹理资源视图。

它的最主要功能其实就是一行代码:

result = D3DX11CreateShaderResourceViewFromFile(device, filename, NULL, NULL, &m_texture, NULL);

再下来,就是对ModelClass类的修改:

1、改动VertexType。

2、定义一个TextureClass* m_Texure,成员变量,用于载入纹理。

3、定义LoadTexture函数,用于m_Texure的初始化

4、定义GetTexture()用于返回m_Texure中的纹理资源视图

在ModelClass中,我们将改变顶点坐标和纹理坐标,希望画一个下面这样的图像 总共10个三角形,角上标的坐标为其纹理坐标。

最后就是ColorShaderClass的修改:

1、对Render和SetShaderParmeters函数,增加一个shader资源的参数,用于传入纹理对象。

bool Render(ID3D11DeviceContext*, int, D3DXMATRIX, D3DXMATRIX, D3DXMATRIX, ID3D11ShaderResourceView* );
private:
    bool SetShaderParameters(ID3D11DeviceContext*, D3DXMATRIX, D3DXMATRIX, D3DXMATRIX, ID3D11ShaderResourceView* );

2、定义一个纹理采样状态变量m_SampleState,并在初始化函数中,创建m_SampleState。

U、V、W坐标寻址模式都采用Wrap方式,Maginification,Minification以及MipMaps都采用线性差值方式,这样贴上纹理后,期望得到下面的输出图像,

// 创建纹理采样描述符
samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
samplerDesc.MipLODBias = 0.0f;
samplerDesc.MaxAnisotropy = 1;
samplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
samplerDesc.BorderColor[0] = 0;
samplerDesc.BorderColor[1] = 0;
samplerDesc.BorderColor[2] = 0;
samplerDesc.BorderColor[3] = 0;
samplerDesc.MinLOD = 0;
samplerDesc.MaxLOD = D3D11_FLOAT32_MAX;

// 创建纹理采样状态.
result = device->CreateSamplerState(&samplerDesc, &m_sampleState);

最后,在GraphicsClass中初始化m_Model变量时,传入tong.dds纹理

// 初始化模型对象.
result = m_Model->Initialize(m_D3D->GetDevice(), L"tong.dds");

if(!result)
    {
    MessageBox(hwnd, L"Could not initialize the model object.", L"Error", MB_OK);
    return false;
    }

最终程序执行后的界面如下:

完整的代码请参考:

工程文件myTutorialD3D11_27

代码下载:

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

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

Directx11教程(33) 纹理映射(3)相关推荐

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

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

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

    有时候,我们只有一个粗糙的模型,但是我们想渲染纹理细节,比如一个砖墙,我们如何在只有一个平面的时候,渲染出砖墙凹凸的效果. 比如只有这样的墙: 但是我们想要这样的效果: 怎么办呢?这时候,我们可以考虑 ...

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

    本章尝试使用纹理行列式,或者说纹理数组,在ps中,使用2个纹理,最终的像素颜色,是光照颜色*纹理1采样颜色*纹理2采样颜色,主要是想达到如下的效果: 把这两个图像以及光照产生的颜色融合生成以下图像: ...

  4. Directx11 教程(2) 基本的windows应用程序框架(2)

    Directx11 教程(2) 基本的windows应用程序框架(2) 原文:Directx11 教程(2) 基本的windows应用程序框架(2) 在本教程中,我们把前面一个教程的代码,进行封装.把 ...

  5. Directx11教程(14) D3D11管线(2)

    Directx11教程(14) D3D11管线(2) 原文:Directx11教程(14) D3D11管线(2) 下面我们来了解一些GPU memory的知识,主要参考资料:http://fgiese ...

  6. STM32 电机教程 33 - 无刷电机无感控制快速实现

    前言 上一节<STM32 电机教程 32 - 基于ST X-CUBE-SPN7 无刷无感电机库的电机驱动实现>给大家分享了ST的官方的无刷电机无感控制实现方案(基于NUCLEO-F103R ...

  7. STM32 基础系列教程 33 - Lwip_tcp_client

    前言 学习stm32 以太网接口使用,及LWIP使用,用LWIP快速实现一个TCP client网络通信功能, 学会基本LWIP的网络数据接收与发送功能,让初学者了解lwip(关于Lwip更多的功能介 ...

  8. Directx11教程四十六之FBX SDK

    在之前的DX11入门系列文章中,有篇有关 Directx11教程四十之加载OBJ模型 读取obj模型数据的博客.不过在obj读取的那篇博客我有些坑并没有说,就是我写的那个obj解析器只能解析特定的ob ...

  9. DirectX11教程

    最近在看DirectX11的教程,我对dx的接触也只是皮毛,边看边学吧. 看看网上只有w18767104183翻译了前三章,想着能不能继续他翻译一点呢,希望自己能一起成长. 点击图片是官方网站,译文点 ...

最新文章

  1. Sequence 带来的更多乐趣
  2. 第三次学JAVA再学不好就吃翔(part63)--String和int的相互转换
  3. 前端学习(1819):前端面试题之封装函数之冒泡排序
  4. PHP之MVC项目实战
  5. es 怎么嵌入 算法模型_快速ES-RNN: ES-RNN算法的GPU实现
  6. Tiny之7*24集群服务方案
  7. 大二第二学期周学习进度总结(十三)
  8. 使用Postman对Restful接口进行测试
  9. java cmd测试_Java SE 9:使用CMD提示开发和测试简单模块(第3部分)
  10. 分享:BlackHole开发日记-Java守护进程、Signal处理
  11. 概念+实战讲解,一文带你了解RFM模型【kaggle项目实战分享】数据分析
  12. 2022年3月22日
  13. java中,HashMap为什么每次扩容的倍数是2,而不是1.5或者2.5?
  14. java高德地图api开发平台_示例中心
  15. 用Python求解线性规划问题
  16. 稿定科技内推|稿定让设计更简单,只要你来,稿定就能给你无限可能
  17. arcgis10.2绘制矢量数据面polygon
  18. 诚诚富众选择投资理财产品
  19. LAMP平台QQ农场
  20. C语言编程:密码解密

热门文章

  1. 微信支付 支付成功后不跳转 ecshop微信支付 如下操作即可
  2. SSH远程启动tomcat后,退出SSH,tomcat也退出
  3. js 接收 json格式的字符串
  4. ubuntu 文件权限命令详解使用格式和方法
  5. cisco ***笔记
  6. 如何在Outlook 2003和OWA中允许接受EXE附件
  7. Android编程之ArrayList源码详解及使用
  8. Android4.2中Phone的P-sensor的应用的分析。
  9. Hibernate JPA中insert插入数据后自动执行select last_insert_id()解决方法
  10. 学习笔记 ---- 设计模式之观察者模式