我确实有一个问题,真实的灯光可视化(在应用中)。当前的可视化看起来如下:

它所做的是--如果光的亮度是低的--只有椭圆的中间部分是完全的亮度,这是在看到光色的同时更好地显示低光情况的方法,等等。
使用的公式:
current_ellipse_count = 15; // draw 15 ellipses from small to big one.
brightness = 100; // range is 0 to 255 ! lets say its 'white' light only, so r,g,b are equal.
while (current_ellipse_count > 0) {
//DRAW small-to-big ELLIPSE AND FILL IT WITH ellipse_brightness. first drawn ellipse is small, and highest current_ellipse_count. so highest amplifying effect of brightness.
ellipse_brightness = brightness*current_ellipse_count; // so the last ellipse will be real brightness(the biggest one) and the smallest one is always amplified by 15, bigger by 14, etc till the last one is amplified by 1.
if (ellipse_brightness > 255) ellipse_brightness = 255; // if it peaks its full brightness then.
current_ellipse_count--;
}这是我正在做的事情的简化方式。
这种方式成功地可视化了低亮度的情况,但在高亮度值下,假设200 (在0-255范围内)仅在椭圆的最后、最大、1像素的边框显示光不是完全明亮的。
我需要一个更好的公式,以正确地显示低亮度的情况和高亮度的情况应该降低。我认为我需要一个公式,降低给定的亮度值,以某种方式影响它从中途125 (从0-255范围)到255范围,或更好地更新整个亮度调整影响。
发布于 2014-12-20 17:11:19
我认为有几种方法可以很好地发挥作用:
1: ellipse_brightness = (int) (pow(brightness, 0.5) * current_ellipse_count * 2);这应该会给你更好的可视化在高亮度水平。您可以调整功率(0.5)和因数(2),以适应您的需要。
2: ellipse_brightness = (int) (brightness * 200 / pow(16 - current_ellipse_count, 2));这使用逆平方定律,它应该给你一个类似的影响,通过改变现有的线性下降。根据需要调整恒定因子(200)和功率(2)。
您可以将这两者结合起来,以获得可能更好的效果(通过试验和错误,我发现亮度看起来更好):
3: ellipse_brightness = (int) (pow(brightness, 2) * 0.75 / pow(16 - current_ellipse_count, 2));
if (ellipse_brightness > brightness*4) ellipse_brightness = brightness*4;最后,@Furkan的回答给了我一个使用cos()的想法
4: ellipse_brightness = (int) (brightness * cos((16 - current_ellipse_count)/15*3.1415926/2) * 2);所有这些方法的输出都类似于以下图像(原始图像,#1-4从上到下,从左到右,亮度为0-255,步长为16):

您可以使用所有方法的参数来稍微调整一些东西,或者根据需要组合多个方法。
发布于 2014-12-20 16:52:56
您的寻找漫射和镜面阴影也作为1/(radius*radius)强度。我把它修改为1/(4 * pi * radius * radius)。只要图像看起来很好,你就可以在上面做实验。
你可以谷歌漫射和镜面阴影。有很多消息来源。
// Diffuse Shading (Lambertian)
RGB diffuse;
float cosineAlpha = objectNormal.dot(lightVector);
cosineAlpha = abs(cosineAlpha);
if(cosineAlpha > 0)
{
diffuse.r = intensity.r * cosineAlpha * objects[closestObjectId]->matProperty.diffuse.r;
diffuse.g = intensity.g * cosineAlpha * objects[closestObjectId]->matProperty.diffuse.g;
diffuse.b = intensity.b * cosineAlpha * objects[closestObjectId]->matProperty.diffuse.b;
objectColor.r += diffuse.r;
objectColor.g += diffuse.g;
objectColor.b += diffuse.b;
}
// Specular Shading (Blinn-Phong)
RGB specular;
Vector3 halfVector;
halfVector.setX((lightVector + v).x() / ((lightVector + v).length()));
halfVector.setY((lightVector + v).y() / ((lightVector + v).length()));
halfVector.setZ((lightVector + v).z() / ((lightVector + v).length()));
float cosineTeta = objectNormal.dot(halfVector);
cosineTeta = abs(cosineTeta);
if(cosineTeta > 0)
{
float coeff = pow(cosineTeta, objects[closestObjectId]->matProperty.specExp);
specular.r = intensity.r * coeff * objects[closestObjectId]->matProperty.specular.r;
specular.g = intensity.g * coeff * objects[closestObjectId]->matProperty.specular.g;
specular.b = intensity.b * coeff * objects[closestObjectId]->matProperty.specular.b;
objectColor.r += specular.r;
objectColor.g += specular.g;
objectColor.b += specular.b;
}https://stackoverflow.com/questions/27581511
复制相似问题