Shading中的插值技术
提要
在Per Vertex shader中处理着色计算的情况计算出的是每个顶点上shading的结果,通常模型都是由三角面来构成,面上的颜色如何处理,就是今天要探讨的。常用的三种方法是Flat Shading, Gouraud Shading, Phong Shading,对于渲染一个小球,结果对比如下,从左到右依次是Flat Shading, Gouraud Shading, Phong Shading。
Flat Shading
这个最简单,整个面片的颜色都是一致的,没有平滑,只有很硬的边缘,面的颜色由面片的第一顶点或者最后一个顶点的颜色决定。OpenGL中相关的语句是
glShadeModel(GL_FLAT);
glProvokingVertex(GL_FIRST_VERTEX_CONVENTION);
glProvokingVertex(GL_LAST_VERTEX_CONVENTION);
在一些为了节省时间的渲染,比如CG动画的草稿等,可能会用到这种Shading技术。
Gouraud Shading
Gouraud Shading 中,首先要计算的是每个顶点的法线,这里的法线求法是通过包含该顶点的面的法线取平局求得,求得法线之后,就可以通过局部光照模型求得该顶点的颜色。
对于一个四边形面片,顶点颜色信息已经求出,当一条扫描线要对这个面片进行着色的时候,首先可以求出的是扫描线和四面体边的交点a,b的颜色。
那么s点的根据重心坐标插值,可以得出
由于是线性插值,所以可以通过上一个像素点的值求得,简化了计算
则整个计算的伪代码如下
deltaI = (i2 - i1) / (x2 - x1); for (xx = x1; xx < x2; xx++) { int offset = row * CScene.screenW + xx; if (z < CScene.zBuf[offset]) { CScene.zBuf[offset] = z; CScene.frameBuf[offset] = i1;} z += deltaZ; i1 += deltaI; }
Phong Shading
在Phong Shading中,首先要计算的也是多边形顶点的法线,但是在扫描线对颜色进行填充的时候,不是对颜色插值,而是对法线进行了插值。
已知多边形顶点的法线N1,N2,N4,扫描线与多边形交于a,b点,则a,b的法线为
由于是线性插值,同样可以用增量计算来进行优化
到这一步,只计算出了法线,已经比Gouraud Shading复杂了三倍了。
计算出法线之后,还需要对每一个像素进行光照计算,比如Phong光照模型,Blinn-Phong等,这个性能相比于直接插值可就不是一个数量级了。
还是给出伪代码
for (xx = x1; xx < x2; xx++) { int offset = row * CScene.screenW + xx; if (z < CScene.zBuf[offset]) { CScene.zBuf[offset] = z; pt = face.findPtInWC(u,v); float Ival = face.ptIntensity; CScene.frameBuf[offset] = Ival;< BR>} u += deltaU; z += deltaZ; p1.add(deltaPt); n1.add(deltaN); }
Gouraud shading VS Phong shading
相对于Flat shading, Gouraud shading已经有了长足的进步。通常,物体的表面都是光滑的,当用mesh网格来表示,所有的物体都变成了有棱有角的东西,当然网格越密,棱角感就越小,渲染的代价也就越大。Gouraud shading就解决了mesh渲染中的棱角感。相比于Phong shading,由于不用计算每个ppixel的值。它的代价也非常的小,但问题也是存在的,就是specular表现并不尽如人意,特别是当specular非常小的时候,假如真实情况中,specular是处于一个多边形的中间,由于这个specular很小,所以多边形的顶点是没有specular的,那么按照Gouraud shading的插值方法,specular就不存在了。同时,如果真实情况中specular出现在多边形的顶点上,那么按照Gouraud shading的插值方法,包含顶点的多边形上会有线性分布的specular。
解决这两个问题的方法是适当增加顶点的密度。另一个解决方案就是Phong shading了。Phong shading 最大的缺点应该就是性能上的代价了(当然是相对Gouraud shading),因为每个像素都要计算光照,对应于OpenGL 的 Fragment shader.
参考
Gouraud shading wiki - http://en.wikipedia.org/wiki/Gouraud_shading
Phong shading wiki - http://en.wikipedia.org/wiki/Phong_shading
Phong Shading and Gouraud Shading - http://www.nbb.cornell.edu/neurobio/land/OldStudentProjects/cs490-95to96/guo/report.html
Shading中的插值技术相关推荐
- matlab插值与拟合例题_MATLAB中数据插值和数据拟合的用法
一.数据插值: 插值是在一组已知数据点的范围内添加新数据点的技术.可以使用插值来填充缺失的数据.对现有数据进行平滑处理以及进行预测等.MATLAB 中的插值技术可分为适用于网格上的数据点和散点数据点. ...
- 目标检测中特征融合技术(YOLO v4)(下)
目标检测中特征融合技术(YOLO v4)(下) ASFF:自适应特征融合方式 ASFF来自论文:<Learning Spatial Fusion for Single-Shot Object D ...
- 目标检测中特征融合技术(YOLO v4)(上)
目标检测中特征融合技术(YOLO v4)(上) 论文链接:https://arxiv.org/abs/1612.03144 Feature Pyramid Networks for Object De ...
- 读《环境光遮蔽技术在图形图像中若干关键技术的研究》总结-其一
末尾附文章引用 文章架构: 开篇先写Abstract,对本文章的研究内容进行了总结性概述: Abstract怎么写? 1.点名研究内容,研究意义,提出当下需要解决的问题. 2.讲本文章解决这些问题的思 ...
- 遥感与GIS在滑坡、泥石流风险普查中的实践技术应用
我国是地质灾害多发国家,地质灾害的发生无论是对于地质环境还是人类生命财产的安全都会带来较大的威胁,因此需要开展地质灾害风险普查.利用遥感(RS)技术进行地质灾害调查工作具有宏观.快速.准确的特点,能反 ...
- 【案例教程】ArcGIS在洪水普查、风险评估及区划中的实践技术
水旱灾害风险普查是全国自然灾害综合风险普查的重要组成部分,而水旱灾害风险评估与区划是水旱灾害风险普查的主要任务之一.其中,我国有超过 60%的国土面积.90%以上的人口均受到不同程度的洪水威胁,重要城 ...
- 地理信息系统(ArcGIS)在水文水资源、水环境中的实践技术应用及案例分析
目录 专题一 ArcGIS:数据管理 专题二 ArcGIS:数据转换 专题三 ArcGIS:地图制作 专题四 水文水环境数据编辑与管理 专题五 水文水环境数据处理与分析 专题六 ArcGIS水文分析及 ...
- Vue中使用ajax技术
Vue 在Vue中使用ajax技术 第一种代理方法 第二种代理方法 pathRewrite配置项 ws配置项 changeOrigin配置项 github案例 第三方库发送ajax 封装axios 默 ...
- ArcGIS在水土流失模拟及分析中的实践技术应用
查看原文>>>ArcGIS在水土流失模拟及分析中的实践技术应用 目录 一.水土保持与流域综合管理 二.水土保持空间数据库建设 三.水土流失模型介绍及实现 四.水土保持专题地图制作 五 ...
最新文章
- 感悟Windows7
- java如何确保单线程_java – 任何单线程程序如何成为有效的多线程程序?
- DTCMS,手机网站访问跳转到DTCMS官网解决方法
- 那些人工智能未来式,没看过你就 OUT 了
- Python实现进度条总结
- 阿里云低延时直播RTS能力升级,让直播推流效果更佳
- android 仿携程选择城市,类似携程商旅的城市选择器 CityPicker
- 怎么在activity里面操作listView的item里的组件的点击事件
- android svg指纹录取动画_你知道几种前端动画的实现方式?
- uva 10562 - Undraw the Trees
- 使用临时表关联数据时效率低的问题
- xp框架下载官方_定制Xposed框架(干货)
- python能干什么知乎-python能做什么知乎
- 简单提取iOS13的ipsw固件的内置壁纸(或文件)
- python 进阶案例_Python 进阶内容整理
- 这些富人思维,学会任何一种都可以纵横互联网
- uniapp开发app 调用支付宝人脸实名认证
- 如何下载网站中的blob:https:// 视频
- 视频剪辑,人脸贴纸美颜特效数字图像处理背后的技术-Qt版本
- K8S Pod 保护之 PodDisruptionBudget