原文: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)的更多相关文章

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

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

  2. Directx11教程(43) 纹理映射(13)-动态纹理映射

    原文:Directx11教程(43) 纹理映射(13)-动态纹理映射      本篇教程中,我们将在前面基于光照的地形与水面程序里面加上纹理映射,而且我们会基于时间动态改变水面的纹理坐标,实现水面纹理 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 你所不知道的Mac截图的强大

    Mac的截图功能扩展功能很强大的,不要用QQ那个COM+Ctrl+A弱爆了的截图了~ 首先说一下两种截图 1.Command+shift+3:全屏截图,保存截图到桌面 2.Command+shift+ ...

  2. IntelliJ IDEA 如何在同一个窗口创建多个项目

    一.IntelliJ IDEA与Eclipse的区别   二.在同一个窗口创建多个项目 1.打开IntelliJ IDEA,点击Create New Project 2.Java Enterprise ...

  3. 数据表中记录明明有,session.get(类.class, id);返回null

    出现null的处理思路首先检查数据库中是否真的有这个记录 确实存在的,用接口查一下最大值,也是存在的,数据库连接正常 写sql也可以查得到 然而诡异的事情出现了 难道是一直在用的dao代码出了问题? ...

  4. Python Flask高级编程之从0到1开发《鱼书》精品项目

    Python Flask高级编程之从0到1开发<鱼书>精品项目     整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感 ...

  5. 启动easy-mock

    1.启动mongodb 启动mongodb服务器: /usr/local/mongodb/bin/mongod  -config  /usr/local/mongodb/data/mongodb.co ...

  6. MySQL系列(十)--用户权限及远程访问

    本文基于MySQL8.0,记录一下完整的远程访问的过程,以及这个过程中可能遇到的问题,MySQL运行在阿里云服务器,操作系统:CentOS 7.6 64位 顺便说下,买服务器还是要双十二这种拉新活动再 ...

  7. Python中的一些模块用法

    python中os模块用法 python之模块之shutil模块 -------------------------------os模块-------------------------------- ...

  8. PHP搜索优化 sphinx 实战

    环境:win7 64 wamp 解压sphinx安装包后,简历如下结构.注意,conf目录是我的配置文件目录 在conf目录下,简历newdefend.conf文件,配置内容如下 # 配置数据源 so ...

  9. C#5.0 异步编程async/await用法

    微软在发布VS2012的同时推出了C#5.0,其中包含了async和await 代码如下: class Program { private static readonly Stopwatch watc ...

  10. ES6 promise 封装http请求

    今天研究了一下同事封装的http请求,用的是promise. 大结构是: const __fetch = (url, data = {}, config = {}) => { let param ...