keywords:Comparison flat, Gouraud, Phong shading 原文: https://cg2010studio.com/2011/11/01/flat%E3%80%81gouraud%E3%80%81phong-shading%E7%9A%84%E5%B7%AE%E5%88%A5-comparison-flat-gouraud-phong-shading/ 现今多边形的著色方法基本的有这三种:flat、Gouraud、Phong Shading,它们之间有何差别呢?喜欢玩游戏的人一定要知道Gouraud Shading,这是PC最常使用的著色法,因为效能好、效果还不错。而近年来,随着GPU快速的发展,Phong Shading逐渐应用在更真实的著色上。 从一张图可以看出他们的各自的特色:(a: Flat→b: Gouraud→c: Phong) 从古早到现代:Flat→Gouraud→Phong Shading。 从简单到复杂:Flat→Gouraud→Phong Shading。 观察三者所呈现的效果,可以归纳出下列结论: 平面着色:恒定的表面着色 Gouraud着色:颜色插值着色 Phong着色:顶点法线插值着色 用简单的中文来解释原理: flat shading:三角形的顶点没有法向量,三角形整个面才有法向量,打光时整个三角形只呈现一种颜色。 Gouraud shading:三角形的顶点都有各自的法向量,打光时三个顶点有各自的颜色,接着做双线性内插(bilinear interpolation)来求得颜色,使整个三角形有渐层的颜色变化。 Phong shading:三角形的顶点都有各自的法向量,先对三角形整个面作法向量的双线性内插,接着打光来求整个三角形的颜色。 然后我们来分析各自的复杂度: 假设三角形面积为 A 。三角形个数为 N 。而且我们知道打一次光需要6次乘法和2次加法和1次查表的运算,此设定为 L 。双线性内插设定为 B 。 flat shading的复杂度:N * L Gouraud shading 的复杂度:N * (3 * L + b * A) Phong shading的复杂度:(B + L) * N * A 数学好的人很容易计算出复杂度:Flat < Gouraud < Phong Shading。这里也因此说明了为何早期电脑都只支援Gouraud shading,就算已经知道Phong shading的效果比Gouraud shading好,但还是选择效能好而效果不错的Gouraud shading!如今GPU发展迅速,Phong Shading的效能已得到提升。 stack overflow答案 https://computergraphics.

Continue reading

keywords:ambient diffuse specular、Phong Shading、Phong reflection model 公式概述 ADS光照模型又称为“冯氏反射模型”(Phong reflection model),为什么叫冯氏: 裴祥风(Bùi Tường Phong音译, 1942年—1975年),美国电脑CG研究学者,于越南出生。他于1973年在尤他大学取得哲学博士学位,并发明了Phong反射模型及Phong著色法,并广为CG界采用。1975死于白血病。 ADS光照模型公式缩写: LightIntensity = Ambient + Diffuse + Specular; 参数说明: Ambient 环境光 Diffuse 漫反射 Specular 全反射光 / 镜面光 三个参数渲染效果示例: 三个参数拆解如下: Ambient = La * Ka; Diffuse = Ld * Kd * max( dot(s, n), 0.0 ); Specular = Ls * Ks * pow( max( dot(r, v), 0.0 ), f ); 参数说明:

Continue reading

文章内容大部分参考自《OpenGL 4 Shading Language Cookbook, Second Edition》书中的代码: https://github.com/daw42/glslcookbook 术语解释: GLEW (OpenGL Extension Wrangler). GLM (OpenGL Mathematics) GLFW is an Open Source, multi-platform library for OpenGL, OpenGL ES and Vulkan development on the desktop. It provides a simple API for creating windows, contexts and surfaces, receiving input and events. Shader类型 vertex shader fragment shader geometry shader tess_control shader tess_evaluation shader compute shader OpenGL版本查询与设置 查询版本(使用glad的API): GLint major, minor; glGetIntegerv(GL_MAJOR_VERSION, &major); glGetIntegerv(GL_MINOR_VERSION, &minor); 选择版本(使用glfw的API):

Continue reading

Author's picture

Neil Wang

久长唯有品格

To Be Marvelous

Yichang·Hubei