质心插值说的是什么

2023.10.04再次review这个细节点:
基本上把这个问题看明白了;centroid代表质心插值;问题来自于在对普通的varying变量进行插值时,默认都是采用片元中心点来进行计算获取最终插值,但是有些情况中心点并不在图形的覆盖范围内,这时候中心点插值就会超出当初设置的一个值域范围,导致在某些边界存在异常情况;比如上面链接中的代码,在蓝色区域竟然出现了黄色就有问题。
 

产生这个问题的原因在于,针对离散的片元在进行光栅化差值时候,有些片元虽然只有少部分被几何区域覆盖,但这些片元也参与光栅化并被作为图形的一部分;这就导致使用片元中心点参与插值计算时,得到的计算结果会不在顶点的值域范围内。
而质心插值采用的是,几何边界所覆盖片元部分的一个质心点来参与插值计算。这样就能够保证最终光栅化的每个片元获取的数值都在顶点的值域范围内。
下面这个示例就是在表达这种情况:

左边没有使用质心插值,在下面代码构造的场景中就会出现超出值域范围(0-1)的问题;右边采用了质心插值,则没有出现这个问题。
<!-- WebGL 2 shaders -->
<script id="vs-render" type="x-shader/x-vertex">
#version 300 es
#define POSITION_LOCATION 0
#define ATTRIBUTE_DATA_LOCATION 6 precision highp float;
precision highp int; uniform mat4 MVP; layout(location = POSITION_LOCATION) in vec2 position;
layout(location = ATTRIBUTE_DATA_LOCATION) in float data; out float v_attribute; void main()
{
gl_Position = MVP * vec4(position, 0.0, 1.0);
v_attribute = data;
}
</script> <script id="fs-render" type="x-shader/x-fragment">
#version 300 es
precision highp float;
precision highp int; in float v_attribute;
out vec4 color; void main()
{
const vec4 blue = vec4( 0.0, 0.0, 1.0, 1.0 );
const vec4 yellow = vec4( 1.0, 1.0, 0.0, 1.0 );
color = v_attribute >= 0.0 ? mix(blue, yellow, sqrt(v_attribute)) : yellow;
}
</script> <script id="vs-render-centroid" type="x-shader/x-vertex">
#version 300 es
#define POSITION_LOCATION 0
#define ATTRIBUTE_DATA_LOCATION 6 precision highp float;
precision highp int; uniform mat4 MVP; layout(location = POSITION_LOCATION) in vec2 position;
layout(location = ATTRIBUTE_DATA_LOCATION) in float data; centroid out float v_attribute; void main()
{
gl_Position = MVP * vec4(position, 0.0, 1.0);
v_attribute = data;
}
</script> <script id="fs-render-centroid" type="x-shader/x-fragment">
#version 300 es
precision highp float;
precision highp int; centroid in float v_attribute;
out vec4 color; void main()
{
const vec4 blue = vec4( 0.0, 0.0, 1.0, 1.0 );
const vec4 yellow = vec4( 1.0, 1.0, 0.0, 1.0 );
color = v_attribute >= 0.0 ? mix(blue, yellow, sqrt(v_attribute)) : yellow;
}
</script>
那么质心怎么计算?
OpenGL allows implementers to choose the ideal centroid, or any location that is inside the intersection of the pixel square and the primitive, such as a sample point or a pixel center.
意思就是OpenGL规范允许具体实现者自己来决定,可以使用几何覆盖区域的中心点,或者直接使用片元的中心点也可以(当然这时候会有问题)。目前看起来当声明了使用质心插值时,大多数显卡的实现方式是,如果覆盖了片元中心点那么就是用片元中心点就是用中心点计算插值,当没有覆盖中心点就是用几何边界与片元覆盖区域(是一个三角形)计算出三角形质心(有专门的计算公式。
 

到底该不该用

质心插值也不是什么时候都适用,大部分时候影响不大(如果重要webgl1不会舍弃)。如果你的代码里有一些内置函数依赖插值结果,并且可能出现异常情况,比如对一个插值求开平方,如果插值出来结果是负数,对负数求开平方就有问题。

其次当着色器中代码逻辑,因为这个超出值域范围的数字影响特别大时候需要处理,比如对一个数求高次的幂逻辑。
 
也有一些情况不适用质心插值。比如代码中使用了一些导数计算,如dfx、dfy,因为他们的步长和方向都已经变了(delta的取值不再是两个片元的中心点差值了);另外如果非质心插值对效果影响不大可以不用管他,因为它的开销还是比较大。

webgl centroid质心插值的一点理解的更多相关文章

  1. opencv笔记5:频域和空域的一点理解

    time:2015年10月06日 星期二 12时14分51秒 # opencv笔记5:频域和空域的一点理解 空间域和频率域 傅立叶变换是f(t)乘以正弦项的展开,正弦项的频率由u(其实是miu)的值决 ...

  2. 对socket的一点理解笔记

    需要学web service,但是在视频中讲解到了socket套接字编程.以前貌似课上老师有提过,只是没用到也感觉乏味.现在遇到,自己看了些博客和资料.记录一点理解,不知正确与否. 首先说这个名字,叫 ...

  3. iOS 的一点理解(一) 代理delegate

    做了一年的iOS,想记录自己对知识点的一点理解. 第一篇,想记录一下iOS中delegate(委托,也有人称作代理)的理解吧. 故名思议,delegate就是代理的含义, 一件事情自己不方便做,然后交 ...

  4. 关于web开发的一点理解

    对于web开发上的一点理解 1 宏观上的一点理解 网页从请求第地址 到获得页面的过程:从客户端(浏览器)通过地址 从soket把请求报文封装发往服务端   服务端通过解析报文并处理报文最后把处理的结果 ...

  5. angular.js的一点理解

    对angular.js的一点理解 2015-01-14 13:18 by MrGeorgeZhao, 317 阅读, 4 评论, 收藏, 编辑 最近一直在学习angular.js.不得不说和jquer ...

  6. RxSwift 入坑好多天 - 终于有了一点理解

    一.前言 江湖上都在说现在就要赶紧学 swift 了,即将是 swift 的天下了.在 api 变化不大的情况下,swift 作为一门新的语言,集众家之所长,普通编码确实比 oc 要好用的多了 老早就 ...

  7. rt-thread中动态内存分配之小内存管理模块方法的一点理解

    @2019-01-18 [小记] rt-thread中动态内存分配之小内存管理模块方法的一点理解 > 内存初始化后的布局示意 lfree指向内存空闲区首地址 /** * @ingroup Sys ...

  8. rt-thread中软件定时器组件超时界限的一点理解

    @2019-01-15 [小记] 对 rt-thread 中的软件定时器组件中超时界限的一点理解 rt_thread_timer_entry(void *parameter)函数中if ((next_ ...

  9. mycat的schema.xml的个人的一点理解

    官方文档里讲的详细的部分的我就不再赘述了,我只是谈谈我自己的理解 刚开始接触mycat,最重要的几个配置文件有server.xml,schema.xml,还有个rule.xml配置文件 具体都是干啥用 ...

  10. 对C++多态的一点理解

    作为一个C++新手,我浅谈一下我对多态的一点理解. 首先,引用几句话: 1.继承是一种抽象,它允许程序员在某些时候忽略相似对象的差异,又在其他时候利用这些差异.——<C++沉思录> 2.继 ...

随机推荐

  1. CANoe学习笔记(六):如何实现LIN和CAN的多帧传输-----LIN

    内容: 1.实现LIN的多帧传输 一.新建一个基于LIN的CANoe工程 二.接下来创建一些工程用得上的变量.文件: 2.1 LDF文件: 这部分注意:包含三个调度表,①3C诊断请求帧②3D诊断响应帧 ...

  2. C++ 学习笔记 (一)

    C++标准化组织 https://isocpp.org/std/status http://open-std.org/JTC1/SC22/WG21/ why C++王者归来? https://cool ...

  3. Hello Welcome to my blog!

    Hello Welcome to my blog!

  4. 【HarmonyOS】关于 Caused by java.lang.IllegalStateException The specified...

    [问题描述] 线上收到大量手机的崩溃异常,以华为手机为主,崩溃如下 1.Caused by: java.lang.IllegalStateException: The specified messag ...

  5. 2-SQL

    1. SQL 全称 Structured Query Language,结构化查询语言.操作关系型数据库的编程语言,定义了 一套操作关系型数据库统一标准 . 2. SQL 通用语法 1). SQL 语 ...

  6. GPT3的局限性:语言多样性、语言理解能力、数据量

    目录 GPT-3 的局限性:语言多样性.语言理解能力.数据量 随着人工智能技术的不断发展,越来越多的语言模型被开发出来,其中最具代表性的就是 GPT-3.然而,尽管 GPT-3 已经在自然语言处理领域 ...

  7. Hugging News #0626: 音频课程更新、在线体验 baichuan-7B 模型、ChatGLM2-6B 重磅发

    每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...

  8. T-star高校挑战赛部分wp

    web-1签到 checkin还是很基础的 网站上传存在js检测,禁用js即可上传 写PHP一句话木马上传,http://588f25a5.yunyansec.com/upload/test.php连 ...

  9. PlayWright(十七)- 参数化

    今天来讲下参数化,具体是什么意思呢,举个例子   比如我们要测试登录功能,第一步会填写账号,第二步会填写密码,这是一条完整的操作,但是其中会有很多条用例比如账号错误.密码错误.账号为空.密码为空的各种 ...

  10. keras-retinanet 环境搭建 tensorflow2.3

    keras-retinanet 环境搭建 tensorflow2.3 前言 搭建好了 [tensorflow-gpu 2.5] 之后,接到一个指示,跑起来这个开源的库 keras-retinanet ...