DirectX 11 填充二维纹理
2015-05-27 21:36
246 查看
最近写程序刚好需要将数据写到二维纹理中,然后显示出来看数据是否正确。以这个笔记小小的记载下
这段代码开始定义了一个128*128的数组。
然后:
这一段是data是数据源,二维图像每行为
对应的PixelShader为:
我这里使用了一维数组,但不表示只能使用一维数组。二维数组其实是一样的。
如:
结果是一样的
由于我们使用的是
如果我们使用
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
相关文章推荐
- OpenGL非规则多边形(凹多边形,凸多边形)二维纹理映射(填充)
- Directx 11初始化
- [zz]DirectX 11 and Shared Model 5.0
- DirectX 11 Tessellation (曲面细分)—什么是 Tessellation (曲面细分) ?它为什么能够起到如此重要的作用?
- contourf()绘制填充颜色的二维等高线图
- Introduction to 3D Game Programming with DirectX 11学习笔记 4.1 初识Direct3D
- DirectX 11 Tutorials-Tutorial 1: 在visual studio上建立directx11
- OpenGL ES二维纹理坐标贴图规则
- datagridview 11添加二维表头
- Introduction to 3D Game Programming with DirectX 11学习笔记 6 Direct3D中的绘制(三)像素着色器
- DirectX 11 SDK文档(四)
- DirectX纹理渲染原理
- 什么是像素填充什么是纹理贴图
- DirectX Directdraw 用一种 颜色 填充 满屏 画面
- DirectX 11 framebuffer capture (C , no Win32 or D3DX)
- DirectX 11 SDK文档(三)
- 想做一些基于面片模型的二维纹理
- 【Visual C++】游戏开发笔记四十一 浅墨DirectX教程之九 为三维世界添彩:纹理映射技术(一)
- DirectX 11游戏编程学习笔记之1: 开场白
- DirectX (9) 纹理映射