登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> 开发 vlog >> 主题: 有关着色器光照的一篇好文     [回主站]     [分站链接]
标题
有关着色器光照的一篇好文
clq
浏览(9) + 2025-07-13 14:18:53 发表 编辑

关键字:

有关着色器光照的一篇好文

https://zhuanlan.zhihu.com/p/685575356

--------------------------------------------------------
其中一位学者就是我们本节的主角:Bui Tuong Phong

博士。
图片来自https://handwiki.org/wiki/Biography:Bui_Tuong_Phong


他是一位越南裔计算机科学家,1973年在他的博士论文《Illumination for Computer Generated Images》中,Bui Tuong Phong博士提出了计算机图形学中第一个有广泛影响力的简单光照模型。这个模型虽然只是一个经验模型,但利用它得到的计算机图形的“真实感”达到了人们普遍可以接受的程度,从而在众多的三维建模软件、电子游戏里得到普遍应用。

Bui Tuong Phong博士的论文可以在

https://collections.lib.utah.edu/ark:/87278/s60635q6

在线阅读,也可以下载成PDF文件。...
也就是:

光照 = 漫反射(Diffuse) + 高光反射(Specular) + 环境光(Ambient)

可惜的是天妒英才,Bui Tuong Phong博士由于得了末期白血病,于1975年7月病逝,年仅33岁。

后面的学者把Phong光照模型转化成了以下公式:

其中:

La是环境光的强度

Ka是环境光的反射系数

--------------------------------------------------------
在phong.vs输入以下代码:

#version 450 core
layout (location = 0) in vec3 position;
layout (location = 1) in vec3 normal;
layout (location = 2) in vec2 tex_coord;
out vec3 vertex_position;
out vec3 vertex_normal;
out vec2 vertex_tex_coord;
layout (location = 0) uniform mat4 model;
layout (location = 1) uniform mat4 view;
layout (location = 2) uniform mat4 projection;
void main()
{
vertex_position = vec3(model * vec4(position, 1.0));
gl_Position = projection * view * vec4(vertex_position, 1.0);
vertex_normal = normal;
vertex_tex_coord = tex_coord;
}

在这个shaders子文件夹下创建phong.fs文件:

在phong.fs输入以下代码:

#version 450 core
in vec3 vertex_normal;
in vec2 vertex_tex_coord;
in vec3 vertex_position;
out vec4 fragment_color;
layout (location = 3) uniform vec3 surface_color;
layout (location = 4) uniform vec3 light_color;
layout (location = 5) uniform vec3 light_position;
layout (location = 6) uniform vec3 ambient_color;
layout (location = 7) uniform vec3 viewer_position;
layout (location = 8) uniform float Ka;
layout (location = 9) uniform float Kd;
layout (location = 10) uniform float Ks;
layout (location = 11) uniform float shininess;
layout (location = 12) uniform int light_mode;
void main()
{
vec3 ambient = Ka * ambient_color;
vec3 N = normalize(vertex_normal);
vec3 L = normalize(light_position - vertex_position);
vec3 diffuse = Kd * max(dot(N, L), 0.0) * light_color;
vec3 V = normalize(viewer_position - vertex_position);
vec3 R = reflect(-L, N);
vec3 specular = Ks * pow(max(dot(R, V), 0.0), shininess) * light_color;
if (light_mode == 0)
fragment_color = vec4(surface_color, 1.0);
else if (light_mode == 1)
fragment_color = vec4(ambient * surface_color, 1.0);
else if (light_mode == 2)
fragment_color = vec4(diffuse * surface_color, 1.0);
else if (light_mode == 3)
fragment_color = vec4(specular * surface_color, 1.0);
else
fragment_color = vec4((ambient + diffuse + specular) * surface_color, 1.0);
}


--------------------------------------------------------




Ld是漫反射光的强度

Kd是漫反射光的反射系数

Ls是高光反射光的强度

Ks是高光反射光的反射系数

s是高光反射的亮度




总数:0 页次:1/0 首页 尾页  
总数:0 页次:1/0 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1