OpenGL入门学习——第九课 使用混合来实现半透明效果
- 格式:doc
- 大小:46.00 KB
- 文档页数:7
制作半透明效果的技巧与方法要制作出半透明的效果,Photoshop是一个非常强大的工具。
无论是用于设计网页,还是处理照片,半透明效果都能给作品增添一丝神秘感和艺术感。
下面将分享几种制作半透明效果的技巧与方法。
1. 图层蒙版法图层蒙版是制作半透明效果常用的方法之一。
首先,在Photoshop中打开你的图像。
然后,创建一个新图层并将其填充为黑色。
接下来,在图层面板中将这个新图层的透明度设置为你想要的半透明效果。
最后,使用画笔工具,在图层蒙版上使用白色涂抹,即可将图像部分区域变为半透明。
2. 拷贝图层法通过拷贝图层的方法,你可以制作出具有半透明效果的图像。
在图层面板中,将要制作半透明效果的图像复制一份。
然后,在复制的图层上,通过使用调整工具来降低其整体的透明度。
你也可以选择只对图像的某个部分调整透明度,通过选取部分图层并使用调整工具来实现。
3. 混合模式法混合模式是Photoshop中一个非常有用的功能,通过使用不同的混合模式,可以轻松制作出半透明的效果。
在图层面板中,选择要应用半透明效果的图层,在混合模式下拉菜单中选择"正片叠底"或"色彩减淡"等适合的模式。
根据你的需要,可以尝试不同的混合模式,找到最适合的效果。
4. 透明度渐变法透明度渐变是一种常用的制作半透明效果的方法。
首先,在图层面板中选择要制作效果的图层。
然后,选择渐变工具,并在工具选项栏中选择透明度渐变模式。
在图像上拖动渐变工具,创建一个从不透明到透明的渐变效果。
5. 透明度调整法Photoshop提供了调整图层透明度的功能,可以快速制作出半透明的效果。
在图层面板中,选择要调整透明度的图层,然后找到图层不透明度滑动条,通过拖动滑动条调整图层的透明度。
你还可以使用不透明度工具来精确调整图层的透明度。
通过使用上述技巧与方法,你可以轻松制作出各种类型的半透明效果,为你的设计和照片增添一份独特的魅力。
无论是制作网页设计,还是美化照片,这些技巧都能帮助你实现想要的效果。
制作透明材质效果的详细步骤透明材质是在三维建模和渲染过程中经常使用的一种效果,它可以使物体部分或全部透明,达到真实效果。
在Blender软件中,制作透明材质非常简单,只需按照以下步骤进行操作即可。
步骤一:打开Blender软件并导入模型首先,确保你已经安装了最新版的Blender软件,并打开它。
接下来,导入你想要给予透明效果的模型。
可以通过点击"File"菜单,然后选择"Import"选项来导入已经准备好的模型。
步骤二:选择模型并进入编辑模式选中你导入的模型,然后按下Tab键进入编辑模式。
在这个模式下,你可以对模型的各个组成部分进行编辑和修改。
步骤三:选择需要透明的部分并分配材质运用选择工具(常用的是Box Select或Circle Select),选中你想要赋予透明效果的部分。
接下来,点击Properties面板中的Material选项卡,然后点击"+"按钮添加一个新的材质。
步骤四:调整透明度参数在Material选项卡中,你可以找到一个参数叫做"Alpha"。
将它的值设置为较低的数字,比如0.5,这将使你选择的部分变得半透明。
如果你想要更高的透明度,你可以继续降低这个值。
此外,你还可以根据需要调整其他参数,如颜色、光泽等。
步骤五:调整渲染设置点击Render选项卡,在其中你可以找到一个叫做"Film"的选项。
将"Transparent"复选框选中,确保启用了透明背景的渲染效果。
步骤六:渲染动画或静态图像现在,你已经完成了透明材质的制作。
你可以选择直接渲染静态图像,或者通过设置相机路径、添加动画等来渲染动画效果。
点击Render选项卡中的"Render Image"按钮,即可开始渲染过程。
在完成渲染之后,你可以将生成的图像保存到本地。
在Blender中制作透明材质确实很简单。
半透明信息显示浮动窗口的实现实现目的在一些画图软件中,经常需要向用户展示鼠标移动到的位置的对象的一些参数信息。
此时,完成一个交互性友好的信息显示界面就相当的重要了。
因为一个软件的好坏,在用户的眼中,第一感觉甚至是第一重要的就是视觉效果和可操作性。
当然,软件本身的稳定性和效率也很重要。
特别对于产品性的软件,在用户展示时,一个优秀的界面效果可以大大加深软件在用户心里的印象分。
功能简介本功能是作者根据自身软件在用户实际使用过程中对交互性的更高要求而开发的。
浮动窗口其实是一个对话框,设置为无标题的风格,然后进行自绘制而成。
能够根据需要显示的内容自动调整窗口的大小,保证正好能够容纳需要显示的内容。
如以下效果:图中黄色条为栏目分隔,同时显示其下内容所属的信息域。
如图中表示下方信息为台风即时预报信息的内容。
下方信息分成两栏,栏间绘制线条进行分割。
左侧为信息标题,右侧为信息内容。
比如台风名称是奥麦斯。
如果鼠标移动的位置,同时选中多项内容,那么,提示信息可以同时包括多个栏目,如下图:本图中包括两个栏目,即本公司船位置信息和美气导的等压线信息。
从理论上讲,本功能可以支持任意多的栏目,前提是你的显示器能够容纳得下。
整个界面的效果是半透明的。
包括透明度,字体大小和信息内容的颜色都可以由用户自行定义,配置界面如下:透明度范围为0-255;背景色列表框是作者在博客中已提供的一个自定义的线条、填充和颜色选择列表控件。
修改完成后,可以改变浮动窗口的显示效果,比如一种修改后的效果:这样,即使用户对浮动窗口内容的展示方式不满意,那么也完全可以由用户自行定义自己喜欢的风格。
当然,在此基础上,可以进一步扩大自定义的范围。
本例中,栏目分割条的背景色和信息内容标题文字的颜色是固定的,信息内容文字的颜色是背景色的反色,这些都可以考虑加入到自定义项中。
代码实现主要数据结构以下是消息提示项的数据结构。
typedef struct _MSG_TIP//消息提示数据项描述信息{CString sMsgItemName; //信息标题CString sMsgItemInfo; //信息内容COLORREF nInfoShowColor; //显示颜色(此项值目前暂时没有使用,原意是使每个栏目的文字颜色均可自定义;因为考虑到设定的颜色可能和背景色冲突,因此目前文字颜色使用背景色的反色)}MSG_TIP;typedef CArray<MSG_TIP,MSG_TIP&> CMsgTipArray;//消息提示内容。
融会CorelDRAW9之四——透明图案直线网这篇教程也写了两个小节了,渐渐的,刚开始那一种有点“难”的感觉开始少起来,只觉得CorelDRAW9这东西可真是很多效果真的可用很多种方法做出来——哈哈,连自己都被征服了!——是不是有点自欺欺人的感觉?呵呵,反正我是这样了。
而且教程走到这一步来,无论从那一方面说,我甚至有点欲罢不能的感觉了。
这一小节说说如何做透明,没问题吧?当然也是两种方法了,这是老规矩嘛。
先给你透露一点:这两种方法分别是用“交互式透明工具”和“透镜”。
作好准备,实例开始了。
第一种方法:这种方法使用“交互式透明工具”。
先从CorelDRAW9的素材库中找一幅图片吧。
如图13(图13)图片找好了,现在我们应该开始正式的工作了。
第一步:输入字母“CorelDRAW9”(注意,这段文本应该是“美术字文本”,别设成“段落文本”了)。
这时,“CorelDR 默认的颜色是黑色,所以文字在图片上的黑色位置就不能区别出来,因此请你:“点击工具箱上的“轮廓线工具”中的廓线颜色”工具(或“属性条”中的“轮廓线颜色”),将文字的轮廓线设为白色”(也可以将文字的颜色填充为其色,以区别于黑色背景)。
这一步效果如图14。
(图14)第二步:选择文字,点击工具箱上的“造型工具”(此时文本框的左下角和右下角各自出现了一个箭头,并且每一个左下角也出现一个小方块)。
请移动箭头,将文字框适当缩小,于是字母之间的某些部分就出现了重叠。
并请拖动文下角的小方块,对个别字母的位置进行调整。
调整好后请点击“选择工具”恢复正常缩放状态,继续对文本框的大小调整。
最后达到如图15的效果就可以了(图15)第三步:点击“交互式透明工具”,在属性条中任选一种透明类型,设置好后就能完成透明的效果了。
如图16(图16)不知你看到没有,在这里有一个弊病:字母重叠的地方没有达到透明的效果,而且单个字母的轮廓线还保留在透明区这就需要我们进行另外的处理。
第四步:(取消第三步的处理),选择文字,将其转换为曲线,然后运用“分离命令”将每个字母分解出来。
轻松掌握透明与半透明材质设置在Blender软件中,透明与半透明材质的设置是非常重要的一部分。
无论是为了创建透明的玻璃材质,还是为了模拟半透明的水或者烟雾效果,正确的材质设置都是不可或缺的。
今天,我们就来学习如何轻松地掌握透明与半透明材质的设置。
首先,打开Blender软件并创建一个新的场景。
然后,选择一个物体作为我们的示例对象。
可以是一个简单的几何物体,比如立方体或球体。
接下来,选择该物体并进入“材质”选项卡。
在这里,我们可以看到许多控制材质属性的选项。
为了创建透明或半透明的材质,我们需要调整“表面”选项卡下的“透明”属性。
首先,将透明属性从默认的0调整为一个小于1的值。
值越接近1,材质越不透明;值越接近0,材质越透明。
通过调整这个值,我们可以精确地控制材质的透明度。
但是,仅仅调整透明度是不够的。
我们还需要告诉Blender如何处理透明的区域。
在“透明性”选项下,我们可以选择不同的混合模式。
默认情况下,这个选项是“不透明”的,这意味着物体将完全不透明。
但是,如果我们选择“混合”模式,我们就可以使物体的一部分透明。
在混合模式下,我们需要进一步调整“Alpha”属性,以指定哪些区域应该是透明的。
通过将Alpha属性从默认的1调整为一个小于1的值,我们可以创建半透明的效果。
根据需要,可以反复尝试不同的值,直到达到理想的效果。
通过这些简单的步骤,我们就可以轻松地创建透明与半透明的材质。
但是,在实际应用中,我们可能会遇到一些挑战。
比如,如果我们希望在室外场景中使用透明材质,我们可能需要考虑到光照的影响。
通常情况下,透明的材质会受到环境光的影响,这可能会导致透明效果不太明显。
为了解决这个问题,我们可以在材质选项卡中调整“渲染”属性下的“透明阴影”选项。
将“透明阴影”选项调整为开启状态,Blender将会更好地处理透明材质与环境光的关系,从而获得更加真实的效果。
此外,还可以尝试使用纹理或者渐变来改善透明材质的效果。
高级渲染技巧:透明效果在3D渲染中,透明效果是一个非常重要的技巧。
它可以实现诸如玻璃、水和烟雾等效果的模拟。
在本教程中,我将向您展示如何在Blender软件中实现透明效果。
首先,我们需要创建一个物体,并将其设置为透明材质。
我们可以使用一个简单的立方体作为示例。
1.打开Blender软件并进入“建模”(Modeling)工作区。
2.使用Shift + A快捷键在场景中创建一个立方体。
接下来,我们将为立方体设置透明材质。
3.在“属性”(Properties)面板中,转到“材质”(Material)选项卡。
4.单击“New”按钮创建一个新的材质。
5.将“Surface”设置为“Principled BSDF”。
6.将“Base Color”设置为您想要的颜色。
7.将“Transmission”设置为一个小于1的值,以控制物体的透明度。
值越低,物体越透明。
现在,我们已经成功地为物体设置了透明材质。
接下来,我们将调整渲染设置以获得更好的透明效果。
8.转到“渲染”(Render)选项卡并将“Engine”设置为“Cycles”。
9.展开“光线追踪”(Ray Visibility)选项卡,并确保“Transparent”选项被选中。
这样做可以确保光线可以透过物体,并将物体后面的内容进行正确渲染。
现在,我们已经完成了设置,可以开始渲染透明效果了。
10.在“渲染”选项卡中,将“Samples”设置为一个较高的值,以获得更平滑的渲染结果。
请注意,较高的样本数将会增加渲染时间。
根据您的硬件性能和时间限制,您可以适当调整样本数。
11.单击“渲染”按钮开始渲染。
完成渲染后,您将看到透明材质的效果。
如果您想进一步改进透明效果,您可以尝试以下技巧:- 添加散射(Scattering):透明材质不仅可以透过光线,还可以将光线散射到周围环境中。
通过调整“散射”参数,您可以使透明物体看起来更真实。
- 使用纹理:您可以将纹理应用于透明材质,以模拟不同的材质,如玻璃或水。
opengl颜色混合算法【原创版】目录1.OpenGL 简介2.颜色混合算法的概念3.OpenGL 中的颜色混合函数4.颜色混合的实际应用5.结论正文1.OpenGL 简介OpenGL(Open Graphics Library)是一个跨平台的图形编程接口,用于渲染 2D 和 3D 图形。
它被广泛应用于游戏开发、模拟、科学可视化等领域。
OpenGL 提供了丰富的功能,如绘制线条、三角形、多边形、纹理贴图、光照和阴影等,可以实现各种复杂的图像效果。
2.颜色混合算法的概念颜色混合是指将两种或多种颜色按照一定的比例进行组合,生成一种新的颜色。
在计算机图形学中,颜色混合常用于实现透明度不为 1 的物体的重叠效果,使得重叠区域的颜色呈现出混合后的效果。
颜色混合算法可以用于实现多种视觉效果,如半透明物体、颜色过渡、阴影等。
3.OpenGL 中的颜色混合函数OpenGL 中提供了颜色混合函数 glBlendFunc,用于实现颜色混合效果。
glBlendFunc 接收两个参数,分别是源颜色和目标颜色。
源颜色表示当前正在绘制的颜色,目标颜色表示之前已经绘制过的颜色。
通过glBlendFunc 函数,可以设置颜色混合的方式,如加权平均、乘法等。
具体而言,glBlendFunc 函数的函数原型如下:```void glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);```其中,GL_SRC_ALPHA 表示源颜色的 alpha 通道,GL_ONE_MINUS_SRC_ALPHA 表示目标颜色的 alpha 通道的补值。
通过设置这两个参数,可以实现不同类型的颜色混合效果。
4.颜色混合的实际应用颜色混合在 OpenGL 中应用广泛,例如实现半透明物体、颜色过渡、阴影等效果。
以下以半透明物体为例,介绍颜色混合的应用:假设需要绘制一个半透明的红色玻璃,我们可以先绘制红色的玻璃,再绘制后面的绿色物体。
用户界面设计知识:如何在用户界面设计中运用半透明元素介绍在用户界面设计中,半透明元素应用的越来越流行。
这种设计技巧可以通过透明度降低元素的可见度,从而创造出更加柔和、高质感和美观的用户界面。
本文将分享关于如何在用户界面设计中运用半透明元素的知识,包括半透明的具体应用场景、如何运用半透明元素来提升用户体验以及如何在设计中注意半透明元素的使用和优化,帮助读者更好地运用该技巧创造出令人惊艳的用户界面。
半透明元素的应用场景1.有层次感的按钮和选项卡在许多应用程序中,按钮和选项卡是设计中的重要组件,它们能带来视觉上的层次感、分层和层次结构。
通过降低不同元素的透明度,可以巧妙地区别于其他元素,同时还能创造局部视觉变化,帮助用户更快更好地理解应用程序的结构和功能。
2.创建柔和的背景、阴影或高光通过使用半透明元素,设计师可以创造出柔和的背景、阴影和高光。
该设计技巧应用广泛,可以帮助增强应用或网站视觉效果,同时还能减少与其他元素之间的视觉冲突。
3.优化配色方案如果您的应用程序或网站的配色方案很复杂,那么半透明元素是一个非常有效的方法,可以定制程度非常高。
这种效果可以通过将两种或多种不同颜色的半透明元素进行层叠来实现。
这为设计师创造不同颜色之间和谐的遮盖层,使其更加接近整体视觉效果。
4.更好的阅读体验半透明也可以用来提高文本可读性。
例如,设计师可以将半透明遮罩应用于背景图像之上来平衡图片和文本之间的分割线,使整个视觉更加和谐。
这种设计技巧可以帮助提高用户阅读文本的爽快感,从而提高用户体验。
如何在用户界面设计中运用半透明元素来提升用户体验1.注意元素之间的对比度使用半透明元素时一定要注意整体对比度。
半透明元素的设计在视觉上往往会非常明亮,但当它们与其他颜色的元素混合在一起时,可能会失去其效果。
设计师应该确保半透明元素与应用程序或网站的配色方案相匹配,同时还要考虑到其周围的其他元素,以确保在各个方面的对比度。
2.选择合适的颜色未经处理的红色或橙色透明度的半透明元素,通常看起来非常醒目和暴力。
AE中的半透明效果制作Adobe After Effects (AE) 是一款常用的视频编辑软件,它提供了丰富的特效和动画功能,能够让用户创造出各种令人惊叹的影片效果。
其中,制作半透明效果是一项非常常见和实用的技巧,本文将向您介绍如何在AE中实现半透明效果。
首先,我们需要明确半透明效果的概念。
半透明即物体呈现出半透明的状态,透过它可以看到后面的元素。
在AE中,我们可以通过使用透明图层和混合模式来实现这种效果。
在AE界面中,首先选择您想要应用半透明效果的图层。
然后,在该图层的属性窗口中找到“混合模式”选项。
这个选项决定了图层如何和下方图层进行混合。
点击下拉菜单,选择“正片叠底”作为混合模式。
正片叠底模式会将图层的亮度值变暗,并将下方图层的颜色与之混合,从而实现半透明的效果。
除了混合模式,我们还可以调整图层的不透明度来控制半透明的程度。
在图层属性窗口中找到“不透明度”选项,通过拖动滑块调整数值来改变图层的透明度。
数值越小,图层越透明。
现在,让我们以一个实际例子来演示半透明效果的制作步骤。
假设我们有一个视频素材,想要在画面中添加一个透明的图标,让它半透明地显示在画面上方。
首先,我们将视频素材导入AE,将其拖放到时间线中。
接下来,导入我们想要使用的图标素材,同样将其拖放到时间线中。
现在,选中图标素材图层,在属性窗口中找到“混合模式”选项,选择“正片叠底”作为混合模式。
然后,调整图层的不透明度,使图标呈现出合适的透明度。
此时,图标素材就会以半透明的状态显示在视频素材上方了。
您可以通过拖动图标素材来调整它在画面中的位置,通过调整不透明度来改变它的透明程度。
在AE中制作半透明效果并不复杂,只需要通过合适的混合模式和调整不透明度,就能轻松实现想要的效果。
但需要注意的是,制作半透明效果并不适用于所有情况,具体效果还需要根据实际需求进行调整。
总结一下,通过使用AE中的混合模式和调整不透明度,我们可以轻松实现半透明效果。
列举一些常用的半透明混合公式在图形设计和计算机图形学领域,半透明效果是非常常见的。
通过合理地混合颜色和透明度,我们可以创造出丰富的视觉效果,增强图像的立体感和层次感。
下面列举了一些常用的半透明混合公式,让我们来了解一下吧。
1. Alpha混合公式Alpha混合是一种基于颜色的透明度值(通常用Alpha通道表示)来混合两个颜色的方法。
最常用的Alpha混合公式是线性插值公式:C = (1 - alpha) * C1 + alpha * C2其中,C表示混合后的颜色,C1和C2分别表示要混合的两个颜色,alpha表示透明度值。
2. 加法混合公式加法混合是一种通过将两个颜色的RGB通道相加来混合颜色的方法。
加法混合公式如下:C = C1 + C2其中,C1和C2分别表示要混合的两个颜色,C表示混合后的颜色。
3. 减法混合公式减法混合是一种通过将两个颜色的RGB通道相减来混合颜色的方法。
减法混合公式如下:C = C1 - C2其中,C1和C2分别表示要混合的两个颜色,C表示混合后的颜色。
4. 正片叠底混合公式正片叠底混合是一种通过将两个颜色的RGB通道分别相乘再除以255来混合颜色的方法。
正片叠底混合公式如下:C = (C1 * C2) / 255其中,C1和C2分别表示要混合的两个颜色,C表示混合后的颜色。
5. 混合公式的应用这些常用的半透明混合公式可以应用于各种图像处理和图形设计的场景中,比如制作半透明的遮罩效果、创建渐变色背景、实现图层的叠加效果等等。
通过合理地选择和组合不同的混合公式,我们可以创造出各种丰富多样的视觉效果。
总结半透明混合是图形设计和计算机图形学中非常常见的技术,通过合理地混合颜色和透明度,我们可以创造出丰富的视觉效果。
本文列举了一些常用的半透明混合公式,包括Alpha混合、加法混合、减法混合、正片叠底混合等。
这些公式可以应用于各种图像处理和图形设计的场景中,帮助我们实现各种独特的视觉效果。
OpenGL入门学习——第九课使用混合来实现半透明效果今天介绍关于OpenGL混合的基本知识。
混合是一种常用的技巧,通常可以用来实现半透明。
但其实它也是十分灵活的,你可以通过不同的设置得到不同的混合结果,产生一些有趣或者奇怪的图象。
混合是什么呢?混合就是把两种颜色混在一起。
具体一点,就是把某一像素位置原来的颜色和将要画上去的颜色,通过某种方式混在一起,从而实现特殊的效果。
假设我们需要绘制这样一个场景:透过红色的玻璃去看绿色的物体,那么可以先绘制绿色的物体,再绘制红色玻璃。
在绘制红色玻璃的时候,利用“混合”功能,把将要绘制上去的红色和原来的绿色进行混合,于是得到一种新的颜色,看上去就好像玻璃是半透明的。
要使用OpenGL的混合功能,只需要调用:glEnable(GL_BLEND);即可。
要关闭OpenGL的混合功能,只需要调用:glDisable(GL_BLEND);即可。
注意:只有在RGBA模式下,才可以使用混合功能,颜色索引模式下是无法使用混合功能的。
一、源因子和目标因子前面我们已经提到,混合需要把原来的颜色和将要画上去的颜色找出来,经过某种方式处理后得到一种新的颜色。
这里把将要画上去的颜色称为“源颜色”,把原来的颜色称为“目标颜色”。
OpenGL 会把源颜色和目标颜色各自取出,并乘以一个系数(源颜色乘以的系数称为“源因子”,目标颜色乘以的系数称为“目标因子”),然后相加,这样就得到了新的颜色。
(也可以不是相加,新版本的OpenGL可以设置运算方式,包括加、减、取两者中较大的、取两者中较小的、逻辑运算等,但我们这里为了简单起见,不讨论这个了)下面用数学公式来表达一下这个运算方式。
假设源颜色的四个分量(指红色,绿色,蓝色,alpha值)是 (Rs, Gs, Bs, As),目标颜色的四个分量是(Rd, Gd, Bd, Ad),又设源因子为(Sr, Sg, Sb, Sa),目标因子为(Dr, Dg, Db, Da)。
则混合产生的新颜色可以表示为:(Rs*Sr+Rd*Dr, Gs*Sg+Gd*Dg, Bs*Sb+Bd*Db, As*Sa+Ad*Da)当然了,如果颜色的某一分量超过了1.0,则它会被自动截取为1.0,不需要考虑越界的问题。
源因子和目标因子是可以通过glBlendFunc函数来进行设置的。
glBlendFunc有两个参数,前者表示源因子,后者表示目标因子。
这两个参数可以是多种值,下面介绍比较常用的几种。
GL_ZERO:表示使用0.0作为因子,实际上相当于不使用这种颜色参与混合运算。
GL_ONE:表示使用1.0作为因子,实际上相当于完全的使用了这种颜色参与混合运算。
GL_SRC_ALPHA:表示使用源颜色的alpha值来作为因子。
GL_DST_ALPHA:表示使用目标颜色的alpha值来作为因子。
GL_ONE_MINUS_SRC_ALPHA:表示用1.0减去源颜色的alpha值来作为因子。
GL_ONE_MINUS_DST_ALPHA:表示用1.0减去目标颜色的alpha值来作为因子。
除此以外,还有GL_SRC_COLOR(把源颜色的四个分量分别作为因子的四个分量)、GL_ONE_MINUS_SRC_COLOR、 GL_DST_COLOR、GL_ONE_MINUS_DST_COLOR等,前两个在OpenGL旧版本中只能用于设置目标因子,后两个在OpenGL 旧版本中只能用于设置源因子。
新版本的OpenGL则没有这个限制,并且支持新的GL_CONST_COLOR(设定一种常数颜色,将其四个分量分别作为因子的四个分量)、GL_ONE_MINUS_CONST_COLOR、GL_CONST_ALPHA、 GL_ONE_MINUS_CONST_ALPHA。
另外还有GL_SRC_ALPHA_SATURATE。
新版本的OpenGL还允许颜色的alpha 值和RGB值采用不同的混合因子。
但这些都不是我们现在所需要了解的。
毕竟这还是入门教材,不需要整得太复杂~举例来说:如果设置了glBlendFunc(GL_ONE, GL_ZERO);,则表示完全使用源颜色,完全不使用目标颜色,因此画面效果和不使用混合的时候一致(当然效率可能会低一点点)。
如果没有设置源因子和目标因子,则默认情况就是这样的设置。
如果设置了glBlendFunc(GL_ZERO, GL_ONE);,则表示完全不使用源颜色,因此无论你想画什么,最后都不会被画上去了。
(但这并不是说这样设置就没有用,有些时候可能有特殊用途)如果设置了glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);,则表示源颜色乘以自身的alpha 值,目标颜色乘以1.0减去源颜色的alpha值,这样一来,源颜色的alpha值越大,则产生的新颜色中源颜色所占比例就越大,而目标颜色所占比例则减小。
这种情况下,我们可以简单的将源颜色的alpha值理解为“不透明度”。
这也是混合时最常用的方式。
如果设置了glBlendFunc(GL_ONE, GL_ONE);,则表示完全使用源颜色和目标颜色,最终的颜色实际上就是两种颜色的简单相加。
例如红色(1, 0, 0)和绿色(0, 1, 0)相加得到(1, 1, 0),结果为黄色。
注意:所谓源颜色和目标颜色,是跟绘制的顺序有关的。
假如先绘制了一个红色的物体,再在其上绘制绿色的物体。
则绿色是源颜色,红色是目标颜色。
如果顺序反过来,则红色就是源颜色,绿色才是目标颜色。
在绘制时,应该注意顺序,使得绘制的源颜色与设置的源因子对应,目标颜色与设置的目标因子对应。
不要被混乱的顺序搞晕了。
二、二维图形混合举例下面看一个简单的例子,实现将两种不同的颜色混合在一起。
为了便于观察,我们绘制两个矩形:glRectf(-1, -1, 0.5, 0.5);glRectf(-0.5, -0.5, 1, 1);,这两个矩形有一个重叠的区域,便于我们观察混合的效果。
先来看看使用glBlendFunc(GL_ONE, GL_ZERO);的,它的结果与不使用混合时相同。
void myDisplay(void){glClear(GL_COLOR_BUFFER_BIT);glEnable(GL_BLEND);glBlendFunc(GL_ONE, GL_ZERO);glColor4f(1, 0, 0, 0.5);glRectf(-1, -1, 0.5, 0.5);glColor4f(0, 1, 0, 0.5);glRectf(-0.5, -0.5, 1, 1);glutSwapBuffers();}尝试把glBlendFunc的参数修改为glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);以及glBlendFunc(GL_ONE, GL_ONE);,观察效果。
第一种情况下,效果与没有使用混合时相同,后绘制的图形会覆盖先绘制的图形。
第二种情况下,alpha被当作“不透明度”,由于被设置为0.5,所以两个矩形看上去都是半透明的,乃至于看到黑色背景。
第三种是将颜色相加,红色和绿色相加得到黄色。
三、实现三维混合也许你迫不及待的想要绘制一个三维的带有半透明物体的场景了。
但是现在恐怕还不行,还有一点是在进行三维场景的混合时必须注意的,那就是深度缓冲。
深度缓冲是这样一段数据,它记录了每一个像素距离观察者有多近。
在启用深度缓冲测试的情况下,如果将要绘制的像素比原来的像素更近,则像素将被绘制。
否则,像素就会被忽略掉,不进行绘制。
这在绘制不透明的物体时非常有用——不管是先绘制近的物体再绘制远的物体,还是先绘制远的物体再绘制近的物体,或者干脆以混乱的顺序进行绘制,最后的显示结果总是近的物体遮住远的物体。
然而在你需要实现半透明效果时,发现一切都不是那么美好了。
如果你绘制了一个近距离的半透明物体,则它在深度缓冲区内保留了一些信息,使得远处的物体将无法再被绘制出来。
虽然半透明的物体仍然半透明,但透过它看到的却不是正确的内容了。
要解决以上问题,需要在绘制半透明物体时将深度缓冲区设置为只读,这样一来,虽然半透明物体被绘制上去了,深度缓冲区还保持在原来的状态。
如果再有一个物体出现在半透明物体之后,在不透明物体之前,则它也可以被绘制(因为此时深度缓冲区中记录的是那个不透明物体的深度)。
以后再要绘制不透明物体时,只需要再将深度缓冲区设置为可读可写的形式即可。
嗯?你问我怎么绘制一个一部分半透明一部分不透明的物体?这个好办,只需要把物体分为两个部分,一部分全是半透明的,一部分全是不透明的,分别绘制就可以了。
即使使用了以上技巧,我们仍然不能随心所欲的按照混乱顺序来进行绘制。
必须是先绘制不透明的物体,然后绘制透明的物体。
否则,假设背景为蓝色,近处一块红色玻璃,中间一个绿色物体。
如果先绘制红色半透明玻璃的话,它先和蓝色背景进行混合,则以后绘制中间的绿色物体时,想单独与红色玻璃混合已经不能实现了。
总结起来,绘制顺序就是:首先绘制所有不透明的物体。
如果两个物体都是不透明的,则谁先谁后都没有关系。
然后,将深度缓冲区设置为只读。
接下来,绘制所有半透明的物体。
如果两个物体都是半透明的,则谁先谁后只需要根据自己的意愿(注意了,先绘制的将成为“目标颜色”,后绘制的将成为“源颜色”,所以绘制的顺序将会对结果造成一些影响)。
最后,将深度缓冲区设置为可读可写形式。
调用glDepthMask(GL_FALSE);可将深度缓冲区设置为只读形式。
调用glDepthMask(GL_TRUE);可将深度缓冲区设置为可读可写形式。
一些网上的教程,包括大名鼎鼎的NeHe教程,都在使用三维混合时直接将深度缓冲区禁用,即调用glDisable(GL_DEPTH_TEST);。
这样做并不正确。
如果先绘制一个不透明的物体,再在其背后绘制半透明物体,本来后面的半透明物体将不会被显示(被不透明的物体遮住了),但如果禁用深度缓冲,则它仍然将会显示,并进行混合。
NeHe提到某些显卡在使用glDepthMask函数时可能存在一些问题,但可能是由于我的阅历有限,并没有发现这样的情况。
那么,实际的演示一下吧。
我们来绘制一些半透明和不透明的球体。
假设有三个球体,一个红色不透明的,一个绿色半透明的,一个蓝色半透明的。
红色最远,绿色在中间,蓝色最近。
根据前面所讲述的内容,红色不透明球体必须首先绘制,而绿色和蓝色则可以随意修改顺序。
这里为了演示不注意设置深度缓冲的危害,我们故意先绘制最近的蓝色球体,再绘制绿色球体。
为了让这些球体有一点立体感,我们使用光照。
在(1, 1, -1)处设置一个白色的光源。
代码如下:void setLight(void){static const GLfloat light_position[] = {1.0f, 1.0f, -1.0f, 1.0f};static const GLfloat light_ambient[] = {0.2f, 0.2f, 0.2f, 1.0f};static const GLfloat light_diffuse[] = {1.0f, 1.0f, 1.0f, 1.0f};static const GLfloat light_specular[] = {1.0f, 1.0f, 1 .0f, 1.0f};glLightfv(GL_LIGHT0, GL_POSITION, light_position);glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);glEnable(GL_LIGHT0);glEnable(GL_LIGHTING);glEnable(GL_DEPTH_TEST);}每一个球体颜色不同。