blinn phong 照明创造奇怪的结果

blinn phong lighting creating strange results

我正在创建一个光线投射器并尝试使用全局照明作为着色方法 我已经计算了一个球体和立方体的交集以及它们的法线

创建每个单独的环境光、漫反射和镜面反射结果会按预期对对象进行着色 总体而言,一旦将它们加在一起,如下面的代码所示

glm::vec3 n = surfaceNormal(position, intersect);
glm::vec3 lightStart = glm::vec3(-10, 1, 10);//light points in 3d space
glm::vec3 lightDir = glm::normalize(lightStart - intersect); // direction towards light source
glm::vec3 viewDir = glm::normalize(cam.pos - intersect); // direction towards camera
glm::vec3 midDir = glm::normalize(lightDir + viewDir);//mid point between light and view

glm::vec3 lightColor = glm::vec3(1, 1, 1);//color of light
glm::vec3 objectColor = color ;

float shinyness = 10.0f;
float ambientStr = 0.1f;   

///ambient
glm::vec3 ambient = lightColor * ambientStr;
///diffuse
glm::vec3 diffuse = lightColor * glm::max(glm::dot(n,lightDir), 0.0f);
///specular

//ks * light color * facing * (max(n dot h))

glm::vec3 specular = lightColor * facing(n, lightDir) * 
std::pow(glm::max(glm::dot(n, midDir), 0.0f), shinyness);

glm::vec3 outColor = ambient + diffuse + specular;
return outColor * objectColor * 255.0f;

面对方法returns 1 如果 (n,lightDir) > 0 的叉积,否则它 returns 0 这是为了避免照亮指向错误方向的面孔

这是结果:

*255f 已经很可疑了(OpenGL 的典型用法适用于 [0...1] 范围内的颜色分量),并且您添加了评论

the output are float values for color being drawn straight to screen.

那么这是一个简单的溢出问题。您的权重是 0.1+[0...1]+[0...1](环境光、漫反射和镜面反射)的总和,属于 [0.1 ... 2.1],当您将它与颜色相乘时大于0.5的分量(大约1/2.1是精确极限),它们的乘积超过1,然后这个数乘以255,结果在255以上,截断为一个字节,"starts over"从黑色开始,按分量。

根据您显示的代码,您可能会尝试类似

return glm::min(outColor * objectColor * 255.0f, glm::vec3(255f, 255f, 255f));

但可能有更好的功能。