【转载】D3D深度测试和Alpha混合

原文: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);

时间: 2024-10-20 12:28:52

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

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

第17章 三维游戏模型的载入 主要是如何从3ds max中导出.X文件,以及如何从X文件加载三维模型到DirextX游戏程序里.因为复杂的3D物体,要用代码去实现,那太反人类了,所以我们需要一些建模软件. 对于3ds max,要到出.X文件,要装个Panda插件.然后就是作者推荐的一个3D模型资源网站:http://www.cgmodel.com/. 网格模型接口ID3DXMesh 这个接口表示网格,继承自ID3DXBaseMesh.ID3DXMesh接口中的D3DXCreateMesh()可用

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

原文:Alpha混合物体的深度排序 先说个题外话, 本来我想解答一下最近Creators Club论坛上经常出现的一个问题, 意外的是在网上竟然找不到什么全面的答案.. 这是个有着复杂答案的简单问题: “为什么我的透明物体的绘制顺序不对, 或者有些不见了?” 当绘制一个3D场景时, 对图形进行深度排序是非常重要的, 这样离镜头近才画在远处物体的前面. 我们不会希望看到远处的山把近在眼前的建筑给挡住了! 如今有三种深度排序方法得到了广泛的应用: 深度缓冲 (也叫做 z-buffering) 油画家

【浅墨Unity3D Shader编程】之四 热带雨林篇: 剔除、深度测试、Alpha测试以及基本雾效合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://hpw123.net/a/C__/kongzhitaichengxu/2014/1222/163.html 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] QQ交流群:330595914 更多文章尽在:http://www.hpw123.net 本文介绍了Unity中Shader书写中会用到的剔除.深度测试.Alpha测试以及基

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

显然DirectDraw是Windows下写2D图形程序的最好选择,虽然Direct3D也可以写,但是没DirectDraw简单方便,特别对于初学者,一来就接触那么多函数和参数总不是件愉快的事,所以我的文章主要结合我做的工作,谈谈DirectDraw编程中一些比较关键的技术,大多是我自己想出来的.我想先声明,我的文章可以任意转载,源代码可以任意使用和修改. 由于我是业余时间写的文章,所以只能每次发表一篇,希望我的工作可以为大家的游戏增光添彩,同时我的文章主要面向有基本C++,DirectDraw

Unity3D教程宝典之Shader篇:第十三讲 Alpha混合

转载自风宇冲Unity3D教程学院 Alpha Blending,中文译作Alpha混合 Blending就是控制透明的.处于光栅化的最后阶段. 这里例如我们给一个模型贴一个材质,那么在某个点计算出来颜色值称为源,而该点之前累积的颜色值,叫目标. 语法 Blend Off     不混合 Blend SrcFactor DstFactor  SrcFactor是源系数,DstFactor是目标系数 最终颜色 = (Shader计算出的点颜色值 * 源系数)+(点累积颜色 * 目标系数) 属性(往

D3D 9 通过 Alpha 测试与 Alpha 混合随意控制纹理透明度

网上不怎么见得到关于 D3D 9 的技术文章了,笔者最近在写一个 2D 的功能,希望通过某些设置来随意控制一张 2D 纹理贴图的透明度,网上找来找去,所有的文章,要不就是照抄市面教材,要么是照抄官方文档,稍微好一点的,就是在官方教材的基础上增加中文翻译,哎哟我去,找了两天啊,功能是实现了,可是心中的疑惑一直挥之不去,为啥 ?因为我的代码是照抄的啊,我只知道这样子设置可以得到这样子的效果,但是我特么不知道为啥啊,我特么要是下次再遇到同样的问题,我是不是又要再去抄一次代码 ? 好了,牢骚就发到这里吧

深度排序与alpha混合 【转】

  翻译:李现民 最后修改:2012-07-03 原文:Depth sorting alpha blended objects 先说个题外话,本来我想回答在 Creators Club论坛上的一个常见问题,但(意外的是)我竟然没能从网上找到一个令人满意的答案. 问题本身很简单,但答案却有些复杂: “为什么我的透明物体的绘制顺序是错误的,或者为什么它们的一部分不见了?” 当绘制一个3D场景的时候,将图形按深度排序非常重要,只有这样靠近摄像机的物体才能被绘制在(离摄像机)更远的物体的上面.我们不会希

深度排序与alpha混合

原文: https://blogs.msdn.microsoft.com/shawnhar/2009/02/18/depth-sorting-alpha-blended-objects/ 翻译:李现民 最后修改:2012-07-03 "为什么我的透明物体的绘制顺序是错误的,或者为什么它们的一部分不见了?" 当绘制一个3D场景的时候,将图形按深度排序非常重要,只有这样靠近摄像机的物体才能被绘制在(离摄像机)更远的物体的上面.我们不会希望远方的山脉被绘制在近在眼前的建筑物的上面! 当前得到

[转载:]C#与Fortran混合编程之本地调用Fortran动态链接库

前言 C#发展到现在,已是一门相当完善的语言,他基于C语言风格,演化于C++.并依靠强大的.NET底层框架.C#可以用来快速构建桌面及Web应用.然而在我们的实际工作中,尽管C#已经非常完善,但还是不能完成我们所有的工作.在很多工程计算中,C#语言的计算速度,精度,以及执行效率相对来说都达不到项目的要求.因此我们便考虑是否有一种方式将我们的工程计算部分和我们的项目分开,将计算部分用另一种执行更快,精度更高的语言来编写,然后在C#中调用,最后完成我们的工作.答案是肯定的. Fortran是一门古老