【转载】D3D中的Texture应用示例
2016-05-17 23:03
363 查看
原文:D3D中的texture应用示例
本文列举了Direct3D中各种纹理应用实现:黑暗贴图,发光贴图,漫反射映射贴图,细节纹理,纹理混合,有较详尽的注解。其中黑暗贴图,发光贴图,细节纹理都是采用多重纹理的方法实现(也可以采用多次渲染混合实现)。
示例代码使用Beginning direct3D game programming中的框架,省去不少事情,可以专注纹理话题。代码:点此下载
下面来看代码与效果:
正常的纹理贴图效果:
//基本纹理
2void drawNormalTexture()
3//黑暗映射纹理
2void drawDarkMapTexture()
3//漫射光映射纹理
2void drawDiffuseTexture()
3//发光映射纹理
2void drawGlowMapTexture()
3//细节映射纹理:实现凹凸效果
2void drawDetailMapTexture()
3//alpha混合纹理
2void drawAlphaBlendTexture()
3{
4 // 多次渲染实现纹理混合
5 // finalColor = sourcePixelColor * sourceBlendFactor + destPixelColor * destBlendFactor
6 // 设置纹理混合参数
7 Device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); // alpha值来自纹理
8 Device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
9
10 // 设置混合因子实现透明效果
11 Device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
12 Device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
13
14 //使用box纹理贴图实现第一次渲染,无alpha混合
15 Device->SetTexture(0, texBox);
16 Device->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0);
17 Device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); // 颜色来源-材质
18 Device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); // 使用当前颜色作为第一个texture stage的输出
19
20 // 第一次描绘box
21 Box->draw(&boxWorldMatrix, 0, 0);
22
23 //使用带alpha值得flower纹理贴图实现第二次渲染,有alpha混合
24 Device->SetTexture(0, texAlphaFlower);
25 Device->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0);
26 Device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); // 颜色来源-材质
27 Device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); // 使用当前颜色作为第一个texture stage的输出
28
29 // 打开纹理混合
30 Device->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
31
32 // 第一次描绘box
33 Box->draw(&boxWorldMatrix, 0, 0);
34
35 // 关闭纹理混合
36 Device->SetRenderState(D3DRS_ALPHABLENDENABLE, false);
37}
本文列举了Direct3D中各种纹理应用实现:黑暗贴图,发光贴图,漫反射映射贴图,细节纹理,纹理混合,有较详尽的注解。其中黑暗贴图,发光贴图,细节纹理都是采用多重纹理的方法实现(也可以采用多次渲染混合实现)。
示例代码使用Beginning direct3D game programming中的框架,省去不少事情,可以专注纹理话题。代码:点此下载
下面来看代码与效果:
正常的纹理贴图效果:
//基本纹理
2void drawNormalTexture()
3//黑暗映射纹理
2void drawDarkMapTexture()
3//漫射光映射纹理
2void drawDiffuseTexture()
3//发光映射纹理
2void drawGlowMapTexture()
3//细节映射纹理:实现凹凸效果
2void drawDetailMapTexture()
3//alpha混合纹理
2void drawAlphaBlendTexture()
3{
4 // 多次渲染实现纹理混合
5 // finalColor = sourcePixelColor * sourceBlendFactor + destPixelColor * destBlendFactor
6 // 设置纹理混合参数
7 Device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); // alpha值来自纹理
8 Device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
9
10 // 设置混合因子实现透明效果
11 Device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
12 Device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
13
14 //使用box纹理贴图实现第一次渲染,无alpha混合
15 Device->SetTexture(0, texBox);
16 Device->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0);
17 Device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); // 颜色来源-材质
18 Device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); // 使用当前颜色作为第一个texture stage的输出
19
20 // 第一次描绘box
21 Box->draw(&boxWorldMatrix, 0, 0);
22
23 //使用带alpha值得flower纹理贴图实现第二次渲染,有alpha混合
24 Device->SetTexture(0, texAlphaFlower);
25 Device->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0);
26 Device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); // 颜色来源-材质
27 Device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); // 使用当前颜色作为第一个texture stage的输出
28
29 // 打开纹理混合
30 Device->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
31
32 // 第一次描绘box
33 Box->draw(&boxWorldMatrix, 0, 0);
34
35 // 关闭纹理混合
36 Device->SetRenderState(D3DRS_ALPHABLENDENABLE, false);
37}
相关文章推荐
- Navicat Premium (patch and keygen)
- Python之常用模块(待更新)
- 2016/5/17 初识C++
- 西游记之青鸟大仙
- Elasticsearch中文搜索环境搭建
- 设备文件
- 新建android项目报错,代码中找不到错误
- Codeforces 675c
- Java Set集合知多少?
- 自定义View需要注意的问题
- 谢欣伦 - OpenDev原创教程 - 媒体开发库libMedia
- 家庭仿真之任务场景截取改进
- 解决找不到libvirt/libvirt.h的错误
- linux shell编程学习--循环流程while,for,until命令
- C# 委托(Delegate Action Func Predicate)
- Unable to execute dex: Multiple dex files define 的解决方法
- 内部类
- WEB开发的套路——从MODEL到VIEW
- mysql截取日期
- HTML5线性图表iGrapher 功能非常强大