您的位置:首页 > 其它

DirectX 11 填充二维纹理

2015-05-27 21:36 246 查看
最近写程序刚好需要将数据写到二维纹理中,然后显示出来看数据是否正确。以这个笔记小小的记载下

srand( 0 );
DirectX::XMFLOAT2 data[128 * 128];
for( int i = 0; i < 128 * 128; i++ )
{
data[i].x = rand() / ( float )RAND_MAX;
data[i].y = rand() / ( float )RAND_MAX;
}

D3D11_TEXTURE2D_DESC tex_desc;
ZeroMemory( &tex_desc , sizeof( tex_desc ) );
tex_desc.Width = 128;
tex_desc.Height = 128;
tex_desc.MipLevels = 1;
tex_desc.ArraySize = 1;
tex_desc.Format = DXGI_FORMAT_R32G32_FLOAT;
tex_desc.SampleDesc.Count = 1;
tex_desc.SampleDesc.Quality = 0;
tex_desc.Usage = D3D11_USAGE_DEFAULT;
tex_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
tex_desc.CPUAccessFlags = 0;
tex_desc.MiscFlags = 0;

D3D11_SUBRESOURCE_DATA InitData;
ZeroMemory( &InitData , sizeof( D3D11_SUBRESOURCE_DATA ) );
InitData.pSysMem = data;
InitData.SysMemPitch = sizeof( data[0] ) * 128;

HR( md3dDevice->CreateTexture2D( &tex_desc , &InitData , &mTexture ) );

D3D11_SHADER_RESOURCE_VIEW_DESC srv_desc;
ZeroMemory( &srv_desc , sizeof( srv_desc ) );
srv_desc.Format = DXGI_FORMAT_R32G32_FLOAT;
srv_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
srv_desc.Texture2D.MipLevels = 1;
srv_desc.Texture2D.MostDetailedMip = 0;

md3dDevice->CreateShaderResourceView( mTexture , &srv_desc , &mH0SRV );


这段代码开始定义了一个128*128的数组。

然后:

InitData.pSysMem = data;
InitData.SysMemPitch = sizeof( data[0] ) * 128;


这一段是data是数据源,二维图像每行为
sizoef(data[0]) * 128


对应的PixelShader为:

Texture2D       gTexture;
SamplerState    gSampleLinear   :   register( s0 );

struct VertexOut
{
float4 PosH     :       SV_POSITION;
float2 Tex      :       TEXCOORD;
};

float4 main( VertexOut input ) : SV_TARGET
{
float4 color = gTexture.Sample( gSampleLinear , input.Tex );

return color;
}




我这里使用了一维数组,但不表示只能使用一维数组。二维数组其实是一样的。

如:

srand( 0 );
DirectX::XMFLOAT2 data[128][128];
for( int i = 0; i < 128; i++ )
{
for( int j = 0; j < 128; j++ )
{
data[i][j].x = rand() / ( float )RAND_MAX;
data[i][j].y = rand() / ( float )RAND_MAX;
}
}

D3D11_TEXTURE2D_DESC tex_desc;
ZeroMemory( &tex_desc , sizeof( tex_desc ) );
tex_desc.Width = 128;
tex_desc.Height = 128;
tex_desc.MipLevels = 1;
tex_desc.ArraySize = 1;
tex_desc.Format = DXGI_FORMAT_R32G32_FLOAT;
tex_desc.SampleDesc.Count = 1;
tex_desc.SampleDesc.Quality = 0;
tex_desc.Usage = D3D11_USAGE_DEFAULT;
tex_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
tex_desc.CPUAccessFlags = 0;
tex_desc.MiscFlags = 0;

D3D11_SUBRESOURCE_DATA InitData;
ZeroMemory( &InitData , sizeof( D3D11_SUBRESOURCE_DATA ) );
InitData.pSysMem = data;
InitData.SysMemPitch = sizeof( data[0][0] ) * 128;

HR( md3dDevice->CreateTexture2D
4000
( &tex_desc , &InitData , &mTexture ) );

D3D11_SHADER_RESOURCE_VIEW_DESC srv_desc;
ZeroMemory( &srv_desc , sizeof( srv_desc ) );
srv_desc.Format = DXGI_FORMAT_R32G32_FLOAT;
srv_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
srv_desc.Texture2D.MipLevels = 1;
srv_desc.Texture2D.MostDetailedMip = 0;

md3dDevice->CreateShaderResourceView( mTexture , &srv_desc , &mH0SRV );


结果是一样的

由于我们使用的是
DirectX::XMFLOAT2
所以纹理格式,ShaderResourceView格式为
DXGI_FORMAT_R32G32_FLOAT


如果我们使用
DirectX::XMFLOAT4
数组,则纹理格式,ShaderResourceView格式应为
DXGI_FORMAT_R32G32B32A32_FLOAT
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  directx11