计算机图形学 | 实验十二:混合(透明物体处理)

news2024/11/18 19:56:13

计算机图形学 | 实验十二:混合(透明物体处理)

  • 计算机图形学 | 实验十二:混合(透明物体处理)
    • 混合(Blending)
    • 开启混合和设置混合模式
    • 绘制顺序
    • 排序透明物体
    • 绘制
    • 实验结果

华中科技大学《计算机图形学》课程

MOOC地址:计算机图形学(HUST)

计算机图形学 | 实验十二:混合(透明物体处理)

混合(Blending)

首先介绍一下OpenGL中混合的基本概念。混合是实现物体透明的一种技术。当一个物体时透明的,我们看到的颜色是物体本身的颜色和它背后其它物体的颜色的混合。例如,一个有色玻璃窗是一个透明的物体,玻璃有它自己的颜色,但我们看玻璃所看到的的最终的颜色还包含了玻璃之后所有物体的颜色。

开启混合和设置混合模式

和OpenGL大多数的功能一样,我们可以启用GL_BLEND来启用混合。

// 开启混合
glEnable(GL_BLEND);

启用了混合之后,我们还需要告诉OpenGL如何混合

//设置混合的源和目标因子
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

上面的代码设置混合的源和目标因子,这里使用源颜色向量(纹理图片的不透明度值)的 alpha 作为源因子,使用 1−alpha 作为目标因子。这样绘制出来的物体的最终颜色 = 纹理的颜色向量 × alpha + 颜色缓冲中的颜色向量 ×(1-alpha)。

在这里插入图片描述

绘制顺序

在绘制一个有不透明和透明物体的场景的时候,必须遵循如下原则:

  1. 先绘制不透明物体;
  2. 后绘制透明物体:需要按距离摄像头(视点)由远到近的顺序绘制所有透明的物体。

思考一下为什么需要按距离摄像头(视点)由远到近的顺序绘制所有透明的物体?

原因1:如果先绘制近的物体,后绘制远的物体时,远物被近物相应被遮挡的片段因为深度测试而被丢弃。会出现如图2的错误结果。

在这里插入图片描述

原因2:在关闭深度测试情况下,混合得到的颜色也不对。会出现如图3的错误结果。

在这里插入图片描述

排序透明物体

通过需要绘制的物体和摄像头的距离distance来对物体进行从大到小排序,这里使用c++的map容器来实现,定义一个map<key,value>对象,key的值使用会物体和摄像头的距离distance,value的值存储物体的坐标,map会自动根据键的值对元素进行从小到大排序,之后我们只需要反向遍历map,就可以按照由远及近的顺序取到物理的位置值。

std::map<float, glm::vec3> sorted;
for (unsigned int i = 0; i < windows.size(); i++)
{
	float distance = glm::length(camera.Position - windows[i]);
	sorted[distance] = windows[i];
}

绘制

在绘制循环中,先绘制不透明的物体(箱子和地板)。最后按照距离摄像头由远到近的顺序绘制透明的物体window。

因为sorted这个map中的元素是按照从小到大的顺序排序,所有需要使用反向迭代器从后往前,按照物体和摄像头之间距离从大到小的顺序遍历map。

for (std::map<float, glm::vec3>::reverse_iterator it = sorted.rbegin(); it != sorted.rend(); ++it)
{
	model = glm::mat4(1.0f); 
	model = glm::translate(model, it->second); 
	shader.setMat4("model", model); 
	glDrawArrays(GL_TRIANGLES, 0, 6); 
}

实验结果

实验的最终结果如图所示:

开启混合:

在这里插入图片描述

关闭混合:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IPO观察丨德尔玛上市,“极致单品”模式的一场胜利

近日&#xff0c;创新电器品牌德尔玛&#xff08;广东德尔玛科技股份有限公司&#xff0c;代码“301332”&#xff09;&#xff0c;正式登陆深圳证券交易所创业板&#xff0c;发行价格为14.81元/股。上市前&#xff0c;德尔玛已完成了5亿元A轮融资及3.3亿元A轮融资&#xff0c;…

Linux Ubuntu配置CPU与GPU版本tensorflow库的方法

本文介绍在Linux操作系统的发行版本Ubuntu中&#xff0c;配置可以用CPU或GPU运行的Python新版本深度学习库tensorflow的方法。 在文章Anaconda配置Python新版本tensorflow库&#xff08;CPU、GPU通用&#xff09;的方法&#xff08;https://blog.csdn.net/zhebushibiaoshifu/ar…

Elasticsearch 7.x 基本操作 (CRUD)

1.概述 Elasticsearch 是一个流行的开源搜索引擎&#xff0c;用于存储、搜索和分析数据。下面是 Elasticsearch 7.x 版本的基本操作&#xff08;CRUD&#xff09;&#xff1a; 1、创建索引&#xff1a; PUT /index_name {"settings": {"number_of_shards"…

最近公司招了一个华为拿30K出来的,真是砂纸擦屁股,给我露了一手....

今年的金三银四已经结束&#xff0c;很多小伙伴收获不错&#xff0c;拿到了心仪的 offer。 各大论坛和社区里也看见不少小伙伴慷慨地分享了常见的面试题和八股文&#xff0c;为此咱这里也统一做一次大整理和大归类&#xff0c;这也算是划重点了。 俗话说得好&#xff0c;他山…

【C++】位图(海量数据处理)

文章目录 抛出问题:引入位图位图解决 位图的概念位图的实现结构构造函数设置位清空位判断这个数是否存在反转位size与count打印函数 位图的应用 抛出问题:引入位图 问题&#xff1a;给40亿个不重复的无符号整数&#xff0c;没排序&#xff0c;给一个无符号整数&#xff0c;如何…

基于 MapReduce 的分布式计算系统

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 本文以 MapReduce 为基础&#xff0c;实现了一套基于浏览器实现的分布式系统。加之如今 Chrome 对各个平台近乎完美的兼容性&#xff0c;实现了一次编写&#xff0c;处处运行的目标。同时得力于个人移动设备的普及&#xff0c…

java云HIS系统源码 医院HIS管理系统源码 Java医院系统源码 SaaS医院his系统源码

技术框架&#xff1a; 1、前端&#xff1a;AngularNginx 2、后台&#xff1a;JavaSpring&#xff0c;SpringBoot&#xff0c;SpringMVC&#xff0c;SpringSecurity&#xff0c;MyBatisPlus&#xff0c;等 3、数据库&#xff1a;MySQL MyCat 4、缓存&#xff1a;RedisJ2Cac…

day6 - 使用图像运算进行图像美化

本期将了解图像的基础运算&#xff0c;包含算数运算和位运算等。我们所使用的图像处理技术其实都是靠一些简单的基础运算来完成的&#xff0c;例如加法运算、位运算等&#xff0c;这些简单运算是我们后续研究更复杂的图像处理的基础。 完成本期内容&#xff0c;你可以&#xf…

HiveSQL基础练习题

HiveSQL基础练习题 1.环境准备1.1建表语句1.2数据准备1.3插入数据 2.查询2.1 查询姓名中带“华”的学生名单2.2 查询姓“王”老师的个数2.3 检索课程编号为“04”且分数小于60的学生学号&#xff0c;结果按分数降序排列2.4 查询语文成绩 < 90分的学生和其对应的成绩&#xf…

day16 Servlet交互作用域ELJSTL

转发和重定向 **作用:**为了让jsp和servlet做到责任分离,用于web组件的跳转 **web组件:**jspservlet 转发的方法 request.getRequestDispatcher("跳转的地址").forward(request,response)**跳转的位置:**在服务端进行跳转 重定向的方法 response.sendRedirect(…

2.9 playwright之python实现

1、目录结构如下 2、main.py import os import shutilfrom playwright.sync_api import sync_playwright from config.setting import config from utils.template import Template from utils.md5 import Md5 from utils.delete import del_files import pytest from utils.d…

面试被问麻了...

前几天组了一个软件测试面试的群&#xff0c;没想到效果直接拉满&#xff0c;看来大家对面试这块的需求还是挺迫切的。昨天我就看到群友们发的一些面经&#xff0c;感觉非常有参考价值&#xff0c;于是我就问他还有没有。 结果他给我整理了一份非常硬核的面筋&#xff0c;打开…

全网最全性能测试总结,分析性能测试问题+性能调优方案...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能分析和优化一…

【录用案例】2区毕业快刊仅34天录用,新增8篇录用、9篇见刊、13篇检索

2023年5月13日-2023年5月19日&#xff0c;经核实&#xff0c;由我处Unionpub学术推荐的8篇论文已被期刊部录用、9篇见刊、13篇检索&#xff1a; 2区系统类SSCI 【期刊简介】IF:2.5-3.0&#xff0c;JCR2区&#xff0c;中科院4区 【检索情况】SSCI 在检&#xff0c;正刊 【征稿…

本地项目上传到Git(Gitee)仓库

一、步骤解答&#xff08;详细图解步骤见第二大点&#xff09; 1、打开我们的项目所在文件夹&#xff0c;我们发现是不存在.git文件 2、在你的项目文件夹外层【鼠标右击】弹出菜单&#xff0c;在【鼠标右击】弹出的菜单中&#xff0c;点击【Git Bash Here】&#xff0c;弹出运…

循环队列+OJ题之设计循环队列

生命不是要等待风暴过去&#xff0c;而是要学会在风暴中跳舞。 ——卡莉尔吉布朗目录 &#x1f33a;前言&#xff1a; &#x1f341;一.循环队列是什么&#xff1f; &#x1f34f;二.循环队列有什么作用&#xff1f; &#x1f340;三.OJ题之设计循环队列 1…

实战演练 | Navicat 数据生成功能

数据生成的目的是依据某个数据模型&#xff0c;从原始数据通过计算得到目标系统所需要的符合该模型的数据。数据生成与数据模型是分不开的&#xff0c;数据生成的结果应该符合某个数据模型对于数据的具体要求。所以&#xff0c;随着数据模型的发展&#xff0c;数据生成的方法相…

window 利用Qt-windeployqt打包exe程序 一个简单的实例

用一个简单的实例展示下window 如何使用QT-windeployqt打包exe程序使得其可以在别的电脑上运行 一、release模式获得exe可执行文件 新建一个QT项目 构建选择使用CMake base class选择QMainWindow Kit Selection一定要注意&#xff0c;我选的是MinGW 32-bit UI设计 mainwindow.…

手机充电宝电子充气泵方案

该充气泵产品方案的运行原理是通过电动机将电能转化为机械能&#xff0c;带动电机做往复运动&#xff0c;从而产生大量压缩空气&#xff0c;达到快速充气的效果。该充气泵可用于气垫床、汽车轮胎、自行车轮胎、足球、游泳圈等各类充气物品。产品设计以人性化为主&#xff0c;简…

VMware重新安装后没有VMnet1和VMnet8网络

问题&#xff1a; VMware重新安装后&#xff0c;没有自动生成VMnet1和VMnet8网络, 并且使用VMware自带的虚拟网络编辑器也无法生成。 导致主机无法ping通虚拟机。 如下图&#xff1a;点击该选项&#xff0c;然后应用&#xff0c;转一会圈也没有产生对应的网络适配器。 问题原…