11
$\begingroup$

The scene:

  • Just a plane, a camera, and a light.
  • The plane is facing the camera, the lamp is facing the plane, all 3 completely aligned.
  • The plane is just a diffuse, R,G,B=1,1,1 which means the material bring back the light it received with the same intensity.
  • The light has a size of 10cm, R,G,B=1,1,1 and strength of 10, I've tried each type (spot, area...) put a fall off node in constant (which for me and blender manual means, light intensity remain the same regardless the distance it travels).

Render result:

So when I hit render and analyze the scene linear value, I expect to have a value of 10 for the lighted pixels, but I've got pixels around R,G,B=0.25,0.25,0.25 or 0.7,0.7,0.7 depending on the type.

Even worst I've constated that the light is stronger when set to quadratic than to constant, but not close to 10 neither.

I've tried with only the world background R,G,B=1,1,1 and strength to 10, this time the result is as I expected, analyzed lighted pixels R,G,B=10,10,10

Question:

So the question is how do these lights work in cycles, and are they broken?


Edit :

Look Mike's answer and my comment below to see why there's nothing to worry about these lights in Cycles.

Edit2 :

I offert the bounty to Bertmoog because he provide a good in deep answer, in fact, if it was possible, I would have split the bounty 50/50 with Mike, because he point me to the fact that W/m² aren't the same as pixels values, which was an important part to understand why I haven't got the same values for the source and for the mesured pixel (ray intensity).
Thanks to both of you.

$\endgroup$

2 Answers 2

8
+100
$\begingroup$

You had already accepted an answer before I posted this, but I didn't believe that the accepted answer fully dealt with or explained the issue at hand.


This statement in the OP is false: "The plane is just a diffuse, R,G,B=1,1,1 which means the material bring will back the light it received with the same intensity."

A diffuse surface by it's very definition "scatters" the photons. So in a realistic light model, it would be impossible for the intensity at one specific angle to equal that of the input intensity even with a perfectly coherent light source. Think of shining a laser on your wall, the "dot" on your wall will never be as intense as the light emitted from the source unless you are aiming it at a perfectly reflective "mirror", for instance. Then the light would be as intense but only at the angle of incidence. See: https://en.wikipedia.org/wiki/Diffuse_reflection

Secondly, light intensity is governed by the Inverse-square law (even for coherent light). This means that the intensity of the light is inversely proportional to the square of the distance. For instance, if you had a light source of intensity 16 at 1 meter, then at 2 meters the intensity would be 4, at 4 meters the intensity would be 1. The reason this is important is that the distance is critical. So even though in your test, the camera, the plane, and the source are all aligned, you may have chosen an arbitrary distance.

To see if this holds true with Cycles, I used your exact setup, but I placed a point lamp at 1 meter and set the intensity until the RGB of the rendered image was (16,16,16) at the center. Then I moved it to 2 meters and measured and finally 4 meters. Cycles actually approximates it pretty well:

enter image description here

EDIT:

Yes, you're correct, Cycles has no atmosphere (apart from volumetrics) so a single light ray has the same intensity at the source as at the surface. Also, with Cycles, it's not "real world"... only a "realistic" simulation, so theoretically, Cycles wants to be mathematically correct. However, there must be many compromises in the software.

Cycles is a probabilistic ray-tracing engine where it uses random path tracing to approximate light in the real world. The problem with simulating light in the real world is that, in a practical sense, you're dealing with numbers approaching infinity. That's why when you increase the number of samples and bounces in a given render, it converges to better approximate real world lighting as the samples/bounces approach infinity.

As you said, there is no 100% Diffuse surface in the real world... but in Cycles there is. And as you said, a light ray doesn't split into two. It's calculated as one path with no branches, up to the specified number of bounces. It's then determined at each point what the brightness level should be based on the intensity of the surface from which it bounced and the reflectance angle with respect to the camera. For Diffuse surfaces, a BRDF function is applied to mathematically approximate the brightness as it would "appear" in the real world.

So when Cycles approximates a Diffuse surface, the intensity of the rendered pixel will be "dimmer" just as it would be in the real world... and from that pixel, Cycles will shoot that same ray in another random direction just as a diffuse surface would in the real world with that same lowered intensity (though it should be noted that Cycles shoots rays from the camera instead of the source).

So why is the light intensity lower? Because you are only seeing a small amount of the actual light rays returning directly to the camera from the point of impact. If you shoot one ray at the diffuse surface, you have a very small chance of it being reflected directly back to the camera... and that chance decreases the farther the camera plane gets from being perpendicular with the angle of incidence.

Here, I've created a cube without a top and given it a Diffuse Shader at (1,1,1) with a Spot lamp (1cm, 1 degree, and no blend) pointed at the bottom of the cube. You can see how much light is reflected in every direction, even though for all practical purposes, this is a unidirectional light source. This is further proven by the fact, that the point of direct impact has the same (pixel) brightness at all angles of incidence (in the hemisphere of reflectivity).

enter image description here


TLDR:

For every ray that isn't directly reflected back to the camera, the direct reflection intensity is decreased and will never equal that of the input intensity. The only way to get the same intensity back to the camera is to use a perfectly reflective (Glossy) shader (since as you said, there's no atmosphere). Of course, even then, there will be discrepancies between the pixel RGB values and the "Strength" of the lamp. They are not correlated 1:1 but they are directly proportional.

There is so much to write but I think this is way too long already. Read also:

What is a BSDF?

https://en.wikipedia.org/wiki/Bidirectional_scattering_distribution_function

$\endgroup$
6
  • $\begingroup$ See my comment and the edit I've made, you're absolutly right for the invers square law, what I realized in my comment, but you're wrong when you say my statement is false, in my test I'm not in a real world conditions, nothing is 100% diffuse and a diffuse color R,G,B=1,1,1 (albedo of 1) doesn't exist in real life. And yes diffuse scatter light in all direction but it doesn't split a ray in 2, so if you analyse a pixel with one sample and just the first bounce my statement is right. Try with the world background color to 1,1,1 , strength of your choice and the diffuse to 1,1,1 ^^ $\endgroup$
    – Mareck
    Sep 13, 2017 at 22:26
  • $\begingroup$ @Mareck - I'm not sure what to say that I haven't already. Read the Wiki that I linked. I'm not stating opinion, this is known, understood, fundamental physics. There's no question. That there's not a 100% diffuse surface in the real world is of little consequence since the reflected intensity at a specific angle is decreased with ANY amount of diffuse reflection. However, you are in a test environment with 100% diffuse shader. Of course a light ray isn't split into two, I don't understand why you made that statement. $\endgroup$
    – bertmoog
    Sep 13, 2017 at 22:50
  • $\begingroup$ Be shure that, with the 2 links you provide I don't think you're stating opinion, in fact you probably now more than me about the subject. Ok, my statement is false because I said light and not the ray, here I'm just focused on one ray. But since we don't have atmospher in Cycles, so no particule that scatter light nor absorb energy of ray, since the surface is 100% diffuse, with an albedo of 1 (RGB 1,1,1), it means that when the ray hit the surface it has the same intensity that when it start from the source. At least it's how I understand it but if i'm still wrong I really want to know why. $\endgroup$
    – Mareck
    Sep 14, 2017 at 18:54
  • $\begingroup$ @Mareck - Please see my edit above, thanks! $\endgroup$
    – bertmoog
    Sep 14, 2017 at 20:45
  • 1
    $\begingroup$ Nice edit and infos, I knew that we were agree, I should have post a screenshot of my test with the spot and no bounce, it would have been less confusing. Thanks. $\endgroup$
    – Mareck
    Sep 14, 2017 at 23:09
9
$\begingroup$

The light energy in Cycles are defined using the following unit: According to the doc: "Sun lamps are specified in Watts/m^2, other lamps are specified in Watts, and Emission shaders on meshes are also in Watts/m^2. I am not sure how the world energy is defined.

Because the energy are specified in watts (over an area when applicable), I don't see any reason why a perfectly diffuse surface should reflect the same numerical RGB value as the lamp's energy.

$\endgroup$
1
  • $\begingroup$ Thanks for the answer, you're right W/m² aren't the same as pixels values, I've done the math and now I re understand the invers square law, silly me, Troy already explain it to me a while ago but I forgot. And for the crazy behavior of constant vs quadratic I think I was just tired. $\endgroup$
    – Mareck
    Sep 13, 2017 at 21:54

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .