纹理

来源:互联网 发布:程序员相亲网站 编辑:程序博客网 时间:2024/04/29 06:21

纹理的D3D重要组成部分,因为太多地方要用到它,所以专门记录一下使用纹理的各种方法。
创建纹理的方法有很多,比如:
HRESULT D3DXCreateTexture
HRESULT D3DXCreateTextureFromFile
HRESULT D3DXCreateTextureFromFileEx
HRESULT D3DXCreateTextureFromFileInMemory
HRESULT D3DXCreateTextureFromResource

常用的的是
D3DXCreateTextureFromFile和D3DXCreateTextureFromFileEx

例子:
D3DXCreateTextureFromFile(m_pD3DDevice, _T("cratewalpha.dds"), &m_pBillboardTexture);
D3DXCreateTextureFromFileEx(m_pD3DDevice, _T("Billboard.bmp"), 
D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0, D3DFMT_A1R5G5B5, 
D3DPOOL_MANAGED, D3DX_FILTER_TRIANGLE, D3DX_FILTER_TRIANGLE,
D3DCOLOR_RGBA(0,0,0,255), NULL, NULL, &m_pBillboardTexture);

使用纹理的方法:
HRESULT IDirect3DDevice9::SetTexture(
DWORD Stage, // A value in the range 0-7 identifying the texture 
// stage – see note on Texture Stages
IDirect3DBaseTexture9* pTexture // ptr to the texture to set
);

最多能设置8层纹理
例子:
m_pD3DDevice->SetTexture(0, &m_pBillboardTexture);

过滤
通常纹理三角形和屏幕三角形是不一样大的
当纹理三角形比屏幕三角形小时,纹理三角形会被适当放大
当纹理三角形比屏幕三角形大时,纹理三角形会被适当缩小
这两种情况,变形都将会出现。过滤(Filtering)是一种Direct3D用它来帮助这些变形变的平滑的技术。
Device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT);// D3DTEXTUREFILTER filter to use for magnification
Device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT);// D3DTEXTUREFILTER filter to use for minification
纹理Filter的方式有D3DTEXF_POINT, D3DTEXF_LINEAR,D3DTEXF_ANISOTROPIC
当使用Anisotropic filtering时,我们必须设置D3DSAMP_MAXANISOTROPY等级,Device->SetSamplerState(0, D3DSAMP_MAXANISOTROPY, 4);


Mipmaps过滤器
Device->SetSamplerState(0, D3DSAMP_MIPFILTER, Filter);
D3DTEXF_NONE——不使用mipmap
D3DTEXF_POINT——通过使用这个过滤器,Direct3D将选择与屏幕三角形大小最接近的mipmap等级
D3DTEXF_LINEAR——通过使用这个过滤器,Direct3D将选择两个最接近的mipmap等级,缩小和放大过滤每个等级,然后线性联合计算它们两个等级来得到最终的颜色值

纹理坐标U、V寻址模式:D3DSAMP_ADDRESSU和D3DSAMP_ADDRESSV
Device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
Device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);

假如设置一个有alpha通道的纹理,alpha值从在alpha通道中获得。假如没有alpha通道,那么alpha值是通过顶点颜色获得。然而,你能够通过下面的渲染状态来指定使用哪一个资源
    D3DTSS_COLOROP        =  1, /* D3DTEXTUREOP - per-stage blending controls for color channels */
    D3DTSS_COLORARG1      =  2, /* D3DTA_* (texture arg) */
    D3DTSS_COLORARG2      =  3, /* D3DTA_* (texture arg) */
    D3DTSS_ALPHAOP        =  4, /* D3DTEXTUREOP - per-stage blending controls for alpha channel */
    D3DTSS_ALPHAARG1      =  5, /* D3DTA_* (texture arg) */
    D3DTSS_ALPHAARG2      =  6, /* D3DTA_* (texture arg) */
例子:
// compute alpha from diffuse colors during shading
Device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);
Device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
// take alpha from alpha channel
Device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
Device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);

g_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
g_pDevice->SetRenderState(D3DRS_BLENDOPALPHA, D3DBLENDOP_ADD);
g_pDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
g_pDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);

设置纹理各级不同属性的状态
HRESULT SetTextureStageState(
    DWORD Stage,
    D3DTEXTURESTAGESTATETYPE Type,
    DWORD Value
);
Stage:这个参数是指第几层纹理,0.1.2.3..., 这个版本的dx9(Feb,2005)的SDK中说最多支持8层
Type: 定义对该纹理的哪个属进行设置
Value:指的是前面所选属性的值

typedef enum _D3DTEXTURESTAGESTATETYPE {
    D3DTSS_COLOROP = 1, //颜色的运算这里的op 是operations,指对前面设置的颜色进行运算既后面的2个type:D3DTSS_COLORARG1,D3DTSS_COLORARG2或D3DTSS_ALPHAARG1,D3DTSS_ALPHAARG2 = 6
    D3DTSS_COLORARG1 = 2,
    D3DTSS_COLORARG2 = 3,
    D3DTSS_ALPHAOP = 4, //alpha通道的运算
    D3DTSS_ALPHAARG1 = 5,
    D3DTSS_ALPHAARG2 = 6,
    D3DTSS_BUMPENVMAT00 = 7,
    D3DTSS_BUMPENVMAT01 = 8,
    D3DTSS_BUMPENVMAT10 = 9,
    D3DTSS_BUMPENVMAT11 = 10,
    D3DTSS_TEXCOORDINDEX = 11,
    D3DTSS_BUMPENVLSCALE = 22,
    D3DTSS_BUMPENVLOFFSET = 23,
    D3DTSS_TEXTURETRANSFORMFLAGS = 24,
    D3DTSS_COLORARG0 = 26,
    D3DTSS_ALPHAARG0 = 27,
    D3DTSS_RESULTARG = 28,
    D3DTSS_CONSTANT = 32, //给当前纹理一个固定的值;
    D3DTSS_FORCE_DWORD = 0x7fffffff
} D3DTEXTURESTAGESTATETYPE;
 
Value又包括二个:D3DTEXTUREOF和D3DTA.( Can be either an operation (D3DTEXTUREOP) or an argument value (D3DTA), depending on what is chosen for Type.)
D3DTEXTUREOF:
D3DTOP_DISABLE = 1,                      //该纹理无效,既不显示
    D3DTOP_SELECTARG1 = 2,               //选择第1个颜色值(既D3DTSS_COLORARG1的值)作为纹理颜色输出
    D3DTOP_SELECTARG2 = 3,               /选择第2个颜色值(既D3DTSS_COLORARG2的值)作为纹理颜色输出
    D3DTOP_MODULATE = 4,                 //将颜色1和颜色2相乘作为纹理颜色输出
    D3DTOP_MODULATE2X = 5,               //将颜色1和颜色2相乘后左移1bit(用于增亮)作为纹理颜色输出 ,
    D3DTOP_MODULATE4X = 6,               //将颜色1和颜色2相乘后左移2bit(用于增亮)作为纹理颜色输出
    D3DTOP_ADD = 7,                      //将颜色1和颜色2相加作为纹理颜色输出
    D3DTOP_ADDSIGNED = 8,                //后面的参见SDK 都是对2个颜色进行运算
    D3DTOP_ADDSIGNED2X = 9,
    D3DTOP_SUBTRACT = 10,
    D3DTOP_ADDSMOOTH = 11,
    D3DTOP_BLENDDIFFUSEALPHA = 12,
    D3DTOP_BLENDTEXTUREALPHA = 13,
    D3DTOP_BLENDFACTORALPHA = 14,
    D3DTOP_BLENDTEXTUREALPHAPM = 15,
    D3DTOP_BLENDCURRENTALPHA = 16,
    D3DTOP_PREMODULATE = 17,
    D3DTOP_MODULATEALPHA_ADDCOLOR = 18,
    D3DTOP_MODULATECOLOR_ADDALPHA = 19,
    D3DTOP_MODULATEINVALPHA_ADDCOLOR = 20,
    D3DTOP_MODULATEINVCOLOR_ADDALPHA = 21,
    D3DTOP_BUMPENVMAP = 22,
    D3DTOP_BUMPENVMAPLUMINANCE = 23,
    D3DTOP_DOTPRODUCT3 = 24,
    D3DTOP_MULTIPLYADD = 25,
    D3DTOP_LERP = 26,
    D3DTOP_FORCE_DWORD = 0x7fffffff,
 
D3DTA:
     这里的TA指的是纹理参数 ,
      D3DTA_CONSTANT           //给当前纹理一个固定的值;
      D3DTA_DIFFUSE;         //diffuse的值作为参数 diffuse 可能有多个来源比如材质,vertex
      D3DTA_SELECTMASK         //Mask value for all arguments; not used when setting texture arguments 这句话不理解啊,为什么要伪装呢   
      D3DTA_SPECULAR           //取spercular 的值作为参数  来源同diffuse
      D3DTA_TEMP             //待定
      D3DTA_TEXTURE             //用纹理的颜色值作为参数
      D3DTA_TFACTOR             //待定

这么多组合,需要在实践中才能知道效果

原创粉丝点击