从OpenGL中的照明和色彩材料中获得什么颜色?

时间:2017-02-01 08:12:28

标签: opengl colors lighting

您好我有一个问题。

我正在尝试了解OpenGL中的灯光和材质。

但我不知道灯光如何影响物体的颜色和反射。

这是我发现的轻巧公式:

result Light = ambient + diffuse * (intensity) + specular

以下是一个示例用法:

ambient = 64,64,64

diffuse = 192,192,192

specular = 32,32,32 

intentisy = 0.5 

Light = 64 + 192*0.5+ 32 = 192

Result Light = (192,192,192)

以下是形成最终输出的方法:

Object Color = (Or,Og,Ob)

Material reflect = (Mr,Mg,Mb)

Real Color = (Or * Mr , Og * Mg ,Ob * Mb )

对于我的问题,

我不知道“结果光”如何影响“真实色彩”? 更具体地说:使用所有光源,材质和对象颜色输入,最终像素输出如何实现。

1 个答案:

答案 0 :(得分:2)

有点含糊不清,因为真实的范围可以从基于物理的渲染技术到使用各种自定义照明着色器的不同着色。

根据“材料”,我们将使用“结果光”的不同方程式。

以下是一些基本材料:

enter image description here

环境照明

float ambientStrength = 0.1f;
vec3 ambient = ambientStrength * lightColor;

vec3 result = ambient * objectColor;
color = vec4(result, 1.0f);

漫反射光照

in vec3 FragPos;  // input
vec3 norm = normalize(Normal);

vec3 lightDir = normalize(lightPos - FragPos);
float diff = max(dot(norm, lightDir), 0.0);

vec3 diffuse = diff * lightColor;
vec3 result = (ambient + diffuse) * objectColor;
color = vec4(result, 1.0f);

高光照明

float specularStrength = 0.5f;
vec3 viewDir = normalize(viewPos - FragPos);
vec3 reflectDir = reflect(-lightDir, norm); 


float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32);
vec3 specular = specularStrength * spec * lightColor; 

vec3 result = (ambient + diffuse + specular) * objectColor;
color = vec4(result, 1.0f);

合并Phong

从上面回收代码。

Source