| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> OpenGL ES 2.0 for Android教程(四):添加颜色和阴影 -> 正文阅读 |
|
[大数据]OpenGL ES 2.0 for Android教程(四):添加颜色和阴影 |
OpenGL ES 2 第四章:添加颜色和阴影
在现实世界中,对象具有不同的颜色和阴影。如果我们看看家里的墙,可以看到它被涂成了单一颜色。同时,墙的某些部分看起来会更暗或更亮,这取决于朝向周围光线的角度。我们的大脑利用这些细微的阴影差异作为主要的视觉线索之一,帮助理解我们所看到的东西;艺术家们从一开始就一直在利用这些线索来欺骗我们的大脑。在本章中,我们将向艺术家学习,并使用不同的颜色和阴影使我们的桌子看起来不那么平坦,更逼真。 在上一章中,要把我们的曲棍球桌画到屏幕上需要做很多工作,包括两个木槌和桌子中间的一条分界线。有很多准备工作,包括编写代码来加载和编译着色器,并将它们链接到OpenGL程序对象中。 OpenGL ES 2.0比较好的一点就是很多开销都是从一开始就产生的,从现在开始情况会有所好转。虽然还会添加更多的代码,但我们将能够在接下来的每一章中重用所有之前写的那些基本代码。事实上,现在我们有了一个基本的框架,为场景添加不同的颜色和阴影会容易得多。 以下是本章的游戏计划:
我们可以在原先的 平滑着色在第2章“定义顶点和着色器”中,我们学习了如何以统一的颜色绘制对象,如下图所示: 我们已经知道,我们只能绘制点、线和三角形,而我们必须从这些基本元素开始构建一切。由于我们仅限于这三种基本元素,我们如何用不同的颜色和色调来表示复杂的场景? 一种方法是使用一百万个小三角形,每个三角形都有不同的颜色。如果我们使用足够多的三角形,我们可以骗过观众,让他们看到一个美丽、复杂、色彩变化丰富的场景。虽然这在技术上是可行的,但性能和内存开销也会非常糟糕。 如果有一种方法可以在同一个三角形上混合不同的颜色,而不是绘制一组平面三角形呢?如果我们在三角形的每个顶点上使用不同的颜色,并将这些颜色混合到整个三角形的表面上,我们最终会得到一个平滑着色的三角形,就像下面这样: 在顶点之间进行平滑着色OpenGL为我们提供了一种方法,可以平滑地混合(blend)直线或三角形平面上每个顶点的颜色。我们将使用这种类型的阴影使我们的桌子在中间显得更亮,朝向边缘变暗,好像有一盏灯在桌子中间盘旋。不过,在完成这项工作之前,我们需要更新桌子的结构。以前我们用两个三角形绘制桌子,如下图所示: 我们怎么才能让它在中间看起来更亮?现在的桌子设计中,中间并不存在顶点,所以没有什么东西可以混合或变暗(颜色混合以顶点为基础)。我们需要在中间添加一个点,这样我们就可以在桌子中间和边缘之间混合颜色。我们的桌子结构如下所示: 我们需要做的第一件事是更新我们的数据以匹配这个新结构。 介绍三角扇形(Triangle Fans)在表格中间有一个新的点,我们将用四个三角形代替两个三角形。我们将把新的点放在(0, 0)。让我们更新
你可能会问的第一个问题是,“为什么我们只定义了六个点?我们不需要为每个三角形定义三个顶点吗?”虽然每个三角形确实需要三个顶点,但有时我们可以在多个三角形中重复使用同一个顶点。让我们再次看看我们的新结构,每个独特的点都有编号: 每个边顶点用于两个三角形,中心顶点用于所有四个三角形!如果我们必须一次又一次地输入相同的坐标,这将很快变得令人厌烦,因此我们告诉OpenGL重用这些顶点。我们可以把这些顶点画成一个三角形扇形。三角形扇形看起来像下图: 三角形扇形绘制选项实际上是从一个中心顶点(0,0)开始,使用下两个顶点(-0.5,-0.5)、(0.5,-0.5)来创建第一个三角形。最后的顶点(0.5,-0.5)将参与创建下一个三角形,围绕原始中心点呈扇形展开。为了完成扇形,我们只需在最后重复编号为2的点(或者给个新的编号6)。 我们需要更新draw调用,以便OpenGL知道这个数据代表一个三角形扇形。在
巧合的是,上述代码其实只修改了 这将要求OpenGL使用我们定义的六个新点绘制一个三角形扇形。让我们快速运行一下应用程序,桌子看上去应该和以前一样,看不出来它是借助三角形扇形画出来的,如下图所示: 现在我们已经用一个中心点重新定义了桌子,让我们学习如何将颜色作为第二个属性添加到每个顶点。 添加新的颜色属性我们已经通过在表格中心添加一个额外的顶点来更新桌子的结构,现在我们可以为每个点添加一个颜色属性。让我们更新整个数据数组,如下所示:
如你所见,我们为每个顶点增加了三个额外的数字。这些数字代表红色、绿色和蓝色,它们一起构成特定顶点的颜色。
将颜色属性添加到着色器下一步将从着色器中移除
我们添加了一个新的attribute 正如我们在“介绍OpenGL管道”章节中了解到的,当OpenGL构建一条线时,它会获取构成该线的两个顶点并为其生成fragment。当OpenGL构建一个三角形时,它一样会使用三个顶点来生成fragment,构建一个三角形。然后,将为生成的每个fragment运行fragment shader。
在我们详细介绍如何进行这种混合之前,让我们也向Fragment Shader添加
我们用 现在我们已经更新了着色器,我们还需要更新Kotlin代码,以便将新的颜色属性的值传递给顶点着色器中 Varying变量如何为每个片元计算混合颜色我们刚刚了解到,我们可以使用 沿着直线的线性插值假设我们有一条带有红色顶点和绿色顶点的直线,我们想把颜色从一个混合到另一个。混合的颜色看起来像这样: 在线条的左侧,每个片元的颜色大部分是红色。当我们向右移动时,片元变得不那么红了,在中间,它们在红色和绿色之间。当我们接近绿色顶点时,片元变得越来越绿。 我们可以看到,每种颜色沿线条的长度呈线性缩放。由于直线的左顶点为红色,右顶点为绿色,因此直线的左端应为100%红色,中间应为50%红色,右侧应为0%红色: 绿色同理。由于左顶点为红色,右顶点为绿色,因此直线的左端为0%绿色,中间为50%绿色,右侧为100%绿色: 总而言之这就是线性插值。每种颜色的强度取决于每个片元与包含该颜色的顶点之间的距离。 为了计算这个,我们可以取顶点0处的值和顶点1处的值,然后计算当前片元的距离比。距离比只是一个介于0%和100%之间的比率,0%是左顶点,100%是右顶点。当我们从左向右移动时,距离比将从0线性增加到100%。以下是几个距离比的示例: 要使用线性插值计算实际混合值,我们可以使用以下公式: blended_value = (vertex_0_value * (100% – distance_ratio)) + (vertex_1_value * distance_ratio) 这个计算针对每个分量进行,因此如果我们处理颜色值,线性插值计算将分别针对红色、绿色、蓝色和alpha分量进行,并将结果组合成一个新的颜色值。使用不同的颜色时,我们可以将任意两种颜色混合在一起,但不仅限于颜色,我们也可以对其他属性进行插值。 现在我们知道了线性插值是如何处理直线的,接下来我们来看看它是如何处理三角形的。 在三角形平面上进行混合线性插值在三角形平面内使用类似的数学原理,但现在有三个点和三种颜色需要处理。让我们看一个直观的例子: 这个三角形有三种颜色:上顶点是青色,左顶点是品红,右顶点是黄色。让我们将三角形分解为每个顶点衍生的颜色: 就像线条一样,每种颜色在其顶点附近最强,并向其他顶点淡出。我们依然使用比例来确定每种颜色的相对权重,但这次我们使用的是面积比例而不是长度: 在三角形内部的任何给定点,通过从该点到每个顶点绘制一条线,可以创建三个内部三角形。这些内三角形的面积比决定了该点每种颜色的权重。例如,黄色在该点的强度由黄色顶点对面的内三角形的面积决定。点离黄色顶点越近,三角形越大,该点的片元越黄。 就像线一样,这些比例加起来总是100%。我们可以使用以下公式计算三角形内任意点的颜色: blended_value = (vertex_0_value * vertex_0_weight) + (vertex_1_value * vertex_1_weight) + (vertex_2_value * (100% – vertex_0_weight – vertex_1_weight)) 使用新颜色属性进行渲染现在我们已经向数据中添加了一个颜色属性,并更新了顶点和片段着色器以使用该属性,接下来的步骤是删除通过 更新常量在
我们现在可以删除与
更新onSurfaceCreated()的代码下一步将更新
然后我们还需要更新对
现在,我们可以添加代码,告诉OpenGL将顶点数据与着色器中的颜色相关联。将以下代码添加到
这是一段重要的代码,所以让我们花时间仔细理解每一行:
更新onDrawFrame()代码我们还有一件事要做:更新 目前达到的效果我们的桌面曲棍球桌看起来比以前更漂亮了,我们可以清楚地看到桌面中间的颜色比边缘的颜色更亮。然而,我们也能辨认出每个三角形的形状。这是因为线性插值的方向是沿着三角形的,所以虽然三角形内部看起来很平滑,但我们有时仍然可以发现两个三角形之间的交界处很显眼。 为了减少或消除这种影响,我们可以使用更多的三角形来达到更平滑的效果,或者我们可以使用照明算法,并在每个片段的基础上计算颜色值。我们将在以后学习更多关于照明算法的内容。 本章小结既然我们已经有了一个基本的框架,给每个顶点添加颜色并不是那么糟糕。为此,我们为顶点数据和顶点着色器添加了一个新属性,我们还告诉OpenGL如何使用 需要记住的重要一点是,当我们传入属性数据时,我们需要确保传入正确的组件计数和步幅值。如果我们做错了这些,我们可能会导致屏幕乱码甚至崩溃。 练习看看你能不能给横穿屏幕中间的线条添加一些颜色插值。对于一个更具挑战性的练习,你会如何改变组成空中曲棍球台的三角形,使其边缘不那么显眼?提示:你可以尝试向三角形扇形添加更多三角形。 完成这些练习后,我们将开始学习向量和矩阵,并学习如何解决从纵向旋转到横向时出现的棘手问题。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 7:38:14- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |