OpenGL 红宝书 反走样 雾 点参数 多边形偏移

2023-10-26

6.2 反走样

void glHint(GLenum target, GLenum hint);   // 控制OpenGL的某些行为
参数target是要控制的行为
参数hint可以是GL_FASTEST, GL_NICEST, GL_DONT_CARE.(效率最高, 质量最好, 没有选择)
参数target的取值及其含义:
GL_POINT_SMOOTH_HINT, GL_LINE_SMOOTH_HINT, GL_POLYGON_SMOOTH_HINT----反走样操作中, 直线,点或多边形的采样质量.
GL_FOG_HINT----对每个像素(GL_NICEST)还是每个顶点(GL_FASTEST)执行雾效计算.
GL_PERSPECTIV_CORRECTION_HINT----颜色和纹理坐标插值的质量
GL_GENERATE_MIPMAP_HINT----自动生成的mipmap的质量和性能
GL_TEXTURE_COMPRESSION_HINT----纹理图案的压缩质量和性能.



6.2.1 点和直线的反走样

两种处理点和直线反走样的方法:
1) 使用参数GL_POINT_SMOOTH或GL_LINE_SMOOTH调用函数glEnable(), 以启用反走样功能.使用函数glHint()提出有关质量的建议.
2) 使用多重采样.

1. RGBA模式下的反走样
在RGBA模式中, 需要启用混合功能. 最常用的混合因子是GL_SRC_ALPHA(源)和GL_ONE_MINUS_SRC_ALPHA(目标)或GL_ONE(目标).
使用alpha的值越高, 反走样效果越明显.

2. 颜色索引模式下的反走样
由于颜色索引后的4位表示覆盖比率,因此需要加载16个相邻的索引(第1个必须是16的倍数), 对应的颜色从背景色渐变到物体的颜色.
使用第一个索引值对应的颜色清空颜色缓存, 然后使用你加载的颜色绘制点或直线.

使用颜色索引的时候,程序报错
pixel format with necessary capabilities not found.

将经过反走样处理的点和直线同未经过反走样处理的存储在深度缓存中的多边形进行混合. 首先绘制多边形, 然后将深度缓存设置为只读, 并绘制点和直线.

6.2.2 使用多重采样对几何图元进行反走样处理

多重采样是一种使用更多的颜色,深度和模板信息(样本)对OpenGL图元(点,直线,多边形,位图和图像)进行反走样处理的技术.
每个片元都有多种颜色, 多个深度值和多组纹理坐标. 计算是分散在多个取样位置. 计算反走样覆盖比例时, 使用存储在多重取样缓存中的样本.
多重采样非常适合用于多边形的反走样处理,无需确定物体的绘制顺序.
如何使用多重采样:
(1) 打开一个支持多重采样的窗口. 如果有GLUT函数库, 则调用一下函数
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_MULTISAMPLE);
(2) 打开窗口后, 需要确定它是否支持多重采样.
查询变量GL_SAMPLE_BUFFERS返回1, 变量GL_SAMPLES返回的值大于1, 则可以使用多重采样.
GLint bufs, samples;
glGetIntegerv(GL_SAMPLE_BUFFERS, &bufs);
glGetIntegerv(GL_SAMPLES, &samples);
(3) 打开多重采样,可调用下述函数
glEnable(GL_MULTISAMPLE);

注: 要查询GL_SAMPLE_BUFFERS_ARB的话,需要用glew.h头文件.
我的电脑不支持多重采样....查询的值都为0

如果多重采样功能被启用,且有多重采样缓存, 点,直线和多边形将生成供反走样处理使用的片元.

alpha值和多重采样覆盖比例
默认多重采样在计算片元覆盖比例时不考虑alpha值, 除非启用了以下模式之一:
1) GL_SAMPLE_ALPHA_TO_COVERAGE: 使用片元的alpha来计算最终的覆盖比率
2) GL_SAMPLE_ALPHA_TO_ONE: 将片元的alpha值设置为最大值(1),然后使用这个值来计算覆盖比率
3) GL_SAMPLE_COVERAGE: 将函数glSampleCoverage()设置的值与计算得到的覆盖比例进行AND运算.
void glSampleCoverage(GLclampf value, GLboolean invert);
设置在计算多重采样覆盖比率时用于解释alpha值的参数
value: GL_SAMPLE_COVERAGE或GL_SAMPLE_ALPHA_TO_COVERAGE启用时使用的临时覆盖比例.
invert:对临时覆盖比例和片元覆盖比例执行AND运算之前,是否需要将临时覆盖比例执行按位反转.

6.2.3 多边形的反走样

使用参数GL_POINT或GL_LINE调用函数glPolygonMode()时, 将对点或直线进行反走样处理.

要对多个多边形进行反走样处理, 必须按从前到后的顺序排列多边形, 然后使用调用函数glBlendFunc()将源混合因子设置为GL_SRC_ALPHA_SATURATE, 目标为GL_ONE.
RGBA模式下, 多边形的反走样处理使用alpha值来表示多边形边的覆盖比例; 同时需要使用参数GL_POLYGON_SMOOTH来调用函数glEnable();
也可给GL_POLYGON_SMOOTH_HINT指定一个值.

对重叠的边进行混合:
首先,禁用深度缓存
然后将源混合因子设置为GL_SRC_ALPHA_SATURATE, 目标混合因子设置为GL_ONE;

最后,在绘制多边形之前, 需要按从前到后的顺序对场景中所有的多边形进行排序.

6.3 雾

将雾效用于点和直线也被称为深度提示(depth-cuing)

6.3.1 使用雾

使用参数GL_FOG调用函数glEnable()以启用雾效, 并使用函数glFog*()指定雾颜色和控制雾密度的方程.还可以使用参数GL_FOG_HINT调用glHint().

6.3.2 雾方程

void glFog(if)(GLenum pname, TYPEparam);
void glFog(if)v(GLenum pname, TYPE* param);

pname: GL_FOG_MODE, GL_FOG_DENSITY, GL_FOG_START, GL_FOG_END
param: GL_FOG_MODE -- GL_EXP(默认), GL_EXP2, GL_LINEAR
       GL_FOG_DENSITY -- density 默认值为1
       GL_FOG_sTART , GL_FOG_END -- 默认值为0, 1
RGBA模式下, pname --- GL_FOG_COLOR, param则指向颜色值.
颜色索引模式下, pname --- GL_FOG_INDEX, param指定颜色索引.

1. RGBA模式下的雾效
雾效因子f计算最终的颜色
C = fCi + (1-f)Cf
Ci是片元的RGBA值,Cf是使用参数GL_FOG_COLOR指定的雾颜色
2. 颜色索引模式下的雾效
I = Ii + (1-f)If
其中Ii是片元的颜色索引, If是使用参数GL_FOG_INDEX指定的雾的颜色索引.

程序不支持颜色索引模式...

3. 雾坐标
调用glFog(GL_FOG_COORDINATE_SOURCE, GL_FOG_COORDINATE),然后显式地指定每个顶点的z值.用函数glFogCoord*().
void glFogCoord(fd)(TYPE z);
void glFogCoord(fd)v(TYPE *z);
其中z必须大于0

书中的例子使用了扩展,解决方法:
1.定义下面两个宏定义,本来这两个宏在glew.h中定义的,不过包含了glew.h的话,就不能使用wglGetProcAddress函数,只好自己定义了.
#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450
#define GL_FOG_COORDINATE_EXT 0x8451
2. 要包含头文件
#include <gl\glext.h>
3. 有以下语句
PFNGLFOGCOORDFEXTPROC glFogCoordfEXT = NULL;
glFogCoordfEXT = (PFNGLFOGCOORDFEXTPROC)wglGetProcAddress("glFogCoordfEXT");
glFogCoordfEXT(f1);

 

 

6.4 点参数

可使用glPointSize()和glEnable(GL_POINT_SMOOTH)来绘制大型的圆点, 并使用雾效来实现距离改变的效果. 但是, 不能在glBegin()和glEnd()之间调用函数glPointSize().
因此要改变不同点的大小很困难. 必须动态地重新计算点的大小, 并根据大小重新对点进行分组, 以最大限度地提高性能.
点参数能够根据图元距离视点的距离, 自动改变其大小和亮度. 要指定点图元的大小和alpha分量(用于控制亮度)的衰减系统, 可使用函数glPointParameterf*().
void glPointParameterf(GLenum pname, GLfloat param);
void glPointParameterfv(GLenum pname, GLfloat* param);

设置与渲染点图元相关的值
如果pname为GL_POINT_DISTANCE_ATTENUATION, param将是一个包含三个元素(a,b和c)的浮点数组.
这三个元素分别是根据眼坐标距离d对点的大小和亮度进行衰减的常量系统, 线性系数和二次系数:
derivedSize = clamp(size*(1/(a+b*d+c*d*d))的平方根)
如果pname为GL_POINT_SIZE_MIN或GL_POINT_SIZE_MAX, param为点大小截取范围的下限或上限.
如果多重采样被启用, 且pname为GL_FADE_THRESHOLD_SIZE, param降为另一种有关大小的下限(threshold).如果derivedSize < threshold. 将按下述方式计算fade因子.
该因子用于调整点的alpha值,从而降低其亮度:
fade = (derivedSize / threshold)的平方
点大小的计算方式类似于定位光源的衰减计算方式

当用户选择线性或二次衰减方式时, 如果视点离点图元非常近, 除数将为小数, 导致计算得到的点大于实际大小, 为避免这种情况,可以增大常量衰减系数
或用参数GL_POINT_SIZE_MAX指定一个最大值.

由于希望点不是方形,可启用反走样:
    glEnable(GL_POINT_SMOOTH);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

 

6.5 多边形偏移

要突出实体的边, 可以先使用多边形模式GL_FILL来绘制物体, 然后使用多边形模式GL_LINE和不同的颜色再次绘制该物体.

缝合 --- 相同顶点之间的直线和多边形边, 其像素的深度值并不相同, 导致直线有时在相应多边形的前面,有时在后面.

启用多边形偏移的方式有3种: GL_FILL, GL_LINE和GL_POINT.

使用合适的参数来调用glEnable()---GL_POLYGON_OFFSET_FILL, GL_POLYGON_OFFSET_LINE,GL_POLYGON_OFFSET_POINT

还必须函数调用glPolygonMode()来设置当前的多边形光栅化方法:

voidglPolygonOffset(GLfloat factor, GLfloat units);

多边形偏移被启用时, 将每个片元的深度值加上一个计算得到的偏移值, 这种操作是在深度测试以及将深度值写入深度缓存之前完成的.偏移值的计算公式如下:

n = m*factor + r*units

其中m是多边形的最大深度斜率, r是确保窗口坐标深度值能够被区分开来的最小值. r是一个随OpenGL实现而异的常量.

深度斜率指的是,当你穿越多边形时, z值的变化量与x或y坐标的变化量之间的商.

m = max{|dV/ds|, |dV/dt|}


与近裁剪面和远裁剪面平行的多边形深度斜率为0.
对于深度斜率接近0的多边形,只需要使用一个很小的恒定偏移量.
调用glPolygonOffset(),将参数factor和units分为指定为0.0和1.0,可以获得很小的恒定偏移量.

当深度斜率比0大得多的时候,将参数factor设置为很小的非零值(如0.75或1.0),可能足以得到不同的深度值, 从而消除不美观的缝合现象.

在有些情况下,参数factor和units都设置为1.0并不能满足要求. 如用于突出多边形边的直线的线宽大于1,可能需要加大参数factor的值.
另外透视投影时需要找到合适的factor值.

多边形偏移的图形

未偏移的图形


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenGL 红宝书 反走样 雾 点参数 多边形偏移 的相关文章

  • 如何计算列表中点的距离?

    我有两组列表 A 和 O 它们都有来自 x y z 坐标的点 我想计算A点和B点之间的距离 我使用了for循环 但它只给了我一个结果 它应该从结果中给出 8 个数字 我很感激有人能看一下 这是我的项目的最后一步 Ax 232 34 233
  • Silverlight 中的动画边距变化

    我正在 Silverlight 中对边框大小进行动画调整 但是我还需要逐渐删除其周围的边距 当前为 50 Blend 似乎不会为边距变化生成补间 它只是一次性从 50 跳到 0 有办法实现这一点吗 问题是边距实际上是 System Wind
  • 2 个纬度/经度点(坐标)列表之间的地理/地理空间距离

    我有 2 个列表 list1 list2 以及各个地点的纬度 经度 一份清单 list2 的地点名称list1不具有 我也想要 list1 中每个点的近似位置 所以我想指出一点list1 尝试寻找最近的点list2并采取该地点 我对其中的每
  • 复合颜色:iPhone 上的 CALayer 和混合模式

    我正在尝试在 iPhone 上使用核心图像 我可以使用石英合成颜色来绘制 uiview 但我想将每个组件分成CALayer UIview消耗较多资源 所以我有一个白色蒙版 我想用它来过滤背景位图 并且我想尝试不同的混合模式 不幸的是 这些图
  • DICOM 文件压缩

    我的工作需要使用 DICOM 文件 每个 DICOM 文件由单个目录中的许多 dcm 文件组成 我需要通过网络发送这些文件 由于文件很大 这个过程在某种程度上是这样的 我也是一名程序员 我想知道压缩此类文件的理想方法是什么 我说的是在本地计
  • Json压缩传输

    我想知道基于 javascript 的 json 压缩的当前状态是什么 当前是否有任何库允许通过用单个字符替换长名称或其他方法来压缩 json 有人有用 Javascript 实现 HPPack https github com WebRe
  • 如何从文件字节开始在内存中创建 zip 文件?

    我尝试使用 C 在内存中创建一个 zip 文件 但结果是一个 zip 文件 其中包含损坏的文件 所有要压缩的文件都在数据库中 我存储字节 文件为 PDF 格式 我的代码如下 extract bytes and file name for e
  • 在php中计算地球上两个坐标之间的行驶距离

    好吧 我正在基于位置的应用程序中工作 我需要在服务器端找到地球上两个位置之间的驾驶距离 我正在用 php 编写 Web 服务 到目前为止 我可以使用半正弦公式计算空中距离 但现在我想计算行驶距离 这个问题可能有重复 但我无法找到任何帮助来计
  • Fiddler 不解压缩 gzip 响应

    I use Fiddler调试我的应用程序 每当服务器压缩响应而不是解压缩响应时 Fiddler 都会显示不可读的二进制数据 Response to my request POST HTTP 1 1 200 OK Server xyz co
  • 如何找到一个向量中与另一个向量最接近的值?

    我有两个大小相等的向量 例如 A 2 29 2 56 2 77 2 90 2 05 and B 2 34 2 62 2 67 2 44 2 52 我有兴趣在两个相同大小的向量 A 和 B 中找到最接近的值 几乎相等 即在 A 中的所有元素中
  • Angular 6 如何获取两个位置 AGM 之间的距离

    I get 方向使用此参考在两点之间https www npmjs com package agm direction https www npmjs com package agm direction现在我想获取 计算distance在两
  • 在Android中压缩带有大图像的pdf

    这个问题通过java压缩带有大图像的pdf https stackoverflow com questions 20614350 compress pdf with large images via java给出了在 Java 中使用 iT
  • 为什么 tarfile 模块不允许压缩附加?

    没有直接的方法可以追加到压缩的 tar 存档中 作为文档状态 https docs python org 3 library tarfile html tarfile open 注意 a gz a bz2 or a xz 不可能 作为解决方
  • 计算 3D 中两点之间的距离

    我的任务是创建主类 在其中将任意点的值初始化为 0 0 0 并且能够单独访问和改变所有三个值 x y z 为此 我使用了 getter 和 setter 我的下一个任务是在我的主类中创建一个方法 我将其称为 distanceTo 来计算两点
  • GZipStream:为什么我们在压缩后转换为base 64?

    我只是在查看用于压缩字符串的代码示例 我发现使用 GZipStream 类就足够了 但我不明白为什么我们必须将其转换为 Base 64 字符串 如示例所示 using System IO Compression using System T
  • JavaScript 中的文本压缩

    有没有图书馆 等等 在 JavaScript 中实现轻量级文本压缩 我真正的目标是稍微缩短一些文本并使其一目了然 它不需要提供安全性 文本将为用户显示 理想情况下 可以调整压缩以仅输出查询字符 a zA Z0 9 所以它可以在 URL 中传
  • Android:计算两个位置之间距离的最佳方法

    我在这个主题上做了一些研究 但有很多观点并没有给出一个清晰的图像 我的问题是这样的 我正在为 Android 开发一个基于 GPS 的应用程序 在其中我想实时了解 Android LocationManager 指定的当前位置与其他位置之间
  • 由两个向量 (n,1) 构建的 R 距离矩阵

    我有两个向量 x n 1 and y n 1 真实值 我想创建一个矩阵M n n 这些向量包含每两对之间的距离 您可以使用outer功能 x lt sample 5 y lt sample 5 x 1 1 5 3 4 2 y 1 2 3 5
  • 用于 HTTP 压缩的 GZip 或 Deflate

    哪种压缩方法更好 我听说过很多关于 GZip 被更广泛使用的说法 但 Deflate 更快 在某些情况下 是否有公认的标准来使用哪个标准以及为什么 UPDATE 根据链接问题的最新更新 应该使用 GZip 看http www vervest
  • 时间序列距离度量

    为了对一组时间序列进行聚类 我正在寻找一个智能距离度量 我尝试过一些众所周知的指标 但没有一个适合我的情况 ex Let s assume that my cluster algorithm extracts this three cent

随机推荐

  • 蓝桥杯2014年第五届真题-拼接平方数

    题目 题目链接 题解 实现题 题目大意 将一个区间内的数拆成两个数后 若原数 拆得的第一个数和拆得的第一个数均为平方数则输出 直接遍历区间内所有的数可能会超时 因此我们直接取区间内的平方数 只遍历区间内的平方数 时间复杂度会降很多 对于每个
  • Windows和Linux下共享内存使用

    源码地址 https github com ylmbtm GameProject3 看过我开源代码的朋友知道 我这个项目在逻辑服和数据服进行数据同步采用的就是共享内存 其实数据同步的方式有很多种 其中使用较多的一种方式就是tcp网络协议同步
  • CSS布局的三种机制:浮动

    CSS布局的三种机制 浮动 浮动 float 为什么要学习浮动 什么是浮动 float 浮动小结 浮动的应用 清除浮动 为什么要清除浮动 清除浮动本质 清除浮动的方法 额外标签法 隔墙法 父级添加overflow属性方法 使用after伪元
  • jdk的安装

    由于要使用jmeter进行接口自动化测试 而jmeter的使用 必要要安装jdk 因此就在网上随便找了一篇jdk的安装教程 由于我喜欢自定义安装 结果费了半天时间也没安装成功 前期后后安装与卸载不下5次 最后决得可能是jdk不能自定义安装的
  • 接口设计说明书模板

    目 录 1 引言 1 1 1 设计目标 1 1 2 适用范围 1 1 3 相关术语 1 1 4 参考资料 1 2 分析设计 1 2 1 设计思想 1 2 2 接口结构 1 2 3 数据流分析 2 3 中间库接口 2 3 1 中间库说明 2
  • java面试官如何面试别人

    java面试官如何面试别人 一 java面试官的 面试心得 在公司当技术面试官几年间 从应届生到工作十几年的应聘者都遇到过 先表达一下我自己对面试的观点 1 笔试 面试去评价一个人肯定是不够准确的 了解一个人最准确的方式就是 路遥知马力 日
  • OCR-字体颜色与背景颜色区分不明显的调研

    需解决的问题 对于一些图片 字体和颜色区分度不高 白色字体的图片进行图像增强时容易使字体更加 模型识别时存在漏检现象 图像增强后有些文字将会变得不清晰甚至消失 解决的方法 图像的二值化 以下使用了七种方法进行测试 Python代码 impo
  • shell筛选log

    服务器跑 pbs 脚本的时候 会分配一个 job ID 并相应地创建两个文件
  • anaconda和python版本的对应关系

    https docs anaconda com anaconda packages oldpkglists Anaconda与Python版本对应关系 官方最新
  • KernelSU: 内核 ROOT 方案, KernelSU KernelSU KernelSU 新的隐藏root防止检测 封号方案

    大约一年多以前 我在一篇讲Android 上 ROOT 的过去 现在和未来https mp weixin qq com s biz MjM5Njg5ODU2NA mid 2257499009 idx 1 sn 3cfce1ea7deb6e0
  • 年终总结——旧的收获与新的开始

    引言 收获本身分为俩部分 一个就是旧经历的收获 另外就是新路程的规划 概述 旧的一年已然逝去 那我们是否颗粒归仓 新的一年即将开始 我们是否规划好新的旅程 内容 颗粒归仓 从没有思考过一年的时光竟如此之短 不知不觉之间又到了颗粒归仓的瞬间
  • 爬取美女图片保存本地与入MySQL库(宅男福利)

    本文详细记录如何爬取美女图片 并将图片下载保存在本地 同时将图片url进行入库 保存在本地肯定是为了没事能拿出来养养眼啊 那入库就是为了定位图片啊 要懂点技术的话 还能搬运搬运做个小图片网站 不为别的 就是养眼和学习 本文主要讲思路和方法
  • 【Linux】用fdisk进行磁盘分区(图文过程)

    目录 0 环境 1 思路概述 2 详细介绍 2 1查看磁盘现有分区 fdisk l 2 2对分区设置具体参数 0 环境 linux 新版整理于2023 6 29 内容未变 增加了思路概述部分 排版看起来比以前好些 1 思路概述 1 查看磁盘
  • 财务数据分析?奥威BI数据可视化工具很擅长

    BI数据可视化工具通常是可以用户各行各业 用于不同主题的数据可视化分析 但面对财务数据分析这块难啃的骨头 能够好好地完成的 还真不多 接下来要介绍的这款BI数据可视化工具不仅拥有内存行列计算模型这样的智能财务指标计算功能 还拥有一套标准化
  • spark报错OutOfMemory

    最近在使用spark进行分析的时候 几千万的数据量感觉不多 但是跑起来非常慢 内存溢出OutOfMemory 1 然后在有使用map的地方 在map之前进行分区repartition 2 join会有shuffle产生 shuffle也会产
  • java-PDF读取一页某一区域内容

    首先还是我的风格 先看效果 在某一页pdf中获取某一块区域的内容和图片 这样就能获取想要的东西了 上代码 这里需要注意maven 是两部分
  • 电路交换,报文交换和分组交换的原理、区别、优缺点

    电路交换 电路交换技术是在通信两端设备间 通过一个一个交换设备中线路的连接 实际建立了一条专用的物理线路 在该连接被拆除前 这两端的设备单独占用该线路进行数据传输 电话系统就是采用了线路交换技术 通过一个一个交换机中的输入线与输出线的物理连
  • word2003脚注问题

    问题分析 在题目上插入脚注的时候 脚注放在文件结尾 然后正文拆开了 不能续前节 解决办法 word2003中 工具 gt 选项 gt 兼容性
  • Java中的byte详解

    Java中的byte详解 介绍 byte 即字节 由8位的二进制组成 在Java中 byte类型的数据是8位带符号的二进制数 在计算机中 8位带符号二进制数的取值范围是 128 127 所以在Java中 byte类型的取值范围也是 128
  • OpenGL 红宝书 反走样 雾 点参数 多边形偏移

    6 2 反走样 void glHint GLenum target GLenum hint 控制OpenGL的某些行为 参数target是要控制的行为 参数hint可以是GL FASTEST GL NICEST GL DONT CARE 效