原文:D3D深度测试和Alpha混合

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);
 

【转载】D3D深度测试和Alpha混合的更多相关文章

  1. D3D中深度测试和Alpha混合的关系

    我在学习D3D的深度测试和Alpha混合的时候,有一些遗憾.书上提供的例子里说一定要先渲染不透明物体,再渲染透明物体,对渲染状态的设置也有特殊要求.我看的很晕.自己查图形学的书,上网找资料,结果还是糊 ...

  2. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记8——载入三维模型&Alpha混合技术&深度测试与Z缓存

    第17章 三维游戏模型的载入 主要是如何从3ds max中导出.X文件,以及如何从X文件加载三维模型到DirextX游戏程序里.因为复杂的3D物体,要用代码去实现,那太反人类了,所以我们需要一些建模软 ...

  3. 【转载】Alpha混合物体的深度排序

    原文:Alpha混合物体的深度排序 先说个题外话, 本来我想解答一下最近Creators Club论坛上经常出现的一个问题, 意外的是在网上竟然找不到什么全面的答案.. 这是个有着复杂答案的简单问题: ...

  4. DirectDraw打造极速图形引擎(Alpha混合)

    显然DirectDraw是Windows下写2D图形程序的最好选择,虽然Direct3D也可以写,但是没DirectDraw简单方便,特别对于初学者,一来就接触那么多函数和参数总不是件愉快的事,所以我 ...

  5. 16位图像Alpha混合的实现(用汇编写的,比MMX还要快)

    Alpha 混合的算法很简单,基于下面的公式就可以实现: D := A * (S - D) / 255 + D D 是目标图像的像素, S 是源图像的像素 A 是 Alpha 值, 0 为全透明, 2 ...

  6. Alpha混合

    ShaderLab syntax: Blending 混合 Blending is used to make transparent objects. 混合是用来制作透明物体的. When graph ...

  7. Shader第十三讲 Alpha混合

    http://blog.sina.com.cn/s/blog_471132920101d8z5.html Alpha Blending,中文译作Alpha混合Blending就是控制透明的.处于光栅化 ...

  8. 【STM32H7教程】第56章 STM32H7的DMA2D应用之刷色块,位图和Alpha混合

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第56章       STM32H7的DMA2D应用之刷色块, ...

  9. 【淡墨Unity3D Shader计划】四 热带雨林的文章: 排除、深度测试、Alpha测试和基本雾编译

    本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://hpw123.net/a/C__/kongzhitaichengxu/2014/1222/163.html 作者:毛星云 ...

随机推荐

  1. 编程算法 - 数字在排序数组中出现的次数 代码(C)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/36869869 数字在排序数组中出现的次数 代 ...

  2. 9、Dubbo-配置(4)

    本地存根 远程服务后,客户端通常只剩下接口,而实现全在服务器端,但提供方有些时候想在客户端 也执行部分逻辑,比如:做 ThreadLocal 缓存,提前验证参数,调用失败后伪造容错数据等 等,此时就需 ...

  3. No.6 - 利用 CSS animation 制作一个炫酷的 Slider

    *{ margin:; padding:; } div{ margin: auto; width: 800px; height: 681px; position: relative; overflow ...

  4. shell脚本执行

    方法一:切换到shell脚本所在的目录执行shell脚本: cd /data/shell ./hello.sh ./的意思是说在当前的工作目录下执行hello.sh.如果不加上./,bash可能会响应 ...

  5. Loadrunner上传文件与下载文件脚本

    Loadrunner上传文件与下载文件脚本 一. 上传脚本 Action() { int uploadImgStatus = 0; //获取上传产品图ID web_reg_save_param_ex( ...

  6. java中的序列化问题

    序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,将数据分解成字节流,以便存储在文件中或在网络上传输.可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间.序列化是 ...

  7. 算法-求两个有序数组两两相加的值最小的K个数

    我的思路是: 用队列,  从(0,0)開始入队,每次出队的时候,选(1,0) (0,1) 之间最小的入队,假设是相等的都入队,假设入过队的就不入了,把出队的k个不同的输出来就可以 我測试了几组数据都是 ...

  8. 硬盘分区表知识——详解硬盘MBR

    这片文章说得很详细,原文:http://hi.baidu.com/waybq/blog/item/3b8db64bef3dc7f583025c66.html --------------------- ...

  9. Linux Shell常用技巧(九)

    十九.  和系统运行进程相关的Shell命令:       1.  进程监控命令(ps):    要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而ps命令就是最基本同时 ...

  10. c++类模板分文件编写存在的问题

    c++分文件编写的编译机制: 各个文件独立编译,如果在某.cpp文件中出现了函数调用,但是在此.cpp文件并没有对应函数的实现.此时就会在函数调用出生成特定的符号,在之后的链接过程完成函数调用. C+ ...