Why Diffuse Light use max(N · H, 0) instead of just letting it be negative?

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP












3












$begingroup$


In Cg tuts, Diffuse Section




Surfaces that face away from the light will produce negative dot-product values, so the max(N · L, 0) in the equation ensures that these surfaces show no diffuse lighting.




My question is why not just leave it be negative? IMO, both the negative and zero will make the color be black.










share|improve this question









$endgroup$
















    3












    $begingroup$


    In Cg tuts, Diffuse Section




    Surfaces that face away from the light will produce negative dot-product values, so the max(N · L, 0) in the equation ensures that these surfaces show no diffuse lighting.




    My question is why not just leave it be negative? IMO, both the negative and zero will make the color be black.










    share|improve this question









    $endgroup$














      3












      3








      3





      $begingroup$


      In Cg tuts, Diffuse Section




      Surfaces that face away from the light will produce negative dot-product values, so the max(N · L, 0) in the equation ensures that these surfaces show no diffuse lighting.




      My question is why not just leave it be negative? IMO, both the negative and zero will make the color be black.










      share|improve this question









      $endgroup$




      In Cg tuts, Diffuse Section




      Surfaces that face away from the light will produce negative dot-product values, so the max(N · L, 0) in the equation ensures that these surfaces show no diffuse lighting.




      My question is why not just leave it be negative? IMO, both the negative and zero will make the color be black.







      lighting cg






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Jan 7 at 6:22









      AlexWeiAlexWei

      1674




      1674




















          3 Answers
          3






          active

          oldest

          votes


















          10












          $begingroup$

          If lighting with multiple lights, they add together to make the final lighting value. A negative light would darken other lights, which is incorrect. This is also true if you add in specular reflections, emissive lighting, or other sources of lighting. The negative lighting from one source of lighting would darken some other source of non negative lighting.






          share|improve this answer









          $endgroup$












          • $begingroup$
            If only one direction light is taken into account, no further processing such as half-lambert, is there any need to use the max func?
            $endgroup$
            – AlexWei
            Jan 7 at 7:54






          • 3




            $begingroup$
            If your application does indeed not rely on this value not being negative (only a single light source, just rendering straight to a color target in a way that will lead to the output being clamped to black anyways, etc.) then, by all means, go ahead and skip the max() if it makes you feel better. But do so, knowing that this will merely produce a result indistinguishable from the correct result in the most narrow circumstances and incorrect results in any other case. Meanwhile, any useful explanation of how shading works will continue to present the formula that is correct in general… 😉
            $endgroup$
            – Michael Kenzel
            Jan 7 at 10:00










          • $begingroup$
            @MichaelKenzel Actually, it will makes me feel better :) knowing it could be safely skipped. Because I am afraid there is sth beyond my knowledge happens under the hood. Thanks.
            $endgroup$
            – AlexWei
            Jan 7 at 11:46


















          2












          $begingroup$

          Because negative shading values are undefined and don't play well with tonemapping. It is preferable to use values in $[0,1]$ for low-dynamic-range or $[0,+infty)$ for high-dynamic-range images.






          share|improve this answer









          $endgroup$




















            2












            $begingroup$

            $N cdot L < 0$ implies that the light is directed in the direction opposite the normal to the visible surface of the polygon. This means that the light is coming from behind and striking the back face of the polygon. In the analogous situation in real life, light striking one face of an opaque surface does not affect the illumination of a second face. Shining light on the back of a book (or other opaque object) does make the front of the book darker (that is it does not apply negative lighting): it simply has no effect on the front face of the book. This is the reason for the max() function.



            Applying negative illumination to a surface where $N cdot L < 0$ doesn't make sense physically. In geometric optics with incoherent light sources there is no such thing as negative illumination.






            share|improve this answer









            $endgroup$












              Your Answer





              StackExchange.ifUsing("editor", function ()
              return StackExchange.using("mathjaxEditing", function ()
              StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix)
              StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["$", "$"], ["\\(","\\)"]]);
              );
              );
              , "mathjax-editing");

              StackExchange.ready(function()
              var channelOptions =
              tags: "".split(" "),
              id: "633"
              ;
              initTagRenderer("".split(" "), "".split(" "), channelOptions);

              StackExchange.using("externalEditor", function()
              // Have to fire editor after snippets, if snippets enabled
              if (StackExchange.settings.snippets.snippetsEnabled)
              StackExchange.using("snippets", function()
              createEditor();
              );

              else
              createEditor();

              );

              function createEditor()
              StackExchange.prepareEditor(
              heartbeatType: 'answer',
              autoActivateHeartbeat: false,
              convertImagesToLinks: false,
              noModals: true,
              showLowRepImageUploadWarning: true,
              reputationToPostImages: null,
              bindNavPrevention: true,
              postfix: "",
              imageUploader:
              brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
              contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
              allowUrls: true
              ,
              onDemand: true,
              discardSelector: ".discard-answer"
              ,immediatelyShowMarkdownHelp:true
              );



              );













              draft saved

              draft discarded


















              StackExchange.ready(
              function ()
              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcomputergraphics.stackexchange.com%2fquestions%2f8451%2fwhy-diffuse-light-use-maxn-h-0-instead-of-just-letting-it-be-negative%23new-answer', 'question_page');

              );

              Post as a guest















              Required, but never shown

























              3 Answers
              3






              active

              oldest

              votes








              3 Answers
              3






              active

              oldest

              votes









              active

              oldest

              votes






              active

              oldest

              votes









              10












              $begingroup$

              If lighting with multiple lights, they add together to make the final lighting value. A negative light would darken other lights, which is incorrect. This is also true if you add in specular reflections, emissive lighting, or other sources of lighting. The negative lighting from one source of lighting would darken some other source of non negative lighting.






              share|improve this answer









              $endgroup$












              • $begingroup$
                If only one direction light is taken into account, no further processing such as half-lambert, is there any need to use the max func?
                $endgroup$
                – AlexWei
                Jan 7 at 7:54






              • 3




                $begingroup$
                If your application does indeed not rely on this value not being negative (only a single light source, just rendering straight to a color target in a way that will lead to the output being clamped to black anyways, etc.) then, by all means, go ahead and skip the max() if it makes you feel better. But do so, knowing that this will merely produce a result indistinguishable from the correct result in the most narrow circumstances and incorrect results in any other case. Meanwhile, any useful explanation of how shading works will continue to present the formula that is correct in general… 😉
                $endgroup$
                – Michael Kenzel
                Jan 7 at 10:00










              • $begingroup$
                @MichaelKenzel Actually, it will makes me feel better :) knowing it could be safely skipped. Because I am afraid there is sth beyond my knowledge happens under the hood. Thanks.
                $endgroup$
                – AlexWei
                Jan 7 at 11:46















              10












              $begingroup$

              If lighting with multiple lights, they add together to make the final lighting value. A negative light would darken other lights, which is incorrect. This is also true if you add in specular reflections, emissive lighting, or other sources of lighting. The negative lighting from one source of lighting would darken some other source of non negative lighting.






              share|improve this answer









              $endgroup$












              • $begingroup$
                If only one direction light is taken into account, no further processing such as half-lambert, is there any need to use the max func?
                $endgroup$
                – AlexWei
                Jan 7 at 7:54






              • 3




                $begingroup$
                If your application does indeed not rely on this value not being negative (only a single light source, just rendering straight to a color target in a way that will lead to the output being clamped to black anyways, etc.) then, by all means, go ahead and skip the max() if it makes you feel better. But do so, knowing that this will merely produce a result indistinguishable from the correct result in the most narrow circumstances and incorrect results in any other case. Meanwhile, any useful explanation of how shading works will continue to present the formula that is correct in general… 😉
                $endgroup$
                – Michael Kenzel
                Jan 7 at 10:00










              • $begingroup$
                @MichaelKenzel Actually, it will makes me feel better :) knowing it could be safely skipped. Because I am afraid there is sth beyond my knowledge happens under the hood. Thanks.
                $endgroup$
                – AlexWei
                Jan 7 at 11:46













              10












              10








              10





              $begingroup$

              If lighting with multiple lights, they add together to make the final lighting value. A negative light would darken other lights, which is incorrect. This is also true if you add in specular reflections, emissive lighting, or other sources of lighting. The negative lighting from one source of lighting would darken some other source of non negative lighting.






              share|improve this answer









              $endgroup$



              If lighting with multiple lights, they add together to make the final lighting value. A negative light would darken other lights, which is incorrect. This is also true if you add in specular reflections, emissive lighting, or other sources of lighting. The negative lighting from one source of lighting would darken some other source of non negative lighting.







              share|improve this answer












              share|improve this answer



              share|improve this answer










              answered Jan 7 at 7:13









              Alan WolfeAlan Wolfe

              4,85621249




              4,85621249











              • $begingroup$
                If only one direction light is taken into account, no further processing such as half-lambert, is there any need to use the max func?
                $endgroup$
                – AlexWei
                Jan 7 at 7:54






              • 3




                $begingroup$
                If your application does indeed not rely on this value not being negative (only a single light source, just rendering straight to a color target in a way that will lead to the output being clamped to black anyways, etc.) then, by all means, go ahead and skip the max() if it makes you feel better. But do so, knowing that this will merely produce a result indistinguishable from the correct result in the most narrow circumstances and incorrect results in any other case. Meanwhile, any useful explanation of how shading works will continue to present the formula that is correct in general… 😉
                $endgroup$
                – Michael Kenzel
                Jan 7 at 10:00










              • $begingroup$
                @MichaelKenzel Actually, it will makes me feel better :) knowing it could be safely skipped. Because I am afraid there is sth beyond my knowledge happens under the hood. Thanks.
                $endgroup$
                – AlexWei
                Jan 7 at 11:46
















              • $begingroup$
                If only one direction light is taken into account, no further processing such as half-lambert, is there any need to use the max func?
                $endgroup$
                – AlexWei
                Jan 7 at 7:54






              • 3




                $begingroup$
                If your application does indeed not rely on this value not being negative (only a single light source, just rendering straight to a color target in a way that will lead to the output being clamped to black anyways, etc.) then, by all means, go ahead and skip the max() if it makes you feel better. But do so, knowing that this will merely produce a result indistinguishable from the correct result in the most narrow circumstances and incorrect results in any other case. Meanwhile, any useful explanation of how shading works will continue to present the formula that is correct in general… 😉
                $endgroup$
                – Michael Kenzel
                Jan 7 at 10:00










              • $begingroup$
                @MichaelKenzel Actually, it will makes me feel better :) knowing it could be safely skipped. Because I am afraid there is sth beyond my knowledge happens under the hood. Thanks.
                $endgroup$
                – AlexWei
                Jan 7 at 11:46















              $begingroup$
              If only one direction light is taken into account, no further processing such as half-lambert, is there any need to use the max func?
              $endgroup$
              – AlexWei
              Jan 7 at 7:54




              $begingroup$
              If only one direction light is taken into account, no further processing such as half-lambert, is there any need to use the max func?
              $endgroup$
              – AlexWei
              Jan 7 at 7:54




              3




              3




              $begingroup$
              If your application does indeed not rely on this value not being negative (only a single light source, just rendering straight to a color target in a way that will lead to the output being clamped to black anyways, etc.) then, by all means, go ahead and skip the max() if it makes you feel better. But do so, knowing that this will merely produce a result indistinguishable from the correct result in the most narrow circumstances and incorrect results in any other case. Meanwhile, any useful explanation of how shading works will continue to present the formula that is correct in general… 😉
              $endgroup$
              – Michael Kenzel
              Jan 7 at 10:00




              $begingroup$
              If your application does indeed not rely on this value not being negative (only a single light source, just rendering straight to a color target in a way that will lead to the output being clamped to black anyways, etc.) then, by all means, go ahead and skip the max() if it makes you feel better. But do so, knowing that this will merely produce a result indistinguishable from the correct result in the most narrow circumstances and incorrect results in any other case. Meanwhile, any useful explanation of how shading works will continue to present the formula that is correct in general… 😉
              $endgroup$
              – Michael Kenzel
              Jan 7 at 10:00












              $begingroup$
              @MichaelKenzel Actually, it will makes me feel better :) knowing it could be safely skipped. Because I am afraid there is sth beyond my knowledge happens under the hood. Thanks.
              $endgroup$
              – AlexWei
              Jan 7 at 11:46




              $begingroup$
              @MichaelKenzel Actually, it will makes me feel better :) knowing it could be safely skipped. Because I am afraid there is sth beyond my knowledge happens under the hood. Thanks.
              $endgroup$
              – AlexWei
              Jan 7 at 11:46











              2












              $begingroup$

              Because negative shading values are undefined and don't play well with tonemapping. It is preferable to use values in $[0,1]$ for low-dynamic-range or $[0,+infty)$ for high-dynamic-range images.






              share|improve this answer









              $endgroup$

















                2












                $begingroup$

                Because negative shading values are undefined and don't play well with tonemapping. It is preferable to use values in $[0,1]$ for low-dynamic-range or $[0,+infty)$ for high-dynamic-range images.






                share|improve this answer









                $endgroup$















                  2












                  2








                  2





                  $begingroup$

                  Because negative shading values are undefined and don't play well with tonemapping. It is preferable to use values in $[0,1]$ for low-dynamic-range or $[0,+infty)$ for high-dynamic-range images.






                  share|improve this answer









                  $endgroup$



                  Because negative shading values are undefined and don't play well with tonemapping. It is preferable to use values in $[0,1]$ for low-dynamic-range or $[0,+infty)$ for high-dynamic-range images.







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Jan 7 at 6:30









                  HubbleHubble

                  1515




                  1515





















                      2












                      $begingroup$

                      $N cdot L < 0$ implies that the light is directed in the direction opposite the normal to the visible surface of the polygon. This means that the light is coming from behind and striking the back face of the polygon. In the analogous situation in real life, light striking one face of an opaque surface does not affect the illumination of a second face. Shining light on the back of a book (or other opaque object) does make the front of the book darker (that is it does not apply negative lighting): it simply has no effect on the front face of the book. This is the reason for the max() function.



                      Applying negative illumination to a surface where $N cdot L < 0$ doesn't make sense physically. In geometric optics with incoherent light sources there is no such thing as negative illumination.






                      share|improve this answer









                      $endgroup$

















                        2












                        $begingroup$

                        $N cdot L < 0$ implies that the light is directed in the direction opposite the normal to the visible surface of the polygon. This means that the light is coming from behind and striking the back face of the polygon. In the analogous situation in real life, light striking one face of an opaque surface does not affect the illumination of a second face. Shining light on the back of a book (or other opaque object) does make the front of the book darker (that is it does not apply negative lighting): it simply has no effect on the front face of the book. This is the reason for the max() function.



                        Applying negative illumination to a surface where $N cdot L < 0$ doesn't make sense physically. In geometric optics with incoherent light sources there is no such thing as negative illumination.






                        share|improve this answer









                        $endgroup$















                          2












                          2








                          2





                          $begingroup$

                          $N cdot L < 0$ implies that the light is directed in the direction opposite the normal to the visible surface of the polygon. This means that the light is coming from behind and striking the back face of the polygon. In the analogous situation in real life, light striking one face of an opaque surface does not affect the illumination of a second face. Shining light on the back of a book (or other opaque object) does make the front of the book darker (that is it does not apply negative lighting): it simply has no effect on the front face of the book. This is the reason for the max() function.



                          Applying negative illumination to a surface where $N cdot L < 0$ doesn't make sense physically. In geometric optics with incoherent light sources there is no such thing as negative illumination.






                          share|improve this answer









                          $endgroup$



                          $N cdot L < 0$ implies that the light is directed in the direction opposite the normal to the visible surface of the polygon. This means that the light is coming from behind and striking the back face of the polygon. In the analogous situation in real life, light striking one face of an opaque surface does not affect the illumination of a second face. Shining light on the back of a book (or other opaque object) does make the front of the book darker (that is it does not apply negative lighting): it simply has no effect on the front face of the book. This is the reason for the max() function.



                          Applying negative illumination to a surface where $N cdot L < 0$ doesn't make sense physically. In geometric optics with incoherent light sources there is no such thing as negative illumination.







                          share|improve this answer












                          share|improve this answer



                          share|improve this answer










                          answered Jan 7 at 16:59









                          WaterMoleculeWaterMolecule

                          1212




                          1212



























                              draft saved

                              draft discarded
















































                              Thanks for contributing an answer to Computer Graphics Stack Exchange!


                              • Please be sure to answer the question. Provide details and share your research!

                              But avoid


                              • Asking for help, clarification, or responding to other answers.

                              • Making statements based on opinion; back them up with references or personal experience.

                              Use MathJax to format equations. MathJax reference.


                              To learn more, see our tips on writing great answers.




                              draft saved


                              draft discarded














                              StackExchange.ready(
                              function ()
                              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcomputergraphics.stackexchange.com%2fquestions%2f8451%2fwhy-diffuse-light-use-maxn-h-0-instead-of-just-letting-it-be-negative%23new-answer', 'question_page');

                              );

                              Post as a guest















                              Required, but never shown





















































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown

































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown






                              Popular posts from this blog

                              How to check contact read email or not when send email to Individual?

                              Displaying single band from multi-band raster using QGIS

                              How many registers does an x86_64 CPU actually have?