Textures are containers for pixel data. They always have a width, height, and color format. The most simple and common kind of texture is just a 2D texture. But textures can also have depth (3D textures), multiple layers (cubemaps), multiple resolution levels (mipmap levels), or a multisample count. Describing the use cases for all of these is beyond the scope of this tutorial, but they should come up as you learn how to execute certain rendering techniques.
To create a new texture resource, you can set up a `TextureCreateInfo` struct:
We'll get to command buffers later, just know that you must upload data via command buffer so that you can safely use multithreading. This can speed up load times greatly.
One last concept we should discuss before moving on is texture slicing.
Texture slices are a very commonly used concept in MoonWorks. You don't have to do texture operations on an entire texture - you can instead use a subsection of the texture for whatever your operation is.
var myTextureSlice = new TextureSlice(myTexture, mySliceRect);
```
This code produces a texture slice which is a 16x16 square in the top left corner of the image. You can create slices of 3D textures and cube textures as well! We'll talk more about where to use texture slices later.