在OpenGL中,从照明和颜色材质中获得什么颜色?

在OpenGL中,从照明和颜色材质中获得什么颜色?,opengl,colors,lighting,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 Resu

嗨,我有一个问题

我试图理解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 )
对于我的问题

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

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

根据“材质”,我们将有一个使用“结果光”的不同方程式

以下是一些基本资料:

环境照明

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);
漫反射照明

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);
镜面反射照明

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);
组合电话

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);
从上面回收代码


有点模棱两可,因为real的范围从基于物理的渲染技术到使用各种自定义照明着色器的不同着色

根据“材质”,我们将有一个使用“结果光”的不同方程式

以下是一些基本资料:

环境照明

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);
漫反射照明

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);
镜面反射照明

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);
组合电话

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);
从上面回收代码


(或*Mr,Og*Mg,Ob*Mb),我认为这个公式是在有光的情况下计算出来的颜色。我没有使用着色器。仅使用固定管道,如glLightfv。环境色和真实色不一样吗?i tihnk真实颜色不是应用闪电,像素颜色是计算真实颜色和结果照明。错了吗@성정민 我一定是误会了。更新答案。对不起,我的天。。谢谢你!!!我真的理解所有这些。你能再提一个问题吗????着色器源上方的对象颜色已由fomular计算(或*Mr、Og*Mg、Ob*Mb)。是这样吗@성정민 没问题,试着澄清这个问题,这样它就不会被否决。我可以帮你复习@성정민 公式(或*Mr,Og*Mg,Ob*Mb)过于简单化,因为它高度依赖于材质来确定“对象颜色”和“材质颜色”是如何相乘或集成的。(或*Mr,Og*Mg,Ob*Mb),我认为公式是在有光的情况下计算的颜色。我没有使用着色器。仅使用固定管道,如glLightfv。环境色和真实色不一样吗?i tihnk真实颜色不是应用闪电,像素颜色是计算真实颜色和结果照明。错了吗@성정민 我一定是误会了。更新答案。对不起,我的天。。谢谢你!!!我真的理解所有这些。你能再提一个问题吗????着色器源上方的对象颜色已由fomular计算(或*Mr、Og*Mg、Ob*Mb)。是这样吗@성정민 没问题,试着澄清这个问题,这样它就不会被否决。我可以帮你复习@성정민 公式“(或*Mr,Og*Mg,Ob*Mb)。”过于简单化,因为它高度依赖于材质来确定“对象颜色”和“材质颜色”如何相乘或集成。谢谢!!我知道我也在研究着色器,但我们的组织使用这些。所以我需要学习旧gl和新gl。谢谢!!我知道我也在研究着色器,但我们的组织使用这些。所以我需要学习旧的gl和新的gl。