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对应的变量
浙公网安备 33010602011771号