Why Diffuse Light use max(N · H, 0) instead of just letting it be negative?
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
add a comment |
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
add a comment |
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
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
lighting cg
asked 2 days ago
AlexWeiAlexWei
1674
1674
add a comment |
add a comment |
3 Answers
3
active
oldest
votes
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.
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?
– AlexWei
2 days ago
3
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 themax()
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… 😉
– Michael Kenzel
2 days ago
@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.
– AlexWei
2 days ago
add a comment |
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.
add a comment |
$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.
New contributor
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
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?
– AlexWei
2 days ago
3
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 themax()
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… 😉
– Michael Kenzel
2 days ago
@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.
– AlexWei
2 days ago
add a comment |
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.
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?
– AlexWei
2 days ago
3
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 themax()
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… 😉
– Michael Kenzel
2 days ago
@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.
– AlexWei
2 days ago
add a comment |
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.
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.
answered 2 days ago
Alan WolfeAlan Wolfe
4,85121249
4,85121249
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?
– AlexWei
2 days ago
3
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 themax()
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… 😉
– Michael Kenzel
2 days ago
@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.
– AlexWei
2 days ago
add a comment |
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?
– AlexWei
2 days ago
3
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 themax()
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… 😉
– Michael Kenzel
2 days ago
@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.
– AlexWei
2 days ago
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?
– AlexWei
2 days ago
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?
– AlexWei
2 days ago
3
3
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… 😉– Michael Kenzel
2 days ago
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… 😉– Michael Kenzel
2 days ago
@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.
– AlexWei
2 days ago
@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.
– AlexWei
2 days ago
add a comment |
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.
add a comment |
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.
add a comment |
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.
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.
answered 2 days ago
HubbleHubble
1515
1515
add a comment |
add a comment |
$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.
New contributor
add a comment |
$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.
New contributor
add a comment |
$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.
New contributor
$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.
New contributor
New contributor
answered 2 days ago
WaterMoleculeWaterMolecule
1112
1112
New contributor
New contributor
add a comment |
add a comment |
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.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- 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.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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