每个笔记的介绍内容是跟着教材书走的,这次记录的是纹理的使用环节
单靠修改每个顶点的属性来描绘整个世界显然是不太科学的,消耗太大了,所以就用到了纹理。 简单的来说,纹理就是把2D图片运用到了3D中,给3D模型贴上一个图片。
知识一:纹理坐标
因为纹理是2D的,模型是3D的,需要一个3D到2D的转换。在DX中贴图的左上角为顶点,u轴向右,v轴向下,其中u和v的取值范围是0~1。意思是不管贴图大小是64*64,还是256*256,图片中心点的纹理坐标都是(0.5,0.5)。(纹理坐标系,也称为纹理空间)
要添加纹理坐标的话,顶点的结构体,数据,以及描述就需要修改了
struct SimpleVertex
{
XMFLOAT3 Pos;
XMFLOAT2 Tex;<span style="white-space:pre"> </span>//纹理坐标
};
D3D11_INPUT_ELEMENT_DESC layout[] =
{
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },//纹理坐标描述,注意格式为<span style="font-family: Arial, Helvetica, sans-serif;">DXGI_FORMAT_R32G32_FLOAT</span>
};
纹理数据通常从图像文件中读取到一个ID3D11Texture2D的对象中,但是纹理资源不能直接绑定在管线上(立即执行上下文中),需要为纹理资源创建一个资源视图,然后将试图绑定至上下文(后台缓存也是这样的)
通过书,代码示例等发现三种用法:
第一种:
第一步:调用D3DX10CreateTextureFromFile来读取图像文件,并创建一个ID3D11Texture2D的对象