Jump to content
  • Advertisement
Sign in to follow this  

D3D10, can't generate mipmaps on texture

This topic is 3267 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi, I created a texture with some noise in system memory, it's an array of 256x256 floats. When I create a 2d texture from it with only one mipmap level, everything works fine, but if I try 0 (automatically create all levels), or something else, I get the invalid arguments error. I noticed that this is because I need to fill in multiple initial data buffers instead of one, but that's just the point, I don't want to, I want directx to generate all the subresources for me like it would when loading a texture from file. So how does one create an automatically mipmapped texture from one memory buffer? There is a function GenerateMips that should automatically generate the mipmaps, so why doesn't it do the job? So here is the code:
initData.pSysMem = data; // is a float[256*256]
initData.SysMemPitch = dim.width * texSize; // texSize = sizeof(float)
initData.SysMemSlicePitch = 0;

texDesc.Width = dim.width; // 256
texDesc.Height = dim.height; // 256
texDesc.SampleDesc.Count = 1;
texDesc.SampleDesc.Quality = 0;
texDesc.MipLevels = mipLevels; // 1 works fine, something else doesn't
texDesc.Format = fmt; // DXGI_FORMAT_R32_FLOAT
texDesc.Usage = usagem; // D3D10_USAGE_DEFAULT
texDesc.BindFlags = D3D10_BIND_SHADER_RESOURCE;
if (mipLevels != 1)
	texDesc.BindFlags |= D3D10_BIND_RENDER_TARGET;
texDesc.CPUAccessFlags = 0;
texDesc.MiscFlags = (mipLevels != 1? D3D10_RESOURCE_MISC_GENERATE_MIPS: 0);
texDesc.ArraySize = 1;

ID3D10Texture2D* tex = 0;
HRESULT hr = m_pD3DDev->CreateTexture2D(&texDesc, &initData, &tex);
if (FAILED(hr))
	throw EGfx(L"Could not create 2d texture");

viewDesc.Format = texDesc.Format;
viewDesc.ViewDimension = D3D10_SRV_DIMENSION_TEXTURE2D;
viewDesc.Texture2D.MipLevels = texDesc.MipLevels;
viewDesc.Texture2D.MostDetailedMip = 0;

ID3D10ShaderResourceView *view = 0;
hr = m_pD3DDev->CreateShaderResourceView(tex, &viewDesc, &view);
if (FAILED(hr))
	throw EGfx(L"Could not create resource view for 2d texture");


return view;

Does anyone know the answer? D.

Share this post

Link to post
Share on other sites
Don't use init-data, but pass NULL for that argument to CreateTexture2D. Then update the first mip-map level with UpdateSubresource, and generate the rest with GenerateMips. This can also be used to change the texture later, without having to re-create it.

Share this post

Link to post
Share on other sites
Of course! Somehow that seems like causing extra work behind the scene but it probably doesn't matter. Instead of sending the data immediately when the memory is allocated, it is sent later and the shader will do the downscaling.

Thank you for reminding me of this possibility!

Share this post

Link to post
Share on other sites
Sign in to follow this  

  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!