Jump to content
  • Advertisement
Sign in to follow this  
Migi0027

DX11 DX11 - Cube Texture Creation

This topic is 1787 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 guys!

 

So recently I needed a cube map, and I've never actually used one, so, this is my first try. But something goes wrong, some invalid parameters were passed, this is how I create the cube map:

 

PS. The other functions are from the library devIL (http://openil.sourceforge.net/)

// Will be filled and returned
ID3D11ShaderResourceView* pSRV = NULL;

ilInit();
 
// Load image from DevIL
ILuint idImage;
ilGenImages( 1, &idImage );
ilBindImage( idImage );
ilLoadImage( filePath.c_str() );
_ASSERT ( IL_NO_ERROR == ilGetError() );
 
// Fetch dimensions of image
int width = ilGetInteger( IL_IMAGE_WIDTH );
int height = ilGetInteger( IL_IMAGE_HEIGHT );
 
// Load the data
ilConvertImage( IL_RGBA,IL_UNSIGNED_BYTE );
unsigned char * pData = ilGetData();
 
// Build the texture header descriptor
D3D11_TEXTURE2D_DESC descTex;
descTex.Width = width;
descTex.Height = height;
descTex.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
descTex.Usage = D3D11_USAGE_DEFAULT;
descTex.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
descTex.CPUAccessFlags = 0;
descTex.MipLevels = 1;
descTex.ArraySize = 1;
descTex.SampleDesc.Count = 1;
descTex.SampleDesc.Quality = 0;
descTex.MiscFlags = D3D10_RESOURCE_MISC_GENERATE_MIPS;
 
// Resource data descriptor
D3D11_SUBRESOURCE_DATA data ;
memset( &data, 0, sizeof(D3D11_SUBRESOURCE_DATA));
data.pSysMem = pData;
data.SysMemPitch = 4 * width;
 
// Create the 2d texture from data
ID3D11Texture2D * pTexture = NULL;
HV( pDevice->CreateTexture2D( &descTex, &data, &pTexture ));
 
// Create resource view descriptor
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
srvDesc.Format = descTex.Format;
srvDesc.ViewDimension = dimension;

srvDesc.TextureCube.MostDetailedMip = 0;
srvDesc.TextureCube.MipLevels = D3D11_RESOURCE_MISC_GENERATE_MIPS;

srvDesc.Texture2D.MostDetailedMip = 0;
srvDesc.Texture2D.MipLevels = D3D11_RESOURCE_MISC_GENERATE_MIPS ;
 
// Create the shader resource view
HV( pDevice->CreateShaderResourceView( pTexture, &srvDesc, &pSRV ));
 
// Delete from IL buffer after image loaded correctly
ilDeleteImages( 1, &idImage );
idImage = 0;
 
return pSRV;

Where dimension is D3D11_SRV_DIMENSION_TEXTURECUBE, now what could I be doing wrong? (...Everything)

 

PS. I won't respond in the next 12-24 hours.

 

Thank You smile.png

-MIGI0027

Share this post


Link to post
Share on other sites
Advertisement

 

ArraySize

Type: UINT

Number of textures in the texture array. The range is from 1 to D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION (2048). For a texture cube-map, this value is a multiple of 6 (that is, 6 times the value in the NumCubes member of D3D11_TEXCUBE_ARRAY_SRV), and the range is from 6 to 2046. The range is actually constrained by the feature level at which you create the rendering device. For more information about restrictions, see Remarks.

 

I suppose this ought to be the issue, at least part of it. If you read what comes before the invalid_arguments line, it should tell you exactly whats wrong, if you enabled the debug device...

Edited by Juliean

Share this post


Link to post
Share on other sites

Hmm:

 

 

D3D11: ERROR: ID3D11Device::CreateShaderResourceView: Resources created without D3D11_RESOURCE_MISC_TEXTURECUBE may not be treated as cubemap ShaderResourceViews. [ STATE_CREATION ERROR #126: CREATESHADERRESOURCEVIEW_INVALIDDESC ]

Share this post


Link to post
Share on other sites

Why, as it says:

descTex.MiscFlags = D3D10_RESOURCE_MISC_GENERATE_MIPS | D3D11_RESOURCE_MISC_TEXTURECUBE;

Any other error?

Share this post


Link to post
Share on other sites

It's almost perfect now, thanks for the help Juliean, the final code was nothing near the initial.

 

One final question:

 

Imagine I have these .bmp files:

  • back
  • down
  • front
  • left
  • right
  • up

If I had to combine these into an array (Cubemap) (Which I'm doing), what would be the correct order? (My order is wrong)

Share this post


Link to post
Share on other sites


If I had to combine these into an array (Cubemap) (Which I'm doing), what would be the correct order? (My order is wrong)

 

Sorry, I haven't worked that much with cube textures myself, so I'll have to pass. Glad to see it now works though, maybe someone else can answer that question for you.

Share this post


Link to post
Share on other sites
The order is in the docs. Go to the D3D10 overview, go to resources, and open the page for resource types. Scroll down to the section on cubemaps. I'm pretty sure the order is +x, -x, +y, -y, +z, -z.

I'd check myself and provide a link, but I'm on my phone at the moment.

Share this post


Link to post
Share on other sites
Also I'm pretty sure that the Texassemble utility from DirectXTK can create a cubemap DDS from 6 separate images.

Share this post


Link to post
Share on other sites

Almost perfect, if someone could guide me on this:

 

PS. The shadows are from another mesh inside the sphere, which casts shadows, but the sphere doesn't.

 

2j3gvma.png

 

As you can see It's like the cube map is upside down...

Share this post


Link to post
Share on other sites


As you can see It's like the cube map is upside down...

 

How about flipping them around? +x gets -x, and vice versa? I mean, even brute force there is only 64 possible combinations, I quess that would be faster solved that way before someone could answer you here ;)

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!