Directx11教程(35) 纹理映射(5)
到现在为止,我们的TextureClass初始化函数非常简单,说白了就是一行代码:
result = D3DX11CreateShaderResourceViewFromFile(device, filename, NULL, NULL, &m_texture, NULL);
这行代码装入一个dds文件,而且其它选项都设置为NULL,这时系统会使用装入文件本身的格式,比如我们装入的tong.dds, 前面我们为其产生了mipmaps层,并且设置surface格式为DXT5(对应于D3D11中BC3压缩格式)。这时我们可以看看生成的2d纹理使用了什么设置。
首先在的D3DX11CreateShaderResourceViewFromFile后面添加下面的代码,以便我们调试观察纹理格式:
ID3D11Texture2D* tex;
m_texture->GetResource((ID3D11Resource**)&tex);
D3D11_TEXTURE2D_DESC texdesc;
tex->GetDesc(&texdesc);
设置断点后,我们可以看到texdesc的内容,Mipmaps为10,纹理格式,为DXGI_FORMAT_BC3_UNORM:

现在我们在GraphicsClass类中,装入一个tong.jpg文件,
// 初始化模型对象.
result = m_Model->Initialize(m_D3D->GetDevice(), L"tong.jpg");
再观察texdesc的内容,可以看见mipmaps层是10,但纹理格式却是DXGI_FORMAT_R8G8B8A8_UNORM,可见默认情况下,系统会帮我们自动创建mipmaps层,但并没有自动选择压缩格式。

如果想让装入的jpg格式的纹理也使用压缩格式该怎么做呢?其实很很简单,就是在 D3DX11CreateShaderResourceViewFromFile中使用一个装入图像信息参数,比如下面的代码,我们装入tong.jpg文件时,将会使用DXGI_FORMAT_BC3_UNORM的压缩格式。
bool TextureClass::Initialize(ID3D11Device* device, WCHAR* filename)
{
HRESULT result;
D3DX11_IMAGE_LOAD_INFO loadInfo;
ZeroMemory( &loadInfo, sizeof(D3DX11_IMAGE_LOAD_INFO) );
loadInfo.BindFlags = D3D11_BIND_SHADER_RESOURCE;
loadInfo.Format = DXGI_FORMAT_BC3_UNORM;
loadInfo.MipLevels = D3DX11_DEFAULT; //这时会产生最大的mipmaps层。
loadInfo.MipFilter = D3DX11_FILTER_LINEAR;
// 从一个文件创建纹理资源视图.
result = D3DX11CreateShaderResourceViewFromFile(device, filename, &loadInfo, NULL, &m_texture, NULL);
if(FAILED(result))
{
return false;
}
//这些代码是调试纹理属性的...
ID3D11Texture2D* tex;
m_texture->GetResource((ID3D11Resource**)&tex);
D3D11_TEXTURE2D_DESC texdesc;
tex->GetDesc(&texdesc);
return true;
}
观察texdesc的输出信息,可以证实我们的设置是有效的。

如果在使用loadInfo的情况下,装入我们以前的tong.dds,会是什么效果呢?我们设置LoadInfo.Format为DXGI_FORMAT_BC2_UNORM,从下面图片可以看到此时的Format是BC2,而非tong.dds自己的BC3格式,可见LoadInfo定义的格式将会覆盖装入文件自己的格式。

当然我们也可以分开创建纹理和纹理资源,效果是一样,分开创建的代码如下:
ID3D11Texture2D * pTexture2D = NULL;
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
D3D11_TEXTURE2D_DESC desc;
D3DX11CreateTextureFromFile( device,filename, &loadInfo, NULL,(ID3D11Resource**)(&pTexture2D), NULL );
pTexture2D->GetDesc( &desc );
srvDesc.Format = desc.Format;
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
srvDesc.Texture2D.MostDetailedMip = 0;
srvDesc.Texture2D.MipLevels = desc.MipLevels;
device->CreateShaderResourceView( pTexture2D, &srvDesc, &m_texture );
完整的代码请参考:
工程文件myTutorialD3D11_28
http://files.cnblogs.com/mikewolf2002/d3d1127-28.zip
http://files.cnblogs.com/mikewolf2002/pictures.zip
Directx11教程(35) 纹理映射(5)的更多相关文章
- Directx11教程37 纹理映射(7)
原文:Directx11教程37 纹理映射(7) 本章是在教程35.36的基础上来实现一个光照纹理结合的程序,就是把场景中旋转的cube加上纹理. lighttex.vs中顶点的结构现在 ...
- Directx11教程(43) 纹理映射(13)-动态纹理映射
原文:Directx11教程(43) 纹理映射(13)-动态纹理映射 本篇教程中,我们将在前面基于光照的地形与水面程序里面加上纹理映射,而且我们会基于时间动态改变水面的纹理坐标,实现水面纹理 ...
- Directx11教程(42) 纹理映射(12)-简单的bump mapping
原文:Directx11教程(42) 纹理映射(12)-简单的bump mapping 有时候,我们只有一个粗糙的模型,但是我们想渲染纹理细节,比如一个砖墙,我们如何在只有一个平面的时候 ...
- Directx11教程41 纹理映射(11)
原文:Directx11教程41 纹理映射(11) 1.第一副图我们采用各性异性的滤波方式,并设置最大各性异性值为8. samplerDesc.Filter = D3D11_FILT ...
- Directx11教程40 纹理映射(10)
原文:Directx11教程40 纹理映射(10) 本章尝试使用纹理行列式,或者说纹理数组,在ps中,使用2个纹理,最终的像素颜色,是光照颜色*纹理1采样颜色*纹理2采样颜色,主要是想达到如 ...
- Directx11教程39 纹理映射(9)
原文:Directx11教程39 纹理映射(9) 在myTutorialD3D11_32中,我们在PlaneModelClass中增加一个纹理TextureClass* m_Texture;读 ...
- Directx11教程38 纹理映射(8)
原文:Directx11教程38 纹理映射(8) 上篇日志中,我们用纹理和光照颜色调制的方式得到最终颜色,本章我们尝试用纹理采样的颜色,直接做为材质的漫反射系数Kd,并用它来做光照计算,最后 ...
- Directx11教程36 纹理映射(6)
原文:Directx11教程36 纹理映射(6) 本章主要是整理代码,做以下两件事情: 1.把世界坐标矩阵的计算,放在GraphicsClass的渲染函数中,之前放在D3DClass中,而且只是 ...
- Directx11教程(34) 纹理映射(4)
原文:Directx11教程(34) 纹理映射(4) 本篇教程中,我们尝试在myTutorialD3D_27中改变采样状态描述符的各种设置,看纹理贴图的方式有什么变化. 原始的代码是: ...
随机推荐
- POSIX基本正则表达式和扩展正则表达式的比较
转自:http://book.51cto.com/art/201303/385961.htm 在读者正觉得正则表达式已经复杂得不能再复杂时,又会发现POSIX规范将正则表达式的实现方法分为了两种:基本 ...
- light oj 1057 状压dp TSP
#include <iostream> #include <cstdlib> #include <cstring> #include <queue> # ...
- jeecms系统_自定义对象流程
库内新增对象Products 的流程说明: 第一步: com.jeecms.cms.entity.assist.base下建立模型基础类,BaseCmsProducts.java com.jeecms ...
- SpringMVC配置顺序的问题
1:web.xml:web应用一经加载,先来找他 1):指明applicationContext的位置 2):引入spring监听,ContextLoaderListe ...
- mysql利用MySQLWorkbench生成数据表之间的关系图
先看结果,默认是展开的,我手动把表折叠了 那么如何实现呢 先点击这里 然后通过向导来创建即可,一直到finish就行了
- DOM4J -(XML解析包)
DOM4J - 简介 是dom4j.org出品的一个开源XML解析包.Dom4j是一个易用的.开源的库,用于XML,XPath和XSLT.它应用于Java平台,采用了Java集合框架并完全支持DOM, ...
- Object上的静态方法
内置提供了一个对象为 Object ,也被称之为是构造函数,用来创建对象用的.在 javascript 函数也是对象,是一种可被执行的对象,所以称Object为对象也是可以的.挂在函数上的方法,称之为 ...
- MapReduce:详解Shuffle(copy,sort,merge)过程(转)
Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方.要想理解MapReduce, Shuffle是必须要了解的.我看过很多相关的资料,但每次看完都云里雾里的绕着,很难理清大致的逻辑, ...
- Java 23 种设计模式的分类和功能
设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路.它不是语法规定,而是一套用来提高代码可复用性.可维护性.可读性.稳健性以及安全性的解决方案. 设计模式 ...
- 【Java爬虫】爬取南通大学教务处成绩
没使用自动登录,所以获取是比较麻烦.. 1.http://jwgl.ntu.edu.cn/cjcx 进入官网,进行账号密码登录 2.点击全部成绩查询(也一定要点进去,不然cookie不会返回值) ...