扫描线算法和重心坐标计算方法

2017-01-0420:17:10

scan-line algorithm

sweep algorithm

  1. 求三角形的重心坐标

重心坐标的意义

三角形所在平面的任意点都能表示为顶点的加权平均值,这个权就叫做重心坐标

表示为I,J,K,  I+J+K=1

求重心坐标的快速算法,将图元用扫描线分割成垂直和水平的等分,然后生成一张“扫描边表”,通过这张表可以快速计算出同行的重心坐标。

例如:把v4, v5 存下来,计算v6的时候用上。

(Interpolcation qualifier ) 修饰fragment shader input, 指定插值算法。

smooth (default)        perspective interpolation

noperspective            linear interpolcation

flat                  no interpolcation

  1. 1.   点插值

点插值不需要计算重心坐标,但是可以通过访问glPointCoord [0,1.0] 获得纹理坐标。点纹理坐标的起点可以编程设置为UPPER_LEFT或者LOWER_LEFT.

点光栅化时(做扫描线算法)的时候,插值修饰符(iterpolation qualifier) 对点渲染没有作用,它也不会做混合操作。

启用MULTISAMPLE的时候,可以指定glPointParameteriv(GL_POINT_FADE_THRESHOLD_SIZE ), 单独对alpha通道做fade操作,最终的alpha值为 alpha = alpha * fade_factor.

(derived_size = gl_PointSize)

  1. 2.   线段插值

P是窗口坐标,t是 点d在线段ab上的重心坐标 (  ? 这样说对吗)

得到像素的值f,w 为clip coordinate的w分量,如果w为1. 公式就是

f = fa * I + fb * J   (I=1-t, J=t)

  1. 三角形插值

计算像素值的公式:

fabc为 顶点的值,w齐次坐标的w分量。

计算像素z值的公式:

如果w=1, 或者忽略掉w值 (noperspective),公式就变成了和计算z值一样的。

以上都是opengl 的概念,搞明白了,就可以在fragment shader 里面订制插值算法了。

  1. 4.   AMD GCN GPU 插值

GCNGPU 光栅化的时候只生成重心坐标I,J,存在v0, v1 两个寄存器(真节省,别浪费v2,它就是1-I-J)

这样对于三角形的smooth 插值:

D = P0 + P10*I + P20*J

( P0, P10, P20 是顶点的值)

分两步走

v_interp_f1_f32  v2, v0, attr0.x    //D=P0 + P10*v0

v_interp_f2_f32  v2, v1, attr0.x    //D=D+P20*v1

flat 插值一步完成:

v_interp_mov_f32  v3, v0, attrib0.xyz

attribute值需要存放在LDS中, 排列格式

(? K 哪去了,P0 已经被处理过了吗

Refer:

AMD_GCN3_Instruction_Set_Architecture.pdf

Opengl specification 4.5

时间: 2024-10-08 12:25:32

扫描线算法和重心坐标计算方法的相关文章

空间三角形重心坐标计算方法

P:三角平面上一点,ABC,三角形3个顶点 重心坐标(u,v)计算方法: 由式P – A = u(C - A) + v(B -A)得: ((C-A,B-A))*((u/v))=P-A (■([email protected]))=■((C-A&B-A))^(-1)*P-A 空间三角形重心坐标计算方法,布布扣,bubuko.com

机器学习相似度计算方法选择理论依据

在分类聚类算法,推荐系统中,常要用到两个输入变量(通常是特征向量的形式)距离的计算,即相似性度量.不同相似性度量对于算法的结果,有些时候,差异很大.因此,有必要根据输入数据的特征,选择一种合适的相似性度量方法. 令X=(x1,x2,..,xn)T,Y=(y1,y2,...yn)T为两个输入向量, 1.欧几里得距离(Euclidean distance)-EuclideanDistanceMeasure. ? 相当于高维空间内向量说表示的点到点之间的距离. 由于特征向量的各分量的量纲不一致,通常需

计算方法 读书笔记

### 写在前面 计算方法课程在第八周就这样匆匆结课了,我还没感觉学会什么东西,可能是去听课太少了吧.每次最后一周或几天预习完一门课程,都觉得有什么东西要留下来,尤其是在去年遇到一些算法的矩阵推到,发现自己已经把大一学的东西都还给老师了.趁刚考完试还有一些印象,我想赶快把一些体会记录一下. 由于本人课没咋听,只能说一些自己认为之后会对自己有帮助的东西,算是这门学科中的一些思想吧,至于对不对,就…… ### 泰勒展开与拉格朗日余项 事实上,计算方法,是一些数值的方法,对于计算机来说就是要解决一些拟

hdu-1542 Atlantis(离散化+线段树+扫描线算法)

题目链接: Atlantis Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/32768 K (Java/Others) Problem Description There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some of these texts even include ma

JavaScript加减计算方法和显示千分位

Math.formatFloat = function (f, digit) { var m = Math.pow(10, digit); return parseInt(f * m, 10) / m; }; 使用:var fee = Math.formatFloat(Number(a) + Number(b), 8).toFixed(2); function formatThousand(num) { num = num + ""; var re = /(-?\d+)(\d{3})/

[转]距离的计算方法

1. 欧氏距离(Euclidean Distance) 欧氏距离是最易于理解的一种距离计算方法,源自欧氏空间中两点间的距离公式. (1)二维平面上两点a(x1,y1)与b(x2,y2)间的欧氏距离: (2)三维空间两点a(x1,y1,z1)与b(x2,y2,z2)间的欧氏距离: 2. 曼哈顿距离(Manhattan Distance) 想象你在曼哈顿要从一个十字路口开车到另外一个十字路口,驾驶距离是两点间的直线距离吗?显然不是,除非你能穿越大楼.实际驾驶距离就是这个“曼哈顿距离”.而这也是曼哈顿

[Android Pro] CPU占用计算方法

1: AVTest  CPU计算方法读取每个进程的 stat 文件 (/proc/<PID>/stat)计算采样间隔10min下utime的差值minusUtime,stime的差值minusUtime,例如: 初始值Proc 1: utime=110 stime=200Proc 2: utime=400 stime=380...Proc X:...1个采样间隔 (10min后)Proc 1: utime=120 stime=220  差值: utime=120-110=10 stime=22

以太网 数据包速率计算方法

我们知道1个千兆端口的线速包转发率是1.4881MPPS, 百兆端口的线速包转发率是0.14881MPPS,这是国际标准,但是如何得来的呢? 具体的数据包在传输过程中会在每个包的前面加上64个(前导符)preamble也就是一个64个字节的数据包,原本只有512个bit,但在传输过程中实际上会有512+64+96=672bit,也就是这时一个数据包的长度实际上是有672bit的千兆端口线速包转发率=1000Mbps/672=1.488095Mpps,约等于1.4881Mpps,百兆除于10 为0

汇总从代数角度与几何角度理解相似度计算方法(以机器学习Mahout框架为主线)

相似度的计算是数据挖掘与机器学习中的一个永恒的话题,为了能更好地理解与比较各种相似度计算的方法,能灵活运用到各种计算模型中,自己在研究机器学习之Mahout框架时,源代码中也实现了很多相似度计算方法,本文结合机器学习Mahout框架中各种相似度计算方法的实现,并且从代数角度和几何角度来理解相似度的计算方法.并阐述其优缺点,及自己的适用场景.本文通过总结和归纳,一共总结了9中距离测量方法,方法一到方法七是Mahout中完完本本实现了,其中前面是方面名,破折号后是Mahout中各方法实现的类名,本文