blinn phong 照明产生奇怪的结果

Posted

技术标签:

【中文标题】blinn phong 照明产生奇怪的结果【英文标题】:blinn phong lighting creating strange results 【发布时间】:2018-05-05 22:33:59 【问题描述】:

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

创建每个单独的环境、漫反射和镜面反射会导致对象按预期着色 整体一次将它们加在一起,如下面的代码所示

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;

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

这是结果:

【问题讨论】:

附带说明,这似乎与 OpenGL 无关 @meowgoesthedog 它是 opengl raycaster 的一部分 如果你真的使用它来渲染场景,它只会与OpenGL有关,例如与 GLSL。这只是一个没有相关 OpenGL 代码的纯软件光线投射器(我假设您正在使用 OpenGL 来blit 渲染缓冲区)。 @meowgoesthedog 啊我明白了,是的,我没有使用 GLSL 进行渲染,谢谢指正 可能是标准化问题 - 一些值高于 255.0,因此它们从 0 开始环绕 【参考方案1】:

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

输出是直接绘制到屏幕上的颜色的浮点值。

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

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

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

但可能有更好的功能。

【讨论】:

以上是关于blinn phong 照明产生奇怪的结果的主要内容,如果未能解决你的问题,请参考以下文章

Phong和Blinn-Phong光照模型

Phong和Blinn-Phong光照模型

OpenGL学习脚印:Blinn-Phong光照模型

Unity shader学习之Blinn-Phong光照模型

Phong和Blinn-Phong光照模型

Blinn-Phong光照算法