• 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:

    image

    现在我们在GraphicsClass类中,装入一个tong.jpg文件,

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

        再观察texdesc的内容,可以看见mipmaps层是10,但纹理格式却是DXGI_FORMAT_R8G8B8A8_UNORM,可见默认情况下,系统会帮我们自动创建mipmaps层,但并没有自动选择压缩格式。

    image

          如果想让装入的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的输出信息,可以证实我们的设置是有效的。

    image

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

    image

    当然我们也可以分开创建纹理和纹理资源,效果是一样,分开创建的代码如下:

    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

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

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

  • 相关阅读:
    FirstApp,iphone开发学习总结10,归档(序列化、固化)
    FirstApp,iphone开发学习总结9,旋转
    iphone开发学习,开源之UIAlertViewBlocks
    FirstApp,iphone开发学习总结13,方向感应和通告
    iphone开发学习,开源之Three20
    FirstApp,iphone开发学习总结11,表操作(移动、删除)
    FirstApp,iphone开发学习总结12,播放音乐、视频
    iphone开发学习,开源,ASIHTTPRequest的学习
    iphone开发学习,开源之SVWebViewController,UIWebView支持后退、前进、刷新、使用Safari打开
    iphone开发学习,Block
  • 原文地址:https://www.cnblogs.com/mikewolf2002/p/2439550.html
Copyright © 2020-2023  润新知