DX11 DX11 - Cube Texture Creation

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

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

ilInit();

ILuint idImage;
ilGenImages( 1, &idImage );
ilBindImage( idImage );
_ASSERT ( IL_NO_ERROR == ilGetError() );

// Fetch dimensions of image
int width = ilGetInteger( IL_IMAGE_WIDTH );
int height = ilGetInteger( IL_IMAGE_HEIGHT );

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.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
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

-MIGI0027

Share on other sites

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 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 on other sites

Why, as it says:

descTex.MiscFlags = D3D10_RESOURCE_MISC_GENERATE_MIPS | D3D11_RESOURCE_MISC_TEXTURECUBE;


Any other error?

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 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 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 on other sites
Also I'm pretty sure that the Texassemble utility from DirectXTK can create a cubemap DDS from 6 separate images.

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.

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

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 ;)

• 9
• 17
• 10
• 11
• 18