DirectX11的纹理操作

这两天仔细分析了一下dx11的纹理读写,和dx9有很大区别

dx11的纹理创建调用接口是CreateTexture2D(), 需要传入一个D3D11_TEXTURE2D_DESC类型的结构体用来描述纹理属性,dx9的纹理属性是直接传入参数来设置的;

D3D11_TEXTURE2D_DESC结构体定义属性

typedef struct D3D11_TEXTURE2D_DESC
    {
    UINT Width;   //纹理宽度
    UINT Height;  //纹理高度
    UINT MipLevels; //0的时候创建纹理的时候创建的是全mipmap链,如果是1则不创建mipmap 注意,mipmap创建完是没数据的,还需要初始化
    UINT ArraySize; //因为dx11支持texture_array,这是纹理数组里面保存的纹理个数
    DXGI_FORMAT Format; //纹理格式
    DXGI_SAMPLE_DESC SampleDesc; //这个暂时不清楚是什么,count默认1,Quality默认0
    D3D11_USAGE Usage; //和MipLevels相关,默认D3D11_USAGE_DEFAULT
    UINT BindFlags; //这个是设置纹理需要绑定的标识,比如D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE表明纹理可以绑定到render_tagert和shader_resource
    UINT CPUAccessFlags; //默认0
    UINT MiscFlags; //默认0
    }

BindFlags很重要,决定纹理能够进行的操作类型,如果设置了D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE,则可以调用如下接口进行绑定

CreateRenderTargetView() 绑定render_target;

CreateShaderResourceView() 绑定shader_resource;

CreateRenderTargetView()中有一个结构体用来描述绑定的纹理类型:

typedef struct D3D11_RENDER_TARGET_VIEW_DESC
    {
    DXGI_FORMAT Format;           //纹理格式
    D3D11_RTV_DIMENSION ViewDimension;   //纹理类型,比如D3D11_RTV_DIMENSION_TEXTURE2DARRAY表明是一个二维纹理数组
    union
        {
        D3D11_BUFFER_RTV Buffer;
        D3D11_TEX1D_RTV Texture1D;
        D3D11_TEX1D_ARRAY_RTV Texture1DArray;
        D3D11_TEX2D_RTV Texture2D;    //对应纹理相关属性,比如纹理数组大小ArraySize,当前纹理在纹理数组中的索引FirstArraySlice
        D3D11_TEX2D_ARRAY_RTV Texture2DArray;
        D3D11_TEX2DMS_RTV Texture2DMS;
        D3D11_TEX2DMS_ARRAY_RTV Texture2DMSArray;
        D3D11_TEX3D_RTV Texture3D;
        }  ;
    }  D3D11_RENDER_TARGET_VIEW_DESC;

CreateShaderResourceView()中同样有一个结构体用来描述纹理类型

typedef struct D3D11_SHADER_RESOURCE_VIEW_DESC
    {
    DXGI_FORMAT Format;          //纹理格式
    D3D11_SRV_DIMENSION ViewDimension; //对应纹理类型
    union
        {
        D3D11_BUFFER_SRV Buffer;
        D3D11_TEX1D_SRV Texture1D;
        D3D11_TEX1D_ARRAY_SRV Texture1DArray;
        D3D11_TEX2D_SRV Texture2D;
        D3D11_TEX2D_ARRAY_SRV Texture2DArray; //对应纹理相关属性,比如纹理数组大小ArraySize,当前纹理在纹理数组中的索引FirstArraySlice,MipLevel和纹理创建设置相同
        D3D11_TEX2DMS_SRV Texture2DMS;
        D3D11_TEX2DMS_ARRAY_SRV Texture2DMSArray;
        D3D11_TEX3D_SRV Texture3D;
        D3D11_TEXCUBE_SRV TextureCube;
        D3D11_TEXCUBE_ARRAY_SRV TextureCubeArray;
        D3D11_BUFFEREX_SRV BufferEx;
        }  ;
    }  D3D11_SHADER_RESOURCE_VIEW_DESC;

 

创建完毕后,任何对render_target和shader_resource的写操作都会对纹理产生影响,也就是说如果把绑定后的render_target设置为context的当前render_target并绘制,纹理会保存相应的绘制结果,如果把绑定后的shader_resource赋值到shader的相关变量,则当前纹理会传递给shader对应的变量

 

posted @ 2016-01-15 16:34  我是赵日天  阅读(2163)  评论(0)    收藏  举报