diff options
author | Aurélien Brooke <aurelien@bahiasoft.fr> | 2023-12-29 12:11:34 +0100 |
---|---|---|
committer | Aurélien Brooke <aurelien@bahiasoft.fr> | 2024-01-13 15:36:39 +0000 |
commit | 491e25e100f5eace863a6cab4b0fc5a508cae7bf (patch) | |
tree | a58ffba907bfc3c80331dade245a7e3f9c7fdbbf /src | |
parent | f7a3d25006ff2c7c966aacdcdd7214a2ea6221d8 (diff) |
Fix ambient color contribution in Phong shader
The ambient color is not visible if the diffuse color is black. The
ambientColor contribution is wrongly multiplied by diffuse.rgb instead
of ambient.rgb.
Fix the issue by adding ambientColor to the adsModel() function, and
multiplying it by ambient.rgb.
[ChangeLog][QPhongMaterial] Fix ambient color contribution
Fixes: QTBUG-77665
Fixes: QTBUG-120241
Pick-to: 6.7
Change-Id: I0a156eb61e0f57ff4c0d6755ff8fd750877bf33d
Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/extras/shaders/es2/phong.inc.frag | 12 | ||||
-rw-r--r-- | src/extras/shaders/es2/phong.inc.frag100 | 12 | ||||
-rw-r--r-- | src/extras/shaders/gl3/phong.inc.frag | 14 | ||||
-rw-r--r-- | src/extras/shaders/rhi/phong.inc.frag | 14 |
4 files changed, 34 insertions, 18 deletions
diff --git a/src/extras/shaders/es2/phong.inc.frag b/src/extras/shaders/es2/phong.inc.frag index a9d933e69..22fb5c2f6 100644 --- a/src/extras/shaders/es2/phong.inc.frag +++ b/src/extras/shaders/es2/phong.inc.frag @@ -4,8 +4,10 @@ #pragma include light.inc.frag void adsModel(const in FP vec3 vpos, const in FP vec3 vnormal, const in FP vec3 vview, const in FP float shininess, + out FP vec3 ambientColor, out FP vec3 diffuseColor, out FP vec3 specularColor) { + ambientColor = vec3(0.0); diffuseColor = vec3(0.0); specularColor = vec3(0.0); @@ -58,6 +60,7 @@ void adsModel(const in FP vec3 vpos, const in FP vec3 vnormal, const in FP vec3 specular = normFactor * pow( max( dot( r, vview ), 0.0 ), shininess ); } + ambientColor += att * light.intensity * 1.0 * light.color; diffuseColor += att * light.intensity * diffuse * light.color; specularColor += att * light.intensity * specular * light.color; } @@ -72,11 +75,12 @@ FP vec4 phongFunction(const in FP vec4 ambient, const in FP vec3 worldNormal) { // Calculate the lighting model, keeping the specular component separate - FP vec3 diffuseColor, specularColor; - adsModel(worldPosition, worldNormal, worldView, shininess, diffuseColor, specularColor); + FP vec3 ambientColor, diffuseColor, specularColor; + adsModel(worldPosition, worldNormal, worldView, shininess, ambientColor, diffuseColor, specularColor); - // Combine spec with ambient+diffuse for final fragment color - FP vec3 color = (ambient.rgb + diffuseColor) * diffuse.rgb + // Combine ambient, diffuse and specular components for final fragment color + FP vec3 color = ambientColor * ambient.rgb + + diffuseColor * diffuse.rgb + specularColor * specular.rgb; return vec4(color, diffuse.a); diff --git a/src/extras/shaders/es2/phong.inc.frag100 b/src/extras/shaders/es2/phong.inc.frag100 index 7d395dd4b..7b651f904 100644 --- a/src/extras/shaders/es2/phong.inc.frag100 +++ b/src/extras/shaders/es2/phong.inc.frag100 @@ -4,8 +4,10 @@ #pragma include light.inc.frag void adsModel(const in FP vec3 vpos, const in FP vec3 vnormal, const in FP vec3 vview, const in FP float shininess, + out FP vec3 ambientColor, out FP vec3 diffuseColor, out FP vec3 specularColor) { + ambientColor = vec3(0.0); diffuseColor = vec3(0.0); specularColor = vec3(0.0); @@ -75,6 +77,7 @@ void adsModel(const in FP vec3 vpos, const in FP vec3 vnormal, const in FP vec3 specular = normFactor * pow( max( dot( r, vview ), 0.0 ), shininess ); } + ambientColor += att * lights[1].intensity * 1.0 * lights[1].color; diffuseColor += att * lights[1].intensity * diffuse * lights[1].color; specularColor += att * specular; } @@ -88,11 +91,12 @@ FP vec4 phongFunction(const in FP vec4 ambient, const in FP vec3 worldNormal) { // Calculate the lighting model, keeping the specular component separate - FP vec3 diffuseColor, specularColor; - adsModel(worldPosition, worldNormal, worldView, shininess, diffuseColor, specularColor); + FP vec3 ambientColor, diffuseColor, specularColor; + adsModel(worldPosition, worldNormal, worldView, shininess, ambientColor, diffuseColor, specularColor); - // Combine spec with ambient+diffuse for final fragment color - FP vec3 color = (ambient.rgb + diffuseColor) * diffuse.rgb + // Combine ambient, diffuse and specular components for final fragment color + FP vec3 color = ambientColor * ambient.rgb + + diffuseColor * diffuse.rgb + specularColor * specular.rgb; return vec4(color, diffuse.a); diff --git a/src/extras/shaders/gl3/phong.inc.frag b/src/extras/shaders/gl3/phong.inc.frag index f2d1edd68..0bcd1dd1f 100644 --- a/src/extras/shaders/gl3/phong.inc.frag +++ b/src/extras/shaders/gl3/phong.inc.frag @@ -7,9 +7,11 @@ void adsModel(const in vec3 worldPos, const in vec3 worldNormal, const in vec3 worldView, const in float shininess, + out vec3 ambientColor, out vec3 diffuseColor, out vec3 specularColor) { + ambientColor = vec3(0.0); diffuseColor = vec3(0.0); specularColor = vec3(0.0); @@ -65,7 +67,8 @@ void adsModel(const in vec3 worldPos, specular = normFactor * pow(max(dot(r, worldView), 0.0), shininess); } - // Accumulate the diffuse and specular contributions + // Accumulate the ambient, diffuse and specular contributions + ambientColor += att * lights[i].intensity * 1.0 * lights[i].color; diffuseColor += att * lights[i].intensity * diffuse * lights[i].color; specularColor += att * lights[i].intensity * specular * lights[i].color; } @@ -80,11 +83,12 @@ vec4 phongFunction(const in vec4 ambient, const in vec3 worldNormal) { // Calculate the lighting model, keeping the specular component separate - vec3 diffuseColor, specularColor; - adsModel(worldPosition, worldNormal, worldView, shininess, diffuseColor, specularColor); + vec3 ambientColor, diffuseColor, specularColor; + adsModel(worldPosition, worldNormal, worldView, shininess, ambientColor, diffuseColor, specularColor); - // Combine spec with ambient+diffuse for final fragment color - vec3 color = (ambient.rgb + diffuseColor) * diffuse.rgb + // Combine ambient, diffuse and specular components for final fragment color + vec3 color = ambientColor * ambient.rgb + + diffuseColor * diffuse.rgb + specularColor * specular.rgb; return vec4(color, diffuse.a); diff --git a/src/extras/shaders/rhi/phong.inc.frag b/src/extras/shaders/rhi/phong.inc.frag index f2d1edd68..0bcd1dd1f 100644 --- a/src/extras/shaders/rhi/phong.inc.frag +++ b/src/extras/shaders/rhi/phong.inc.frag @@ -7,9 +7,11 @@ void adsModel(const in vec3 worldPos, const in vec3 worldNormal, const in vec3 worldView, const in float shininess, + out vec3 ambientColor, out vec3 diffuseColor, out vec3 specularColor) { + ambientColor = vec3(0.0); diffuseColor = vec3(0.0); specularColor = vec3(0.0); @@ -65,7 +67,8 @@ void adsModel(const in vec3 worldPos, specular = normFactor * pow(max(dot(r, worldView), 0.0), shininess); } - // Accumulate the diffuse and specular contributions + // Accumulate the ambient, diffuse and specular contributions + ambientColor += att * lights[i].intensity * 1.0 * lights[i].color; diffuseColor += att * lights[i].intensity * diffuse * lights[i].color; specularColor += att * lights[i].intensity * specular * lights[i].color; } @@ -80,11 +83,12 @@ vec4 phongFunction(const in vec4 ambient, const in vec3 worldNormal) { // Calculate the lighting model, keeping the specular component separate - vec3 diffuseColor, specularColor; - adsModel(worldPosition, worldNormal, worldView, shininess, diffuseColor, specularColor); + vec3 ambientColor, diffuseColor, specularColor; + adsModel(worldPosition, worldNormal, worldView, shininess, ambientColor, diffuseColor, specularColor); - // Combine spec with ambient+diffuse for final fragment color - vec3 color = (ambient.rgb + diffuseColor) * diffuse.rgb + // Combine ambient, diffuse and specular components for final fragment color + vec3 color = ambientColor * ambient.rgb + + diffuseColor * diffuse.rgb + specularColor * specular.rgb; return vec4(color, diffuse.a); |