Followers 0

# DX11 DX11 - Cube Texture Creation

## 10 posts in this topic

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

0

##### 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
0

##### 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 ]

0

##### Share on other sites

Why, as it says:

descTex.MiscFlags = D3D10_RESOURCE_MISC_GENERATE_MIPS | D3D11_RESOURCE_MISC_TEXTURECUBE;


Any other error?

0

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

0

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

1

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

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

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

0

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

0

##### Share on other sites

Somehow the order didn't matter in the up side down issue, but thanks!

I fixed it by reversing the .y component in the texture coordinates used to sample the map.

-MIGI0027

0

## Create an account

Register a new account

Followers 0

• ### Similar Content

• By YixunLiu
Hi,
I have a surface mesh and I want to use a cone to cut a hole on the surface mesh.
Anybody know a fast method to calculate the intersected boundary of these two geometries?

Thanks.

YL

• By hiya83
Hi, I tried searching for this but either I failed or couldn't find anything. I know there's D11/D12 interop and there are extensions for GL/D11 (though not very efficient). I was wondering if there's any Vulkan/D11 or Vulkan/D12 interop?
Thanks!

• Hi Guys,
I am just wondering if it is possible to acquire the address of the backbuffer if an API (based on DX11) only exposes the 'device' and 'context' pointers?
Any advice would be greatly appreciated

• bool InitDirect3D::Init() { if (!D3DApp::Init()) { return false; } //Additional Initialization //Disable Alt+Enter Fullscreen Toggle shortkey IDXGIFactory* factory; CreateDXGIFactory(__uuidof(IDXGIFactory), reinterpret_cast<void**>(&factory)); factory->MakeWindowAssociation(mhWindow, DXGI_MWA_NO_WINDOW_CHANGES); factory->Release(); return true; }
As stated on the title and displayed on the code above, regardless of it Alt+Enter still takes effect...
I recall something from the book during the swapChain creation, where in order to create it one has to use the same factory used to create the ID3D11Device, therefore I tested and indeed using that same factory indeed it work.
How is that one particular factory related to my window and how come the MakeWindowAssociation won't take effect with a newly created factory?
Also what's even the point of being able to create this Factories if they won't work,?(except from that one associated with the ID3D11Device)
• By ProfL
Can anyone recommend a wrapper for Direct3D 11 that is similarly simple to use as SFML? I don't need all the image formats etc. BUT I want a simple way to open a window, allocate a texture, buffer, shader.

• 11
• 28
• 14
• 11
• 33