改变D3D中的渲染状态

1). 设置着色模式:

SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT //设置平面着色模式

SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD //设置格劳德着色模式

2). 设置多边形填充模式:

SetRenderState(D3DRS_FILLMODE, D3DFILL_POINT //点填充模式,D3D在多边形的每个顶点绘制一个像素

SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME //线填充模式,D3D在多边形的每个边绘制一条线

SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID   //面模式,D3D默认模式,对多边形的面进行填充

3). 设置全景图形抗锯齿:

SetRenderState(D3DRS_MUTISAMPLEANTIALIAS, TRUE)   //抗锯齿

SetRenderState(D3DRS_MUTISAMPLEANTIALIAS, FALSE)   //不抗锯齿

4). 设置剔除模式:

SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE) //不剔除任何面

5). 设置光照模式:
SetRenderState(D3DRS_AMBIENT, D3DCOLOR ambientColor); //为整个场景设置环境光
SetRenderState(D3DRS_SPECULARENABLE, TRUE);   //激活镜面反射计算(D3D默认情况下关闭)

6). 启动/关闭深度测试:
SetRenderState( D3DRS_ZENABLE, TRUE );    //启用深度测试

7) 设置纹理过滤器

//线性纹理

SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);

SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);

//最近点采样

SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_ POINT);

SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);

//各向异性纹理过滤

SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC)

SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_ ANISOTROPIC);

8)

SetRenderState( D3DRS_POINTSCALEENABLE, TRUE ); //打开缩放功能

9)

SetRenderState( D3DRS_POINTSCALE_A , FtoDW( 1.00f ));//设置因子,下同

SetRenderState( D3DRS_POINTSCALE_B , FtoDW( 1.00F ));

SetRenderState( D3DRS_POINTSCALE_C , FtoDW( 1.00f ));

10)

SetRenderState( D3DRS_POINTSIZE_MAX, FtoDW( 5.00f ));//设置点大小上限,下类似

SetRenderState( D3DRS_POINTSIZE_MAX, FtoDW( 5.00f ));

SetRenderState( D3DRS_POINTSPRITEENABLE , TRUE ) ;  //打开点精灵效果

SetRenderState( D3DRS_AMBIENT,  0xffffffff );  //设置环境光颜色开启ALPHA混合效果

11)

设置混合因子:

源:SetRenderState( D3DRS_SRCBLEND , D3DBLEND_SRCALPHA );

目的:SetRenderState( D3DRS_DESTBLEND , D3DBLEND_INVSRCALPHA);

第二个参数是 D3DBLEND的枚举结构

1.       深度测试
a)         深度缓冲区:屏幕上每个像素点的深度信息的一块内存缓冲区.D3D通过比较当前绘制的像素点的深度和对应深度缓冲区的点的深度值来决定是否绘制当前像素.
b)        D3DPRESENT_PARAMETERS. AutoDepthStencilFormat = D3DFMT_D16
表示深度值由16位二进制表示
开启深度测试:pDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
深度测试函数:D3DRS_ZFUNC:
D3DCMP_NEVER
总是返回FALSE
D3DCMP_LESS (常用)
小于深度缓冲区的相应值时返回TRUE
D3DCMP_EQUAL
等于
D3DCMP_LESSEQUAL
小于等于
D3DCMP_GREATER
大于
D3DCMP_NOTEQUAL
不等于
D3DCMP_GREATEREQUAL
大于等于
D3DCMP_ALWAYS
总是返回TRUE
更新缓冲区:保持深度缓冲区不变还是用当前像素的深度值更新
pDevice->SetRenderState( D3DRS_ZWRITEENABLE, TRUE );
2.       Alpha混合
a)         原理:Color = (RGBsrc * Ksrc) OP (RGBdst * Kdst)
最常用的方法:Color = (RGBsrc * Alphasrc) + (RGBdst * (1 – Alphasrc)
b)        应用
启用:pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
Blend mode factor
Description
D3DBLEND_ZERO
(0, 0, 0, 0)
D3DBLEND_ONE
(1, 1, 1, 1)
D3DBLEND_SRCCOLOR
(Rs, Gs, Bs, As)
D3DBLEND_INVSRCCOLOR
(1-Rs, 1-Gs, 1-Bs, 1-As)
D3DBLEND_SRCALPHA
(As, As, As, As)
D3DBLEND_INVSRCALPHA
(1-As, 1-As, 1-As, 1-As)
D3DBLEND_DESTALPHA
(Ad, Ad, Ad, Ad)
D3DBLEND_INVDESTALPHA
(1-Ad, 1-Ad, 1-Ad, 1-Ad)
D3DBLEND_DESTCOLOR
(Rd, Gd, Bd, Ad)
D3DBLEND_INVDESTCOLOR
(1-Rd, 1-Gd, 1-Bd, 1-Ad)
D3DBLEND_SRCALPHASAT
(f, f, f, 1); f = min(As, 1-Ad)
Alpha混合方法
D3DBLENDOP_ADD
源计算结果与颜色缓冲区计算结果相加
D3DBLENDOP_SUBTRACT
源计算结果减去颜色缓冲区计算结果
D3DBLENDOP_REVSUBTRACT
颜色缓冲区计算结果减去源计算结果
D3DBLENDOP_MIN
MIN(源计算结果, 颜色缓冲区计算结果)
D3DBLENDOP_MAX
MAX(源计算结果, 颜色缓冲区计算结果)
Color = (RGBsrc * Alphasrc) + (RGBdst * (1 – Alphasrc) )的设置示例:
pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
pDevice->SetRenderState( D3DBLENDOP, D3DBLENDOP_ADD );(默认值,可选)
3.       Alpha测试
a)         原理
根据Alpha测试条件来决定当前像素是否绘制,并不需要对颜色缓冲进行操作,所以速度比Alpha混合要快.
b)        应用
启用:pDevice->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE );
Alpha测试函数
D3DCMP_FUNC枚举,默认为D3DCMP_ALWAYS
参考值:
pDevice->SetRenderState( D3DRS_ALPHAREF, 0x00000081);

转载于:https://www.cnblogs.com/SHGF/archive/2013/05/10/3070360.html

转 关于 D3D的 SetRenderState 以及AlphaBlend 和AlphaTest相关推荐

  1. 新版“峡谷第一美”妲己尾巴毛发制作分享

    关于作者:梁家斌,腾讯互动娱乐天美工作室群高级游戏美术师. 之前有很多人来询问新版妲己宝宝 毛茸茸的尾巴 做法, 先谢谢大家对这个毛发效果的认可, 我在这里就简单的分享一下, 毛发的实现思路和制作方法 ...

  2. 游戏中的drawcalls值

    Drawcalls:这个东西值越小,你的游戏性能越好 介绍:在游戏中每一个被展示的独立的部分都被放在了一个特别的包中,我们称之为"描绘指令"(drawcall),然后这个包传递到3 ...

  3. D3D中的粒子系统(1)

    许多自然现象是由很多小的小颗粒组成的,它们有相似的行为.(例如,雪花落下,闪烁的火焰,冲出枪管的"子弹"),粒子系统用来模拟这种现象. 14.1 粒子和点精灵(Point Spri ...

  4. (转)跨越Opengl和D3D的鸿沟

    原帖地址: http://www.cnblogs.com/gongminmin/archive/2011/07/15/2107290.html 多年来,在论坛和各个网站上不断能看到拿OpenGL和D3 ...

  5. [转] Carmack 谈 d3d 与 ogl,定位专业应用的OpenGL,专注娱乐应用的DirectX,未来:OpenGL、DirectX并行发展

    http://blog.csdn.net/xieyuquan/archive/2006/10/05/1321801.aspx 我找不到一个理由不让这篇文章多一份Copy 原地址:http://bbs. ...

  6. [转] Carmack 谈 d3d 与 ogl, 定位专业应用的OpenGL, 专注娱乐应用的DirectX, 未来:OpenGL、DirectX并行发展...

    我找不到一个理由不让这篇文章多一份Copy 原地址:http://bbs.emu-zone.org/forums/archive/index.php/t-70.html 在经过这段时间的积累和沉淀 再 ...

  7. FPS 游戏实现D3D透视

    FPS游戏可以说一直都比较热门,典型的代表有反恐精英,穿越火线,绝地求生等,基本上只要是FPS游戏都会有透视挂的存在,而透视挂还分为很多种类型,常见的有D3D透视,方框透视,还有一些比较高端的显卡透视 ...

  8. FPS游戏:实现D3D劫持透视 (API Hook)

    FPS游戏可以说一直都比较热门,典型的代表有反恐精英,穿越火线,绝地求生等,基本上只要是FPS游戏都会有透视挂的存在,而透视挂还分为很多种类型,常见的有D3D透视,方框透视,还有一些比较高端的显卡透视 ...

  9. 在D3D中绘制一个三角形的一个完整过程(学习3D游戏笔记一)

    本笔记是基于Microsfot DirectX 9.0 SDK Update的SimpleSample生成的框架. 在3D场景中,所有的对象和模型均由三角形构成;而三角形由三个顶点构成;每个顶点不仅包 ...

最新文章

  1. 从「林」开始: imx51-linux-rt3070ap-dhcpd
  2. jstat 内存泄漏_一次Java内存泄漏的排查!要了自己的老命!
  3. Linux学习系列之Mount
  4. python遍历文件_python遍历目录文件脚本的示例
  5. Spring4基础 学习笔记(5) ---- Spring与Dao
  6. EasyExcel导出excel(写)
  7. 记录一次自己的前端面试心得
  8. 自动驾驶仿真(一)—— 基于CarSim与Simulink的ABS系统仿真
  9. windows设置路径Path
  10. UFS UIC Layer: MIPI UNIPRO
  11. Jeff Dean的神话
  12. 自动光圈及P-IRIS原理
  13. “做真实的自己”是个坑
  14. Google网盘 百度网盘文件互传-Multcloud
  15. 各台平台电商API接口吊桶,API接口分类
  16. redies 须知小结
  17. 怎样按照STAR法则制作简历
  18. Python Pandas读取文件
  19. 本次操作由于这台计算机的限制而被取消u盘,u盘显示但打不开提示“本次操作由于这台计算机的限制而被取消请与你的系统管理员联系”...
  20. Android 如何批量改变字体颜色

热门文章

  1. matlab optimvar
  2. vivado中ILA核的使用
  3. 【 数字信号处理 】定点数的表示之二进制数的原码与补码
  4. 【 MATLAB 】Matlab 帮助文档需要登录问题如何解决?
  5. centos和ubuntu安装卸载软件(rpm/dpkg)
  6. JVM虚拟机(四):JVM 垃圾回收机制概念及其算法
  7. springboot(十八):使用Spring Boot集成FastDFS
  8. pyhon 数据类型转换函数
  9. 协议学习:TCP/IP协议之物理层 上
  10. [力扣] 501. 二叉搜索树中的众数