blinn phong照明创造奇怪的结果

时间:2018-05-05 22:33:59

标签: c++ math graphics 3d glm-math

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

创建每个单独的环境,漫反射和镜面反射结果,然后按预期着色对象 整体将它们一起添加,如下面的代码所示

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)的叉积>则面对方法返回1。 0否则返回0 这是为了避免照明面朝错误方向

这是结果:

result

1 个答案:

答案 0 :(得分:0)

*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));

但可能有更好的功能。