OpenGL之多边形偏移、雾效、纹理映射

news2025/1/13 5:55:01

1.1 OpenGL中可以设置物体的点、线、面绘制模式。如果需要同时绘制多种模式,如下以面和线模式绘制两遍模型,可以看到线不连续,当镜头推远推近时会出现闪烁现象。

void glPolygonMode(GLenum face,GLenum mode);
  • face :GL_FRONT,GL_BACK,GL_FRONT_AND_BACK;
  • mode : GL_POINT、GL_LINE、GL_FILL;

在这里插入图片描述
闪烁原因:

  • 直线和多边形的光栅化方式并不完全相同,在线上和多边形边缘上产生的像素的深度值通常并不相同。
  • 深度是有精度限制的,距离视点越远,进度越低,由于舍入误差会造成判断错误。

解决办法:

  • 在深度检测之前,可以对zbuffer值进行一个偏移,即多边形偏移,为片元的z值增加一个适当的偏移值,把重合的z值适当地分开一些,使着重显示的直线与多边形的边缘清晰地分离开来。
glEnable(GL_POLYGON_OFFSET_FILL);
void glPolygonOffset(GLfloat factor,GLfloat units);

偏移值offset = m ∗ f a c t o r + r ∗ u n i t s m * factor + r * units mfactor+runits;

  • m是多边形的最大深度斜率,是在光栅化过程中计算的;
  • r是保证能够产生可解析区别的窗口坐标深度的最小值,r是一个因OpenGL实现而异的常数。
    在这里插入图片描述
    GL_FILL模式绘制物体
  • 打开光照;
  • glEnable(GL_POLYGON_OFFSET_FILL);
  • glPolygonOffset(1.0,1.0);
  • 绘制物体
  • glDisable(GL_POLYGON_OFFSET_FILL);

GL_LINE 模式绘制物体

  • 关闭光照;
  • 绘制物体;
    在这里插入图片描述

1.2 雾效

雾效就是采用混合计算来实现的。
C o l o r = f ∗ C o l o r s + ( 1 − f ) ∗ C o l o r f Color = f * Color_s + (1 - f) * Color_f Color=fColors+(1f)Colorf;

  • C o l o r s Color_s Colors表示物体的颜色, C o l o r f Color_f Colorf表示雾的颜色, f f f越大表示物体越清晰;
  • f f f为混合因子,有三种计算方式:
    GL_LINEAR f = e n d − z e n d − s t a r t f = \frac{end - z}{end - start} f=endstartendz,start、end为雾开始和结束的地方,z是物体的深度。
    GL_EXP f = e ( − d e n s i t y ∗ z ) f = e^{(-density * z)} f=e(densityz)
    GL_EXP2 f = e ( − d e n s i t y ∗ z ) 2 f = e^{(-density * z)^2} f=e(densityz)2
    在这里插入图片描述
glEnable(GL_FOG);

glFog*()相关函数用来设置与雾相关的参数。

  • GL_FOG_MODE、GL_FOG_COLOR,GL_FOG_DENSITY,GL_FOG_START,GL_FOG_END;

glFogCoord*()可以指定每个顶点的雾坐标。

1.3 小结
Fragment模块中的所有操作,顺序如下。
在这里插入图片描述
2.1 纹理

2.1.1 Texture
在这里插入图片描述
2.1.2 模型的纹理

  • 细化模型表面的几何;
  • 采用纹理映射的方法;
    颜色纹理:二维纹理、三维纹理;
    几何纹理:凹凸纹理映射(Bump mapping),位移纹理映射(Displacement mapping);

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.1.3 Texture Mapping(纹理映射、纹理贴图)
纹理映射的主要思想:将一给定的纹理函数(图片)映射到物体表面上,在对物体表面进行光亮度计算时可采用相应的纹理函数值来影响光照明模型中的参数( k t k_t kt)(如漫反射光亮度)以产生纹理效果。
在这里插入图片描述

  • 上面只是改变了颜色,纹理映射不仅限于改变颜色;
  • 颜色、高光、凸凹、反射、透明度等都可以采用纹理贴图进行改变

2.1.4 三维纹理映射
又称为“体纹理映射”,三维物体的每一个点(x,y,z)均有一个纹理值t(x,y,z),那么物体空间就可以映射到一个三维纹理空间中;
在这里插入图片描述

2.1.5 凹凸纹理映射(Bump mapping)
光滑模型呈现一种凹凸不平的效果,实现思想是对模型表面各采样点的法线做微小的扰动,由于表面光亮度是模型表面的法向的函数,上述法向的扰动必将导致表面光亮度的突变,从而产生表面凹凸不平的效果。

  • 用纹理去修改物体的法向而不是颜色;

  • 物体表面的几何法向保持不变,仅仅改变光照明模型计算中的法向;
    在这里插入图片描述
    在这里插入图片描述

  • 物体表面每个点额法向的扰动量就可以定位在一幅纹理中;Bump mapping 的纹理中的三种记录方法:

    • Offset map:法矢量n在u和v方向被凹凸纹理上的( b u , b v b_u,b_v bu,bv)值修改,得到 n’;
      在这里插入图片描述

    • Height-field map: 如下高度场及其对应的Normal,通过记录高度值,可以间接计算出法向,白的地方高,黑的地方低;
      在这里插入图片描述
      在这里插入图片描述

    • Normal map:直接记录法向,如下中的为法向图,及其作用于模型的效果。纹理图偏蓝,RGB对应xyz的话,那么法向大部分都指向z轴;
      在这里插入图片描述

2.1.6 位移纹理映射(Displacement mapping)
如下采用Bump mapping的效果图,可以看出越往模型的边缘,凹凸感越差,轮廓还是光滑的,没有凹凸感,凹凸纹理也不会投下自身阴影;
在这里插入图片描述
一些解决方法,如浮雕贴图(Relief Mapping),通过映射一幅高度图,并在关照计算阶段进行遮挡判断而产生的效果。
在这里插入图片描述

实现上述效果还有一种更实用的方法,就是真是扰动模型的点位置,从而产生凹凸不平的细节效果,这就是位移纹理映射

  • 物体表面上的每一个点P(u,v),都沿该点处的法向量方向位移F(u,v)各单位长度,位移函数F(u,v)记录在一幅纹理中。
    在这里插入图片描述
    在这里插入图片描述

2.1.7 纹理映射关系的确定
二维纹理如何与三维的物体进行映射,对于一般的规则形体来说,对于球体可以采样经纬度来进行对应,对于其他模型,如圆柱,环等可以处理成圆柱,然后再展开为长方形即可映射。
在这里插入图片描述

而对于任意一个模型,如何映射纹理,主要有投影式纹理映射(projective texture mapping)、两步法纹理映射。

  • 投影式纹理映射:投影式纹理映射从投影点出发,将二维纹理投到三维物体表面上,缺点是再轮廓处会出现极度的变形。
    在这里插入图片描述

  • 两步法纹理映射:先将纹理映射到与模型相近的中间模型上(圆柱),然后再次圆柱映射到模型上。
    在这里插入图片描述
    可以使用很多相近中间面,如平面,六个面,柱面上,球面,然后再进行纹理映射。
    在这里插入图片描述

  • 展UV法:将模型分割,使其部分可展,让后再建立映射关系。
    在这里插入图片描述

虽然有了很多方法进行纹理映射,但复杂表面的纹理坐标计算仍是目前研究的难点。主要采用纹理函数,纹理函数可以是一幅图像,可以是一个计算函数(过程式纹理映射)。

  • 基于样本的模型表面纹理合成;
  • 基于过程的纹理合成;

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

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

相关文章

分治暴力求解最近点对问题 + 时间性能量化分析

Catalogue1 Intro2 Problem3 Time performance analysis4 Solution5 Reference1 Intro 本文旨在讨论分治和暴力在求解最近点对问题时的时间性能问题,关于解题部分不做过多讲解,只附上相关代码。 2 Problem 给定平面上N个点,找出其中的一对…

【Linux】第七章 进程控制(进程创建+进程终止+进程等待+进程替换+min_shell)

🏆个人主页:企鹅不叫的博客 ​ 🌈专栏 C语言初阶和进阶C项目Leetcode刷题初阶数据结构与算法C初阶和进阶《深入理解计算机操作系统》《高质量C/C编程》Linux ⭐️ 博主码云gitee链接:代码仓库地址 ⚡若有帮助可以【关注点赞收藏】…

【路径规划-多式联运】基于遗传算法求解多式联运运输问题(考虑碳交易)附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

字符串和编码那些事

一、字符编码 1. ASCII字符编码 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte) 由于计算机是美国人发明的&#…

【Apache Spark 】第 11 章使用 Apache Spark 管理、部署和扩展机器学习管道

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

编程神器Copilot逐字抄袭他人代码?

自面世后就饱受争议的 GitHub Copilot 编程神器最近又遭遇舆论风暴。 日前,德州农工大学的一位计算机科学教授 Tim Davis 在推特上发文称, GitHub Copilot 在没有标注来源也没有 LGPL 许可的情况下,输出了大量应该受版权保护的代码。 Tim Davis 还发了自己和 GitHub Copil…

90后汕头返种水稻 国稻种芯·中国水稻会:广东新农人田保姆

90后汕头返种水稻 国稻种芯中国水稻会:广东新农人田保姆 南方日报 张伟炜 新闻中国采编网 中国新闻采编网 谋定研究中国智库网 中国农民丰收节国际贸易促进会 国稻种芯中国水稻节 中国三农智库网-功能性农业农业大健康大会报道:“5月稻谷病虫害防护非常…

机器学习(周志华)课后习题

第1章 绪论 1.1 表1.1若只包含编号1和4的两个样例,试给出相应的版本空间。 版本空间:与训练及一致的假设集合。 色泽青绿,根蒂*,敲声*; 色泽*,根蒂蜷缩,敲声*; 色泽*,根…

nuxt.js 进行项目重构-首页

nuxt.js 也是基于vue 的 那么就离不开组件化开发 我们按照组件结构来进行分析 navTop 页面的头部 通用组件 分隔了三个位置 适用于大多数头部 且预留插槽 <template><div class"nav-top"><div class"left"><slot name"left…

Spring5入门到实战------10、操作术语解释--Aspectj注解开发实例。AOP切面编程的实际应用

1、操作术语 1.1、连接点 类里面哪些方法可以被增强、这些方法被称为连接点。比如&#xff1a;用户控制层有登录、注册、修改密码、修改信息等方法。假如只有登录类和注册类可以被增强&#xff0c;登录和注册方法就称为连接点 1.2、切入点 实际被真正增强的方法&#xff0c…

C++ 【UVA488】Triangle Wave

&#x1f4cb; 个人简介 &#x1f496;大家好&#xff0c;我是2022年3月份新人榜排名第三的 ༺Blog༒Hacker༻ &#x1f389;支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4ac;格言&#xff1a;༺永做优质༒programmer༻ &#x1f4e3; 系列专栏&am…

Unity技术手册-编辑器基础入门万字大总结

往期文章分享点击跳转>《导航贴》- Unity手册&#xff0c;系统实战学习点击跳转>《导航贴》- Android手册&#xff0c;重温移动开发 本文约8千字&#xff0c;新手阅读需要20分钟&#xff0c;复习需要12分钟 【收藏随时查阅不再迷路】 &#x1f449;关于作者 众所周知&…

【C/C++】程序环境,探索程序的执行过程(习得无上内功《易筋经》的第一步)

目录1.程序的翻译环境和执行环境2.详解编译链接2.1翻译环境2.2编译本身也分为几个阶段预编译&#xff08;预处理&#xff09;编译汇编详解符号表形成符号表2.3.链接合并段表符号表的合并和重定位3.运行环境总结&#xff1a;1.程序的翻译环境和执行环境 在ANSIC&#xff08;标准…

LeetCode每日一题——1235. 规划兼职工作

LeetCode每日一题系列 题目&#xff1a;1235. 规划兼职工作 难度&#xff1a;困难 文章目录LeetCode每日一题系列题目示例思路题解题目 你打算利用空闲时间来做兼职工作赚些零花钱。 这里有 n 份兼职工作&#xff0c;每份工作预计从 startTime[i] 开始到 endTime[i] 结束&a…

1024程序员节|基于Springboot实现爱心捐赠管理系统

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 文末获取源码 项目编号&#xff1a;BS-XX-…

Mybatis-plus学习(基于版本3.0.5)

文章目录一.概念1.1 简介1.2 特性二.快速入门三.CRUD扩展3.1 Insert插入3.2 主键生成策略3.3 Update更新3.4 自动填充3.5 乐观锁3.6 查询操作3.7 删除操作3.8 性能分析插件&#xff08;新版本的Mybatis-plus已将此插件移除&#xff09;3.9 条件构造器3.10 代码生成器一.概念 1…

Transformer合集3

太多了 我都累了 这都第4了 这次先是关于他的小样本目标检测 , 用很少的训练示例检测新目标 小样本目标检测 论文地址&#xff1a; https://openaccess.thecvf.com/content/CVPR2022/papers/Han_Few-Shot_Object_Detection_With_Fully_Cross-Transformer_CVPR_2022_paper.…

docker安装influxdb及备份恢复

influxdb安装influxdb1&#xff0c;拉取镜像2&#xff0c;创建目录并进入到目录内3&#xff0c;创建influxdb容器服务4&#xff0c;访问&#xff1a;ip8086备份恢复influxdb数据准备1.1 创建用户&#xff0c;填入组织&#xff0c;桶信息1.2&#xff0c;给桶添加点数据1&#xf…

ansible部署lnmp架构

环境准备&#xff1a; 主机名IP服务系统ansible192.168.160.131ansibleCentOS-8.5nginx192.168.160.132nginxCentOS-8.5mysql192.168.160.137mysqlCentOS-8.5php192.168.160.139phpCentOS-8.5 1、生成私钥&#xff0c;对另外三台主机进行免密登入 [rootansible ~]# ssh-keyge…

【单片机毕业设计】【mcuclub-jj-007】基于单片机的门铃的设计

最近设计了一个项目基于单片机的门铃&#xff0c;与大家分享一下&#xff1a; 一、基本介绍 项目名&#xff1a;门铃 项目编号&#xff1a;mcuclub-jj-007 单片机类型&#xff1a;STC89C52、STM32F103C8T6 具体功能&#xff1a; 1、通过人体热释电检测是否有人&#xff0c;当…