C++和OpenGL实现3D游戏编程【连载17】——着色器进阶

欢迎来到zhooyu的专栏。
主页网址:【zhooyu】
专栏网址:【C++和OpenGL实现3D游戏编程】

🌟🌟🌟这里将通过一个OpenGL实现3D游戏编程实例教程,带大家深入学习OpenGL知识。知识无穷而人力有穷,希望能对您有所帮助。

🌟🌟🌟该教程为系列教程,每一步都有详细的教学和实例,推荐大家通过🔥C++和OpenGL实现3D游戏编程【目录】系统性的了解开发过程,了解怎样一步一步从简单入手,借助C++和OpenGL实现强大的3D效果。

🌟🌟🌟同时您可以在QQ群(群号:739903792)中与大家进行沟通交流,共同解决编程过程中的困惑。

在这里插入图片描述
着色器纹理操作基础演示:

着色器纹理操作基础

🔥C++和OpenGL实现3D游戏编程【目录】

1、本节要实现的内容

在前面着色器初步一节我们了解了着色器的一些初步知识,通过顶点着色器和片段着色器显示出了一个彩色的立方体。我们这节课就来了解一些在着色器中显示纹理等一系列实用操作,同时了解一些进阶的图像渲染技术,比如图像的灰度化处理,像游戏中灵魂状态下世界进行灰度化处理后的效果。使用GLSL渲染纹理是一种非常有用的技术,可以实现高效的图形处理和渲染,并且可以根据具体的应用场景和需求进行更复杂的渲染操作。

在这里插入图片描述

2、着色器显示纹理

我们前面学习了着色器显示立方体方法,但是还没有通过着色器给立方体添加图片纹理,由于纹理在游戏编程中使用非常频繁,而且着色器中对纹理的处理有非常大的扩展性和可操作性,包括各种对纹理图片的高级渲染方法,因此紧接着我们需要了解着色器显示纹理的方法。我们此前已经学习了VBO、VAO和EBO模式,以及着色器的初步知识,以上知识这里都会用到,如果有不了解的可以翻看一下以前对应章节的知识,我们这节主要了解一下着色器显示纹理的方法以及与传统的立即渲染默认显示纹理方法的相同与不同之处,需要注意的一些问题以及对着色器的理解。那我们来看一下着色器是操作并显示纹理的过程。

在这里插入图片描述

3、 纹理与颜色的混合

首先,我们看一下没有添加纹理,只是使用自定义定点颜色的正方形显示的颜色,我们直接在片段着色器中将最终输出颜色变量FragColor设置为输入的顶点颜色,就可以得到一个彩色的正方形。

在这里插入图片描述

我们现在改变一下片段着色器最终显示颜色的内容,使用mix函数进行颜色的线性混合,并可以手动添加线性混合因子的数值。

在这里插入图片描述
我们可以看到,纹理和原本颜色进行了融合,形成了非常自然过渡的颜色效果。

4、 纹理和纹理的融合

既然可以进行颜色和纹理的融合,那肯定也可以进行纹理和纹理的融合,本质上就是对纹理颜色使用mix进行融合。那么,我们首先需要在启用两个纹理单元(GL_TEXTURE0和GL_TEXTURE1),并在各自的纹理单元中绑定不同的纹理,这里我们绑定了texExampleSimpleBox和texExampleSmile两个纹理到各自的纹理单元。然后,通过glUniform1i函数将纹理单元编号传递给着色器,交给着色器处理后续的融合效果。

在这里插入图片描述

5、着色器纹理渲染实例——纹理灰度渲染

我们刚刚介绍了着色器的一些原理和功能实现,现在我们来做一个简单又实用的功能。当我以前玩游戏的时候,当人物角色死亡后,我们就会立即处于灵魂状态,然后我们在灵魂状态下会经过很长一段路途,在此过程中我们看到的世界所有都是灰白色的,就好像只能够看到整个世界的轮廓一样,整个世界都失去了原本的颜色,变成了黑白颜色。当时我在玩游戏的时候就感觉这个功能很不错,让人能明显的感受到灵魂状态与现实美丽世界的区别,那么这个功能要怎么能实现?答案来了现在就可以在着色器中实现,而且是很容易的实现。那么我们现用一个实例来表现一下它的效果。下面是一张彩色的图片纹理。我们先将它用着色器整个的输出到屏幕上。显示的效果如下:

在这里插入图片描述

我们刚刚讲过,我们通过着色器的片段着色器,可以控制整个模型输出的最终颜色。如果我们在模型的片段着色器中不对颜色进行灰度化的处理,那么最终显示出来的就是我们漂亮的世界,拥有各种漂亮的纹理颜色。那么我们现在需要做的就是对各种漂亮的纹理颜色进行灰度化处理。也就是在片段着色器中将输入的颜色,手工转化成灰白颜色,将灰白颜色作为输出变量即可。那么我们来看一下将一个颜色转换成灰白颜色有多么的简单。

彩色图像转化为灰度图像的过程称之为图像灰度化处理。对于灰度图像处理一般有四种方法:平均值法、加权平均值法、最大值、分量法。我们这里采用一种简单,效果又比较柔和的平均值方法,就是将原来输入的颜色RGB分量相加的和除以3,就能简单的将彩色颜色转换成为了灰度颜色。一个公式就搞定了!现在我们来看一下最终的灰度图效果。我们可以看到灰度颜色的效果非常完美。

在这里插入图片描述

当然我们现在实例中只有一个模型的着色体。当我们后期建的模型越来越多,我们需要灵魂状态的灰度界面时,我们就可以通过Uniform变量传递着色器一个是否进行灰白显示的标志,这样我们游戏里头所有的的模型都变成了灰白颜色,达到了我们所需要的灵魂状态灰度效果。等我们后期整个三维世界创建差不多的时候,我们可以试验一下它的效果。

6、着色器纹理坐标处理

有一点要注意,顶点着色器中处理的大多都是我们用户输入的顶点信息。就比如说你在自定义正方形数组时,共传递了4个顶点数据。那顶点着色器中我们主要的就是对这4个顶点的数据进行编程,我们可以对顶点的数据直接进行操作。而片段着色器的操作对象就比顶点着色器要多得多,片段着色器中可以控制整个正方形的颜色,不仅仅是4个顶点的颜色,我们可以对整个正方形的颜色进行处理,就比如说我们在下面这个例子中,将整个纹理坐标进行划分成3份,第1部分显示纹理原本的颜色,中间部分显示出纹理和原本顶点颜色的融合结果,最后一部分我们显示经过灰度化处理的纹理颜色。通过这个示例,我们明显可以感觉到,片段着色器对整个纹理输出的操作方式。

在这里插入图片描述

7、总结

当了解到这些知识了以后,我们对着色器慢慢的有了更深刻的认识,学习就是这样,不断的接触新事物,不断的总结反思,就会有新的收获。总之,使用GLSL渲染纹理是一种非常有用的技术,可以实现高效的图形处理和渲染,并且可以根据具体的应用场景和需求进行更复杂的渲染操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/463783.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2342423

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话: 知不足而奋进,望远山而前行&am…

《Python游戏编程入门》注-第4章8

2.2 “黄色炸弹”的实现 “黄色炸弹”实际上是不断重复地从屏幕顶端落下的黄色圆圈。 2.2.1 设置炸弹位置及下落速度 从图1中可以看出,“黄色炸弹”落下的位置(水平方向)是随机的,图8所示代码用来设置炸弹位置及下落速度。 图8 设置炸弹位置及下落速度的代码 其中,bom…

如何打开/关闭 GitLab 的版本检查功能?

本文分享如何打开/关闭 GitLab 的版本检查功能。 极狐GitLab 是 GitLab 的中国发行版【https://dl.gitlab.cn/ncecn6kb】,中文版本对中国用户更友好,文章以私有化部署的极狐GitLab 实例来演示版本检查功能的开启和关闭。强烈不建议关闭该功能&#xff0…

Linux——Ubuntu环境C编程

配置vim编辑器 设置一个tab键为4个空格 打开/etc/vim/vimrc文件,此文件为只读,所以要用sudo访问boot权限: set ts4(设置一个tab键为4空格) set nu(vim编辑器下显示行号) gcc编译器 gcc命令…

java访问华为网管软件iMaster NCE的北向接口

最近做的一个项目,需要读取华为一个叫iMaster NCE的网管软件的北向接口。这个iMaster NCE(以下简称NCE)用于管理项目的整个网络,尤其是光网络。业主要求我们访问该软件提供的对外接口,读取一些网络信息,比如…

ABeam 德硕 | 共探AI时代人才新生态,ABeam旗下德硕管理咨询(上海)有限公司荣膺2024杰出雇主!

ABeam News 近日,由HRoot主办的“2024中国人力资本发展大会”在上海市徐汇西岸艺术中心A馆盛大开幕并成功举办。大会以“智能协同 人才与AI的共生”为主题,作为咨询公司的ABeam中国,以优秀的人才管理理念及成果,受邀参会并荣获20…

App Store 截图生成器:轻松制作专业级应用营销图片

在线使用 👉 立即使用截图生成器 简介 App Store 截图生成器是一个专门为 iOS 开发者和营销人员设计的在线工具,可以快速生成符合 App Store 规范的应用预览图片。无论是 iPhone 还是 iPad 应用,都能轻松创建出精美的营销截图。 主要特点…

数据结构之顺序表(C语言)

1 线性表 线性表是n个具有相同特性的数据元素的有限序列,是一种在实际中广泛应用的数据结构,常见的线性表有:顺序表、链表、栈、队列、字符串等。 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是…

#【YashanDB认证】#YCA的学习过程总结-之崖山数据库初体验

概述 前段时间崖山数据库做推广活动,参加了yca的考试,为啥参加这个数据库厂商的学习呢,因为目前这个数据库最像Oracle,又听公司的前辈说呢,这个公司的前身是华为人出来做的数据库,华为人的精神呢&#xff0…

一些硬件知识【2024/11/3】

MLCC电容的ESR比较小,但是他的缺点是容量通常比较低;电解电容的容量比较大,但是他的ESR比较大;而钽电容介于两者之间,是MLCC找不到合适的容值比较大的时候,找钽电容: LC谐振电路: 五…

2024版红娘金媒10.3婚恋相亲系统源码小程序(亲测)

1. 红娘服务 红娘服务模块是该系统的一大特色。专业红娘会通过分析用户的个人资料和偏好, 为用户提供精准的配对建议和个性化服务。用户可以预约红娘服务,通过红娘的介入,提升配对成功率。 2. 相亲活动 相亲活动模块用于组织和管理线下或线…

自扶正救生艇,保障水上救援的安全卫士_鼎跃安全

在应急事件中,自扶正救生艇能够发挥关键的救援和保障作用,确保救援人员和被困人员的生命安全,尤其在极端天气或突发水上事故中展现出明显优势。 在救援过程中如果遭遇翻船,救生艇能够迅速恢复正常姿态,确保救援人员不会…

鸿蒙网络编程系列42-仓颉版域名解析示例

1. 域名解析简介 域名解析是网络开发中经常使用的功能之一,特别是对于当前版本的鸿蒙API,使用TCP或者UDP等网络协议通讯时,只能使用确定的IP地址进行绑定或者发送消息,还不支持直接使用域名,所以,通过域名…

6.0、静态路由

路由器最主要的功能就是转发数据包。路由器转发数据包时需要查找路由表(你可以理解为地图),管理员可以直接手动配置路由表,这就是静态路由。 1.什么是路由? 在网络世界中,路由是指数据包在网络中的传输路…

玩转HF/魔搭/魔乐社区(作业)

任务描述时间模型下载使用Hugging Face平台、魔搭社区平台(可选)和魔乐社区平台(可选)下载文档中提到的模型(至少需要下载config.json文件、model.safetensors.index.json文件),请在必要的步骤以…

QT——记事本项目

目录 1.给pushButton按键添加图片 1.1 首先复制存放图片的文件夹,打开Qt回到编辑页面,右键单击pro文件选择在Explorer中显示,将图片文件夹粘贴进去你的代码同目录即可 1.2 创建一个新的文件夹 1.3 点击Add Files,将所有图片添加…

Redis-“自动分片、一定程度的高可用性”(sharding水平拆分、failover故障转移)特性(Sentinel、Cluster)

文章目录 零、写在前面一、水平拆分(sharding/分片)、故障转移(failover)机制介绍水平拆分(Sharding)故障转移机制 二、Redis的水平拆分的机制有关的配置1. 环境准备2. 配置文件配置3. 启动所有Redis实例4. 创建集群5. 测试集群读/写6. 集群管理 三、Red…

OpenCV视觉分析之目标跟踪(7)目标跟踪器类TrackerVit的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 VIT 跟踪器由于特殊的模型结构而变得更快且极其轻量级,模型文件大约为 767KB。模型下载链接:https://github.com/opencv/…

yolov8训练及测试(ubuntu18.04、tensorrt、ros)

1 数据集制作 1.1标注数据 Linux/Ubuntu/Mac 至少需要 Python 2.6 (推荐使用 Python 3 或更高版本 及 PyQt5) Ubuntu Linux (Python 3 Qt5) git clone https://gitcode.com/gh_mirrors/la/labelImg.git sudo apt-get install pyqt5-dev-tools cd lab…

海睿思产品体系二次开发能力介绍

海睿思产品体系支持用户通过编写开发代码(含低代码),提供定制化功能,解决数据治理和共享场景的个性化需求。 1、数据集成 应用场景:自定义数据集成能力 开发语言:JAVA 使用效果: 1&#xff…