graphics - Phong 着色和 Gouraud 着色有什么区别?
问题描述
据我了解,Gouraud着色计算每个顶点的光色并对该颜色进行插值,而Phong着色会插值每个像素的法线并根据该插值计算光色。
然而,当我试图从数学上推导出光色时,我最终得到了两种方式的相同公式!
(其中n1和n2是两个顶点的法线,t是插值的系数,L是光的方向,上面的平面和虚线表示屏幕和一个像素。)
两种方法的浅色派生如下:
古洛:
L = t*dot(n1,L) + (1-t)*dot(n2,L)
蓬:
L = dot(t*n1+(1-t)*n2,L)
结果是一样的。
谁能告诉我我的推导有什么问题?
解决方案
在Gouraud 着色时,光是按顶点计算的(顶点着色器),而在Phong 着色时,光是按片段计算的(片段着色器)。
因此,Gouraud 着色计算图元顶点(角)的光,并为图元覆盖的片段插入光。
使用 Phong 着色,为每个片段单独计算光。
一般来说,光是通过双向反射分布函数计算的。该函数计算光在表面上的反射率,并取决于入射光的矢量、视点和表面的法线矢量。
在Gouraud 着色中,顶点颜色(反射率)被插值,而在Phong 着色中,3 个向量被插值。如果函数c = brdf(l, v, n)是线性的,这不会有任何区别,其中c是颜色,l是光方向,v是视图向量,n是法线向量(例如朗伯反射率)。但是如果光照模型不是线性的(例如Blinn-Phong),那么 Gouraud 着色的线性插值会导致不同的结果。
推荐阅读
- python - 尝试训练模型进行意图识别但出现浮动错误
- javascript - 如何保存画布数据,提交到界面,并使其可供二次编辑
- ios - 错误:找不到模块“。” 部署到 ios 时 - Ionic 3
- laravel - 条件组件变量值递增Vue/Laravel
- python-3.x - 如何断言在 pytest 中调用了猴子补丁?
- llvm - LLVM 适合 createBranchWeights() 的参数
- angular - 有没有办法在 Angular 项目中设置自定义 svg 图标库而不使用
标签? - javascript - OpenAPI V3 json 对象到 Swagger HTML 对象的 Javascript 转换以通过 jQuery 更新 DIV
- javascript - 我如何在输入字段而不是跨度中获取价格?
- ckeditor5 - CKEditor 5 自定义构建工具栏未显示