PN三角形(Curved PN Triangles)
来源:互联网 发布:ios 开发 本地数据库 编辑:程序博客网 时间:2024/04/27 21:37
文章来源于
Curved PN Triangles ——Vlachos , Alex , Peters , rg , Boyd
现在已经是一种很成熟的图形渲染方法了(在这之前我都不知道顶点法向有什么用23333),其大致思路是在已有的控制顶点和法向的基础上插入新的控制顶点和控制法向,利用bezier三角形分片绘制,加上顶点法向的效果将其做更好的渲染。
算法描述
来自
PN 三角形在基于GPU 曲面细分中的应用 ——陈 驰,吴志红
PN 三角形与贝塞尔三角形
贝塞尔三角形是一种特殊的贝塞尔曲面,它通过控制点和质心坐标信息来确定三次曲面上的点的位置,而PN 三角形又是贝塞尔三角形的一种特殊的实现,即PN 三角形的控制点信息是依据输入三角形的顶点位置信息和法线信息计算求得,而它的质心坐标则是通过细分着色器来进行插值并输出。
几何控制点
输入渲染管线中的三角面片的信息以顶点为单位,如图2所示,
控制点的计算
1) 如图4所示,
2) 距
3)
求
法线控制点
PN 三角形共有6 个法线控制点(如图5 所示),其中顶点处的3 个为顶点的法线向量,而
基于面法线的渲染中三角面片之间的法线过渡是离散的,所以需要插入法线,如果是简单的线性插入,所
插入的法线信息可能不能反映法线反射的情况。比如,起始点和终止点的法线向量的方向相同,则在这之间插入的所有法线向量的方向与起始点和终止点的方向相同,但实际情况可能是,起始点和终止点之间的曲线可能是类似于正弦曲线的形状,而在这种情况下,所插入的法线向量的方向显然不是全都相同的。
基于上述原因,在求法线控制点时考虑镜面映射,如图 6 所示,
注意在这步之前的三点法向要单位化,之后的法向也要相应的单位化
Berzier三角形
在上面的做完了之后,分别按照三次和二次Bezier三角形曲面绘制即可
算法实现及实验效果
算法实现
求控制顶点和法向的代码如下
function [ control_new,N_new ] = tran_1to22( controls,N)%TRAN_1TO2 Summary of this function goes here% Detailed explanation goes here% 1,1% / \% 2,1--2,2% / \ / \% 3,1 --3,2-- 3,3% / \ / \ / \% 4,1--4,2-- 4,3 --4,4control_new=cell(4,4);control_new{1,1}=controls{1,1};control_new{4,1}=controls{2,1};control_new{4,4}=controls{2,2};point12_out=2/3*controls{1,1}+1/3*controls{2,1};control_new{2,1}=compute_nearest_point_on_surface2(controls{1,1},N(1,:),point12_out);point21_out=1/3*controls{1,1}+2/3*controls{2,1};control_new{3,1}=compute_nearest_point_on_surface2(controls{2,1},N(2,:),point21_out);point13_out=2/3*controls{1,1}+1/3*controls{2,2};control_new{2,2}=compute_nearest_point_on_surface2(controls{1,1},N(1,:),point13_out);point31_out=1/3*controls{1,1}+2/3*controls{2,2};control_new{3,3}=compute_nearest_point_on_surface2(controls{2,2},N(3,:),point31_out);point23_out=2/3*controls{2,1}+1/3*controls{2,2};control_new{4,2}=compute_nearest_point_on_surface2(controls{2,1},N(2,:),point23_out);point32_out=1/3*controls{2,1}+2/3*controls{2,2};control_new{4,3}=compute_nearest_point_on_surface2(controls{2,2},N(3,:),point32_out);E=1/6*(control_new{2,1}+control_new{3,1}+control_new{2,2}+control_new{3,3}+control_new{4,2}+control_new{4,3});V=1/3*(control_new{1,1}+control_new{4,1}+control_new{4,4});control_new{3,2}=E+1/2*(E-V);for i=1:3S=sqrt(N(i,1)^2+N(i,2)^2+N(i,3)^2);N(i,1)=N(i,1)/S;N(i,2)=N(i,2)/S;N(i,3)=N(i,3)/S;endN_new=zeros(6,3);N_new(1,:)=N(1,:);N_new(4,:)=N(2,:);N_new(6,:)=N(3,:);pn12=point12_out+0.5*(N(1,:)+N(2,:));pn12sur=compute_nearest_point_on_surface2(point12_out,controls{1,1}-controls{2,1},pn12);pn12_2=2*pn12sur-pn12;N_new(2,:)=pn12_2-point12_out;pn13=point13_out+0.5*(N(1,:)+N(3,:));pn13sur=compute_nearest_point_on_surface2(point13_out,controls{1,1}-controls{2,2},pn13);pn13_2=2*pn13sur-pn13;N_new(3,:)=pn13_2-point13_out;pn23=point23_out+0.5*(N(2,:)+N(3,:));pn23sur=compute_nearest_point_on_surface2(point23_out,controls{2,1}-controls{2,2},pn23);pn23_2=2*pn23sur-pn23;N_new(5,:)=pn23_2-point23_out;for i=1:6S=sqrt(N_new(i,1)^2+N_new(i,2)^2+N_new(i,3)^2);N_new(i,1)=N_new(i,1)/S;N_new(i,2)=N_new(i,2)/S;N_new(i,3)=N_new(i,3)/S;endend
然后绘制三角形的代码在绘制Bezier三角面片当中
试验效果
棒棒哒~~
- PN三角形(Curved PN Triangles)
- PN结
- PN学习
- PN 接口
- PN学习 .
- PN学习
- PN结
- PN学习
- PN学习理论
- PN learning
- pn结原理
- pn结原理
- 再谈PN学习
- PN学习(1)
- PN学习(2)
- Netapp 硬盘 PN
- 再谈PN学习
- 再谈PN学习 .
- 前后端传值的理解
- 1+2+...+100
- 如何在elipse中用svn导入项目内
- Gunicorn-配置详解
- 干货整理
- PN三角形(Curved PN Triangles)
- Java 9 正式发布,新特性研究
- java中date和时间戳相互转换以及获取前一个小时的时间
- Docker 入门使用 镜像编排 docker仓库 命令总结
- volatile 变量使用指南
- 微信小程序 图文混编 重写picker组件
- 解决Glide4.0和圆角裁剪CenterCrop冲突
- 52数学能力测评二阶一模考前复习直播课
- Ubuntu 常用操作