翁云兵老师《3D游戏程序设计入门》笔记
纹理
1、纹理是什么,为啥要加入纹理
GAMES101中的定义是,对不同的顶点赋予不同的属性。
2、创建并赋予材质
IDirect3Dtexture9* stonewall;
D3DXCreateTextureFromFile(device, “stonewall”, &stonewall);
device->SetTexture(0, stonewall); //stage设置为0,表示一个纹理。stage取值从0到7。可以贴8张纹理
3、不管纹理贴图分辨率有多少,纹理系统的坐标始终是(0,1)。坐标系统从左上角开始。向右为u的正方向,向下为v的正方向
4、但是当纹理坐标超过1的时候,需要进行重复贴图。
DX9里贴图的重复有四种寻址模式:环绕纹理寻址模式、边框颜色纹理寻址模式、截取纹理寻址模式、镜像纹理寻址模式。
4、三角形和纹理的映射会因为三角形的大小问题而产生很严重的走样,比如透视投影后,很远处的一块三角形会变得很小,但是映射到纹理上却是原先的那个分辨率的纹理三角形。这就发生了走样。
5、DX9中使用三种过滤器来帮助纹理三角形放大缩小。不是说一种过滤器就能实现放大和缩小了,而是在需要放大时使用放大过滤器,在缩小时使用缩小过滤器。另外,还有一种解决办法一般是mipmap。
- Nearest point samping:最近点
Device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT); //mapfilter放大过滤器
Device->SetSamplerState(0, D3DSAMP_MINFILTER,
D3DTEXF_POINT); //minfilter缩小过滤器 - Linear filter:线性
Device->SetSamplerState(0, D3DSAMP_MAGFILTER,
D3DTEXF_LINEAR);
Device->SetSamplerState(0, D3DSAMP_MINFILTER,
D3DTEXF_LINEAR); - Anisotropic filter:各项异性
Device->SetSamplerState(0, D3DSAMP_MAGFILTER,
ANISOTROPIC);
Device->SetSAmplerState(0, D3DSAMP_MINFILTER,
ANISOTROPIC);
6、使用Mipmap进行过滤
如果显卡支持,只要通过D3DXCreateTextureFromFile函数,一个mipmap链将被自动创建。
Device->SetSamplerState(0, D3DSAMP_MIPFILTER, Filter);
- Filter选D3DTEXF_NONE:不使用mipmap
D3DTEXF_POINT:选择和屏幕三角形大小最接近的mipmap等级
D3DTEXF_LINEAR:选择和屏幕三角形大小最接近的两个mipmap等级,线性联合计算它们的等级得到最终的纹理
7、场景设置纹理如下:
- 在顶点格式中加入纹理坐标
- 使用D3DXCreateTextureFromFile函数读取纹理到IDirect3DTexture9接口中
- 设置缩小放大、mipmap过滤器。
- 使用SetTexture设置纹理。