`
nanjingjiangbiao_T
  • 浏览: 2688583 次
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

【D3D11游戏编程】学习笔记十六:Alpha通道(Alpha Channel)

 
阅读更多

(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~)

在使用纹理时,我们有时需要指定该纹理图哪些部分是我们想要的,哪些部分我们不需要,即透明的。这时候,我们需要为纹理的每个texel指定alpha值,令我们不需要的那些部分的alpha为0,其他部分为1。纹理中对于每个texel,相对于RGB部分,我们称alpha值部分为alpha通道,即Alpha Channel。

1. 添加Alpha通道

通常情况下我们使用的24位(RGB)图片,是没有alpha通道的。如果想让它支持透明,我们需要为它添加alpha通道。一种常见的添加Alpha通道的方法即使用一张灰度图。该灰度图与原始图片具有完全一样的尺寸,不同的是该灰度图中的每个元素不是RGB颜色,而是代表透明度(8位)。如下图所示:

左边为原始图片,右边为对应的灰度图,其中黑色部分代表透明部分,即alpha值为0,白色部分为原始纹理图中我们想要的部分。有很多工具可以帮我们把两种图片结合在一起,从而生成支持alpha通道的图片。比如DirectX SDK自带的纹理工具DXTex程序。我们在示例程序中所用的.dds格式的图片即支持alpha通道。

2. HLSL中clip函数的使用

接着上图中的例子,我们想使用该纹理来绘制篱笆。显然,我们只需要纹理中代表篱笆本身的部分,其他部分应该是透明的。现在我们已经拥有一张支持alpha通道的纹理了(dds格式),如何使用它的alpha通道呢?

有两种方法可以实现这种透明效果:

第一种方法即混合。由于对于我们不想要的部分,对应的alpha值为0,因此我们可以通过设置相应的混合因子、混合操作来实现透明效果,具体方法见上节介绍透明效果的实现部分。

但是,使用混合尽管实现了透明的效果,效率却并不高。因为对于我们不需要的部分,仍然参与了大量的混合计算,最终却无任何效果,因而造成很大的浪费。另一种更加高效的方法即使用HLSL中clip(x)函数。使用该函数时,对于我们不想要的部分,像素着色器会直接停止处理,因而不会造成无用的计算。

对于clip(x)函数,它只能用于像素着色器中,且当x<0时,该像素将被抛弃,不再继续执行。针对该例子,对于alpha值接近0的像素,我们直接丢弃它,对于其他像素,按正常方式进行处理。因此我们可以在像素着色器中这样使用:clip(texColor.a - 0.1f)。对于透明部分,alpha - 0.1f会小于0,因而将停止处理它。

在Pixel Shader中对应的部分代码如下:

if(useTexture)
{
	texColor = g_tex.Sample(samplerTex,pin.tex);
	//是否打开alpha clip
	if(AlphaClipEnable)
	{
		clip(texColor.a-0.1f);
	}
}

这里AlphaClipEnable为控制参数,当为true时,将实现透明效果。同样,useTexture也是。
注意:在于纹理过滤的原因,原纹理中alpha值为0的部分在经过过滤后通常会被“模糊化”,即相对于绝对的0会有一定的误差。因此我们在使用clip函数时应该考虑到这一因素,通过让alpha减去0.1来实现。当然,0.1不是固定的,其他合理范围内的值也可以。

以下是使用clip实现透明效果,与不使用clip时的对比图:

此外,clip还可以使用在其他很多方面。比如很多优化算法,通过相应的判别依据(这里我们以alpha值作为依据,此外也可以使用距离等参数作为判断依据)作为参数传递到clip函数中,以决定场景中哪些部分可以剔除,以减轻运算负荷。在下一篇文章中,我们将实现一种游戏中很重要的一种效果:雾化,在该例子中,为了提高效率,可以使用clip函数,把位于能见度以外的场景剔除。

本文完。

分享到:
评论

相关推荐

    d3d11游戏编程入门(美)Allen+Wendy中英文版高清pdf+源码

    《DirectX 11游戏编程入门》是由Allen Sherrod和Wendy Jones合著的一本经典教程,旨在帮助初学者掌握DirectX 11技术在游戏开发中的应用。DirectX 11是微软推出的一个图形应用程序接口(API),广泛用于Windows平台的...

    d3d11renderers.rar

    Direct3D 11(简称D3D11)是微软推出的一种强大的图形应用程序接口(API),用于开发高性能的3D图形应用,广泛应用于游戏开发、可视化设计等领域。在C++中,D3D11提供了一套丰富的函数和类,帮助开发者实现复杂的...

    NVAPI抓屏传递给D3D11(D3D9到D3D11的数据传递)

    2、D3D11利用D3D9传入的HANDLE使用OpenSharedResource来打开句柄实现D3D9到D3D11的数据传递 需要的库 1、NVAPI 安装完成后需要运行NVIDIA Capture SDK\bin目录下的NvFBCEnable.exe使能NVFBC抓屏 2、DXSDK_Jun10 坑...

    Qt5窗口显示D3D11的程序示例

    在本文中,我们将深入探讨如何在Qt5框架中集成并显示Direct3D 11(简称D3D11)图形。D3D11是Microsoft开发的DirectX图形API,用于高性能的3D图形渲染,而Qt5则是一个跨平台的应用程序开发框架,广泛应用于桌面和移动...

    【C++】D3D11 最新HOOK 源码支持X86_X64

    【C++】D3D11 最新HOOK 源码支持X86_X64 【C++】D3D11 最新HOOK 源码支持X86_X64 【C++】D3D11 最新HOOK 源码支持X86_X64 【C++】D3D11 最新HOOK 源码支持X86_X64 【C++】D3D11 最新HOOK 源码支持X86_X64 【C++】D3...

    D3D11直接渲染YUV

    在计算机图形学领域,D3D11,全称Direct3D 11,是Microsoft开发的一个图形应用程序接口(API),用于处理3D图形和游戏编程。它属于Windows API的一部分,为开发者提供了强大的硬件加速功能,包括对现代GPU的充分利用...

    windows mft d3d11渲染显示 播放器

    本话题主要探讨如何使用Direct3D 11(D3D11)作为渲染引擎来构建一个播放器应用。 Direct3D 11是微软开发的图形应用程序接口(API),用于高效地处理游戏、视频和其他图形密集型应用的渲染。D3D11提供了比其前代更...

    D3D11YUVRendering.rar

    在Direct3D 11(简称D3D11)中,高效地渲染YUV格式的视频数据是一项关键技能,特别是在视频播放和处理领域。YUV色彩空间是一种常见的视频编码方式,它将图像数据分为亮度(Y)和两个色差分量(U和V),以节省带宽和...

    d3d11_hook

    Direct3D 11(简称D3D11)是Microsoft开发的图形API,用于处理复杂的3D图形渲染任务,广泛应用于游戏开发、图形设计等领域。在软件工程中,"hook"技术是一种拦截函数调用的技术,允许开发者在函数调用前后插入自定义...

    D3D11 Blending示例程序

    Direct3D 11(简称D3D11)是微软开发的一个图形应用程序接口(API),用于处理游戏和图形密集型应用的3D图形渲染。在这个名为“D3D11 Blending示例程序”的项目中,我们关注的是D3D11中的混合(Blending)特性,它在...

    D3D11初始化代码

    本篇文章将深入探讨D3D11的初始化过程,这对于任何想要学习或使用Direct3D 11的人来说都是至关重要的基础知识。 首先,我们需要理解D3D11的核心概念。Direct3D 11提供了硬件加速的3D图形渲染,它通过设备(ID3D11...

    demo_online.rar_DEMO_d3d11解码_d3d9 dxva_ffmpeg d3d11 render_ffmpe

    ffmpeg硬解码。windows下支持d3d9 d3d11硬件加速

    D3D11字体系统

    由于D3D11字体系统利用GPU进行渲染,所以即使是大量或频繁的文本更新,也不会对游戏或应用程序的帧率造成显著影响。 为了优化性能,D3D11字体系统通常会使用纹理atlases,即将多个字符的位图合并到一个大的纹理中,...

    D3D11_RenderTo2DTexture

    标题"D3D11_RenderTo2DTexture"和描述中...通过这种方式,开发者可以利用D3D11的RTT功能实现复杂的图像处理效果,增强游戏和应用程序的视觉表现。同时,这也涉及到对Direct3D 11 API的深入理解和对图形编程的熟练掌握。

    【D3D11游戏编程】XNAMath XMVECTOR

    在Direct3D 11(简称D3D11)的游戏编程中,XNAMath是一个重要的数学库,用于处理3D图形计算中的各种数学运算,如向量、矩阵、旋转和平移等。XNAMath是Microsoft为DirectX SDK开发的一个高效、优化的数学库,它提供了...

    D3D11_Render

    D3D11 Render,我们可以理解为基于Direct3D 11的渲染系统,它包含了进行高效、高质量3D图形编程的各种技术和方法。 在Direct3D 11中,最重要的改进之一是引入了更强大的硬件抽象层,使得开发者能够充分利用现代多核...

    D3D11程序框架

    Direct3D 11,简称D3D11,是微软开发的一个图形API,用于创建高性能的三维图形应用,尤其在游戏开发和专业可视化领域有着广泛的应用。D3D11程序框架是学习和理解Direct3D 11的基础,它提供了一个结构化的起点,帮助...

    【D3D11游戏编程】XNAMath XMMATRIX

    在3D游戏编程中,Direct3D 11(D3D11)是一个关键的图形接口,用于创建复杂的三维图像。XNAMath是微软为DirectX SDK提供的一套高效且易于使用的数学库,特别适合于进行3D图形处理。在本教程中,我们将深入探讨...

    D3D11-Wallhack-master.zip_FW1FontWrapper_d3d11 hook源码_dx11_mainv

    在IT行业中,Direct3D 11(简称D3D11)是微软开发的图形应用程序接口(API),用于处理Windows平台上的3D图形渲染。它属于DirectX的一部分,广泛应用于游戏开发、科学可视化和专业图像处理等领域。"Wallhack"通常指...

    D3D11光照计算示例程序

    Direct3D 11(简称D3D11)是微软开发的一个图形应用程序接口(API),用于处理计算机和游戏中的三维图形渲染。这个资源提供的示例程序是一个D3D11光照计算模型,旨在帮助开发者理解和实现光照效果在3D场景中的应用。...

Global site tag (gtag.js) - Google Analytics